Initial project upload
This commit is contained in:
commit
90c5d5f943
|
|
@ -0,0 +1,24 @@
|
|||
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
||||
*.o
|
||||
*.a
|
||||
*.so
|
||||
|
||||
# Folders
|
||||
_obj
|
||||
_test
|
||||
|
||||
# Architecture specific extensions/prefixes
|
||||
*.[568vq]
|
||||
[568vq].out
|
||||
|
||||
*.cgo1.go
|
||||
*.cgo2.c
|
||||
_cgo_defun.c
|
||||
_cgo_gotypes.go
|
||||
_cgo_export.*
|
||||
|
||||
_testmain.go
|
||||
|
||||
*.exe
|
||||
*.test
|
||||
*.prof
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
# IPListget
|
||||
|
||||
IPListget is a network list downloader. It can download a network list from various sources and apply it at different targets. For example, it can download a list from openbl.org and put it in ipset list.
|
||||
|
||||
Below you will find the list of available sources and targets.
|
||||
|
||||
Sources:
|
||||
- antizapret - antizapret.info list of resources, blocked by Russian government
|
||||
- openbl - openbl.org blacklist of internet abusers
|
||||
- ipdeny - ipdeny.com country block lists
|
||||
- file - reads IPs from a file (one per line)
|
||||
- test - test source generating a list of 127.254.254.0/24 for test purposes
|
||||
|
||||
Targets:
|
||||
- ipset - inserts networks to ipset list
|
||||
- file - writes networks to a file (one per line)
|
||||
- stdout - prints a list to stdout
|
||||
|
||||
More sources and targets will be added in the future. The following goals are:
|
||||
- more sources of potentially dangerous and unwanted addresses, like tor proxys
|
||||
- targets for different network devices, like routers and firewalls, especially Cisco, Juniper and Mikrotik
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"net"
|
||||
"reflect"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var (
|
||||
Sources map[string]SourceModuleType //Available source modules storage
|
||||
)
|
||||
|
||||
type SourceModuleType interface {
|
||||
Get(url string) ([]net.IPNet, error)
|
||||
}
|
||||
|
||||
func init() {
|
||||
Sources = make(map[string]SourceModuleType)
|
||||
}
|
||||
|
||||
func RegisterSource(src SourceModuleType) {
|
||||
Sources[strings.ToLower(reflect.ValueOf(src).Type().Name())] = src
|
||||
}
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"net"
|
||||
"reflect"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var (
|
||||
Targets map[string]TargetModuleType //Available target modules storage
|
||||
)
|
||||
|
||||
type TargetModuleType interface {
|
||||
Set(destination string, iplist []net.IPNet) error
|
||||
}
|
||||
|
||||
func init() {
|
||||
Targets = make(map[string]TargetModuleType)
|
||||
}
|
||||
|
||||
func RegisterTarget(tgt TargetModuleType) {
|
||||
Targets[strings.ToLower(reflect.ValueOf(tgt).Type().Name())] = tgt
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
func FetchURL(url string) ([]byte, error) {
|
||||
resp, err := http.Get(url)
|
||||
if resp != nil {
|
||||
defer resp.Body.Close()
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
return nil, errors.New(fmt.Sprintf("Request failed, http status: %v", resp.StatusCode))
|
||||
}
|
||||
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return body, nil
|
||||
}
|
||||
|
||||
func URLReader(url string) (io.ReadCloser, error) {
|
||||
resp, err := http.Get(url)
|
||||
|
||||
if resp == nil {
|
||||
return nil, errors.New("Server returned empty response")
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
// Even on error response may be non-nil
|
||||
resp.Body.Close()
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
resp.Body.Close()
|
||||
return nil, errors.New(fmt.Sprintf("Request failed, http status: %v", resp.StatusCode))
|
||||
}
|
||||
|
||||
return resp.Body, nil
|
||||
}
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
// iplistget project main.go
|
||||
// Production build: go build -ldflags="-w" -o iplistget_release.exe iplistget
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"iplistget/common"
|
||||
_ "iplistget/sources"
|
||||
_ "iplistget/targets"
|
||||
"net"
|
||||
"os"
|
||||
)
|
||||
|
||||
const (
|
||||
APP_NAME = "iplistget network lists operator"
|
||||
VERSION = "0.1-dev"
|
||||
)
|
||||
|
||||
var (
|
||||
// Application flags
|
||||
showVersion bool // Show version and exit
|
||||
//sudo bool // Use sudo for privileged operations
|
||||
listmodules bool // List available sources
|
||||
source string // Module name to fetch the list
|
||||
target string // Module name to supply this list to (iproute, ipset, file, stdout)
|
||||
destination string // Optional parameter where to apply (routing table, ipset list, filename)
|
||||
sourceurl string // Override the default source url
|
||||
)
|
||||
|
||||
func init() {
|
||||
flag.BoolVar(&showVersion, "version", false, "Show version and exit")
|
||||
flag.BoolVar(&listmodules, "modules", false, "List all available modules and exit")
|
||||
flag.StringVar(&source, "source", "", "Use specified source module")
|
||||
flag.StringVar(&sourceurl, "url", "", "Override the default URL for source module")
|
||||
flag.StringVar(&target, "target", "", "Use specified target module")
|
||||
flag.StringVar(&destination, "destination", "", "Override the default destination (table name, list name, filename)")
|
||||
//flag.BoolVar(&sudo, "sudo", false, "Use sudo for privileged operations")
|
||||
}
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
|
||||
if showVersion {
|
||||
fmt.Printf("%s version %s\n", APP_NAME, VERSION)
|
||||
return
|
||||
}
|
||||
|
||||
if listmodules {
|
||||
lsmodules()
|
||||
return
|
||||
}
|
||||
|
||||
if source == "" {
|
||||
fmt.Println("No source module specified")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if target == "" {
|
||||
fmt.Println("No destination module provided")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
srcmod, srcok := common.Sources[source]
|
||||
if srcok != true {
|
||||
fmt.Printf("Error. No such source module `%v`!\n", source)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
tgtmod, tgtok := common.Targets[target]
|
||||
if tgtok != true {
|
||||
fmt.Printf("Error. No such target module `%v`!\n", target)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
var iplist []net.IPNet
|
||||
iplist, geterr := srcmod.Get(sourceurl)
|
||||
if geterr != nil {
|
||||
fmt.Printf("Error. Source module failed. %v\n", geterr)
|
||||
}
|
||||
|
||||
if err := tgtmod.Set(destination, iplist); err != nil {
|
||||
fmt.Printf("Error. Target module failed. %v\n", err)
|
||||
}
|
||||
}
|
||||
|
||||
func lsmodules() {
|
||||
fmt.Print("Available sources: ")
|
||||
for src := range common.Sources {
|
||||
fmt.Print(src, " ")
|
||||
}
|
||||
|
||||
fmt.Print("\nAvailable targets: ")
|
||||
for tgt := range common.Targets {
|
||||
fmt.Print(tgt, " ")
|
||||
}
|
||||
fmt.Println()
|
||||
}
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
package sources
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"io"
|
||||
"iplistget/common"
|
||||
"net"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func init() {
|
||||
common.RegisterSource(Antizapret{URL: "https://api.antizapret.info/group.php?data=ip"})
|
||||
}
|
||||
|
||||
type Antizapret struct {
|
||||
URL string
|
||||
}
|
||||
|
||||
func (s Antizapret) Get(url string) ([]net.IPNet, error) {
|
||||
if url != "" {
|
||||
s.URL = url
|
||||
}
|
||||
|
||||
data, err := common.FetchURL(s.URL)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ipmap := map[string]bool{}
|
||||
br := bytes.NewReader(data)
|
||||
reader := bufio.NewReader(br)
|
||||
|
||||
for {
|
||||
line, err := reader.ReadString('\n')
|
||||
ips := strings.Split(line, ",")
|
||||
|
||||
for ipk := range ips {
|
||||
// Add /32 prefix if no exist, then add to the map
|
||||
ip := strings.Trim(ips[ipk], "\n, ")
|
||||
if !strings.Contains(ip, "/") {
|
||||
ip += "/32"
|
||||
}
|
||||
ipmap[ip] = true
|
||||
}
|
||||
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
iplist := make([]net.IPNet, 0, len(ipmap))
|
||||
for key, _ := range ipmap {
|
||||
if _, ipnet, err := net.ParseCIDR(key); err == nil {
|
||||
iplist = append(iplist, *ipnet)
|
||||
}
|
||||
}
|
||||
|
||||
return iplist, nil
|
||||
}
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
package sources
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"iplistget/common"
|
||||
"net"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func init() {
|
||||
common.RegisterSource(File{FileName: "iplistget.txt"})
|
||||
}
|
||||
|
||||
type File struct {
|
||||
FileName string
|
||||
}
|
||||
|
||||
func (s File) Get(filename string) ([]net.IPNet, error) {
|
||||
if filename != "" {
|
||||
s.FileName = filename
|
||||
}
|
||||
|
||||
file, err := os.Open(s.FileName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
ipmap := map[string]bool{}
|
||||
|
||||
// TODO Provide custom split function for scanner to be universal
|
||||
scanner := bufio.NewScanner(file)
|
||||
for scanner.Scan() {
|
||||
ip := scanner.Text()
|
||||
if !strings.Contains(ip, "/") {
|
||||
ip += "/32"
|
||||
}
|
||||
ipmap[ip] = true
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
iplist := make([]net.IPNet, 0, len(ipmap))
|
||||
for key, _ := range ipmap {
|
||||
if _, ipnet, err := net.ParseCIDR(key); err == nil {
|
||||
iplist = append(iplist, *ipnet)
|
||||
}
|
||||
}
|
||||
|
||||
return iplist, nil
|
||||
}
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
package sources
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"errors"
|
||||
"iplistget/common"
|
||||
"net"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func init() {
|
||||
common.RegisterSource(IPDeny{})
|
||||
}
|
||||
|
||||
type IPDeny struct {
|
||||
URL string
|
||||
}
|
||||
|
||||
func (s IPDeny) Get(url string) ([]net.IPNet, error) {
|
||||
if url != "" {
|
||||
s.URL = url
|
||||
} else {
|
||||
return nil, errors.New("You have to provide a full URL to zone file for this source module, as it don't have a default one!")
|
||||
}
|
||||
|
||||
reader, err := common.URLReader(s.URL)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer reader.Close()
|
||||
|
||||
ipmap := map[string]bool{}
|
||||
|
||||
scanner := bufio.NewScanner(reader)
|
||||
for scanner.Scan() {
|
||||
ip := scanner.Text()
|
||||
if !strings.Contains(ip, "/") {
|
||||
ip += "/32"
|
||||
}
|
||||
ipmap[ip] = true
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
iplist := make([]net.IPNet, 0, len(ipmap))
|
||||
for key, _ := range ipmap {
|
||||
if _, ipnet, err := net.ParseCIDR(key); err == nil {
|
||||
iplist = append(iplist, *ipnet)
|
||||
}
|
||||
}
|
||||
|
||||
return iplist, nil
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
package sources
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"iplistget/common"
|
||||
"net"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func init() {
|
||||
common.RegisterSource(OpenBL{URL: "http://www.openbl.org/lists/base_7days.txt"})
|
||||
}
|
||||
|
||||
type OpenBL struct {
|
||||
URL string
|
||||
}
|
||||
|
||||
func (s OpenBL) Get(url string) ([]net.IPNet, error) {
|
||||
if url != "" {
|
||||
s.URL = url
|
||||
}
|
||||
|
||||
reader, err := common.URLReader(s.URL)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer reader.Close()
|
||||
|
||||
ipmap := map[string]bool{}
|
||||
|
||||
scanner := bufio.NewScanner(reader)
|
||||
for scanner.Scan() {
|
||||
ip := scanner.Text()
|
||||
if !strings.Contains(ip, "/") {
|
||||
ip += "/32"
|
||||
}
|
||||
ipmap[ip] = true
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
iplist := make([]net.IPNet, 0, len(ipmap))
|
||||
for key, _ := range ipmap {
|
||||
if _, ipnet, err := net.ParseCIDR(key); err == nil {
|
||||
iplist = append(iplist, *ipnet)
|
||||
}
|
||||
}
|
||||
|
||||
return iplist, nil
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
package sources
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"iplistget/common"
|
||||
"net"
|
||||
)
|
||||
|
||||
func init() {
|
||||
common.RegisterSource(Test{})
|
||||
}
|
||||
|
||||
type Test struct {
|
||||
}
|
||||
|
||||
func (s Test) Get(url string) ([]net.IPNet, error) {
|
||||
iplist := make([]net.IPNet, 0, 254)
|
||||
for i := 1; i < 255; i++ {
|
||||
_, ipnet, _ := net.ParseCIDR(fmt.Sprintf("127.255.255.%v/32", i))
|
||||
iplist = append(iplist, *ipnet)
|
||||
}
|
||||
|
||||
return iplist, nil
|
||||
}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
package targets
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"iplistget/common"
|
||||
"net"
|
||||
"os"
|
||||
)
|
||||
|
||||
func init() {
|
||||
common.RegisterTarget(File{FileName: "iplistget.txt"})
|
||||
}
|
||||
|
||||
type File struct {
|
||||
FileName string
|
||||
}
|
||||
|
||||
func (s File) Set(filename string, iplist []net.IPNet) error {
|
||||
if filename != "" {
|
||||
s.FileName = filename
|
||||
}
|
||||
|
||||
file, err := os.Create(s.FileName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
for ind := range iplist {
|
||||
if _, err := file.WriteString(fmt.Sprintln(iplist[ind].String())); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
package targets
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"iplistget/common"
|
||||
"net"
|
||||
"os"
|
||||
"os/exec"
|
||||
)
|
||||
|
||||
func init() {
|
||||
common.RegisterTarget(Ipset{Table: "iplistget"})
|
||||
}
|
||||
|
||||
type Ipset struct {
|
||||
Table string
|
||||
}
|
||||
|
||||
func (s Ipset) Set(table string, iplist []net.IPNet) error {
|
||||
if table != "" {
|
||||
s.Table = table
|
||||
}
|
||||
|
||||
tmpFile, err := ioutil.TempFile("", "iplistget-")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
defer os.Remove(tmpFile.Name())
|
||||
defer tmpFile.Close()
|
||||
|
||||
for key := range iplist {
|
||||
_, err := tmpFile.WriteString(fmt.Sprintf("add -exist %s %s\n", s.Table, iplist[key].String()))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
ipset := exec.Command("ipset", "restore", "-f", tmpFile.Name())
|
||||
if err := ipset.Run(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
package targets
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"iplistget/common"
|
||||
"net"
|
||||
)
|
||||
|
||||
func init() {
|
||||
common.RegisterTarget(Stdout{})
|
||||
}
|
||||
|
||||
type Stdout struct {
|
||||
}
|
||||
|
||||
func (s Stdout) Set(destination string, iplist []net.IPNet) error {
|
||||
for ind := range iplist {
|
||||
if _, err := fmt.Println(iplist[ind].String()); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Loading…
Reference in New Issue