@lucifer-m
golang php js html css

Как распредилить диапазон ip?

Добрый день. У меня есть диапазон ip, к примеру 127.0.0.1-127.0.225.224. У меня есть 4 машины (которые будут сканить диапазон) мне необходимо поделить этот диапазон на 4 части. Гуглил долго так не чего и не нашел(

На выходе у меня выйдет распределённый сканер портов. Конечно может быть и 2 машины, или вообще милион )
  • Вопрос задан
  • 348 просмотров
Решения вопроса 2
@lucifer-m Автор вопроса
golang php js html css
Спасибо Никита. Немного переделав ваш пример я получил то что хотел.
package main

import (
	"fmt"
	"net"
)

func inet_aton(ip string) (ip_int uint32) {
	ip_byte := net.ParseIP(ip).To4()
	for i := 0; i < len(ip_byte); i++ {
		ip_int |= uint32(ip_byte[i])
		if i < 3 {
			ip_int <<= 8
		}
	}
	return
}

func inet_ntoa(ip uint32) string {
	return fmt.Sprintf("%d.%d.%d.%d", byte(ip>>24), byte(ip>>16), byte(ip>>8),
		byte(ip))
}


func main() {
	ip0 := inet_aton("127.0.0.1")
	ip1 := inet_aton("127.225.225.224")
	
	
	diff := ip1 - ip0
	var parts uint32 = 30
	step := diff/parts 
	
	var ippps string = "0"
	for i := uint32(0); i < parts; i++ {
		//вместо принта шлю зону ботам
		if ippps != "0"{
			fmt.Println(ippps+"-"+inet_ntoa(ip0 + step*i))
		}
	        ippps = inet_ntoa(ip0 + step*i)
	}
	
}
Ответ написан
Комментировать
bitver
@bitver
Для IPv4 конвертируем строковые IP в числа, а дальше простая арифметика. Например,
play.golang.org/p/JlYJXZnUxl

Для IPv6 нет встроенного типа uint128, но я уверен, что в нэте можно найти реализацию или из "С" либы (такое уж точно найдётся) переписать для Go.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
fox_12
@fox_12
Расставляю биты, управляю заряженными частицами
Не знаю подробности вашей задачи, но я бы задачу решал как-то так:
на одной машине-мастере запускал бы генератор вроде (код на python):
>>> def get_ip():
...    for a in range(226):
...        for b in range(1,225):
...            ip = '127.0.{a}.{b}'.format(a=a, b=b)
...            yield ip
... 
>>> get_ip()
<generator object get_ip at 0x101d5ea50>
>>> my_ips = get_ip()

А машины-воркеры бы брали очередной адрес после отработки предыдущего как-то так:
>>> next(my_ips)
'127.0.0.1'
>>> next(my_ips)
'127.0.0.2'
>>> next(my_ips)
'127.0.0.3'
>>> next(my_ips)
'127.0.0.4'

И запускайте сканирование хоть на миллионе машин. Такое решение свободно масштабируется на любое количество машин, и равномерно нагружает все воркеры поровну.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы