Прежде всего, спасибо, что прочитали следующий вопрос.
У меня есть сценарий, (ipUDPspoof.rb), который является клиент-серверным скриптом в Ruby (вы выбираете параметр 1 как сервер, а 0 как клиент, при инициализации ... например "sudo ruby sandbox.rb 1" для инициализации сервера), который будет создавать и отправлять / получать пакеты RAW по протоколу UDP с разными IP-адресами (другой источник и другой адрес назначения).
Я протестировал этот сценарий локально, и он работает. Клиент отправляет пакеты UDP на сервер (с адресом назначения IP, отличным от адреса сервера). Сервер получает и отправляет пакет обратно клиенту (с назначением IP-адреса, отличным от клиента). Клиент получил пакет. =) (Обратите внимание! Что в скрипте .rb я делаю:
@ socket.setsockopt (Socket :: SOL_SOCKET, Socket :: SO_BINDTODEVICE, 'lo')
Однако, если я тестирую между машинами (в данном случае между двумя виртуальными машинами под управлением Ubuntu, используя VirtualBox), он НЕ РАБОТАЕТ :(
Обе виртуальные машины подключены к сети к адаптеру NAT (для доступа к внешней сети) и адаптеру только для хоста со следующей конфигурацией:
IPv4 Address: 192.169.56.1
IPvV4 Mask: 255.255.255.0
and the DHCP Server:
Server Address:192.168.56.100
Server Mask: 255.255.255.0
Lower addr: 192.168.56.101
Upper addr: 192.168.56.254
Итак, у нас есть следующая конфигурация:
VM1:
eth2 Link encap:Ethernet HWaddr 08:00:27:49:ed:67
inet addr:192.168.56.101 Bcast:192.168.56.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe49:ed67/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:218 errors:0 dropped:0 overruns:0 frame:0
TX packets:119 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:39517 (39.5 KB) TX bytes:18680 (18.6 KB)
VM2:
eth2 Link encap:Ethernet HWaddr 08:00:27:af:b7:49
inet addr:192.168.56.102 Bcast:192.168.56.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:feaf:b749/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:168 errors:0 dropped:0 overruns:0 frame:0
TX packets:131 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:29459 (29.4 KB) TX bytes:19725 (19.7 KB)
Итак, первое, что я делаю, это изменяю скрипт ruby:
@socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BINDTODEVICE, 'eth2')
Затем я (и я не знаю, правильно ли это) проверяю и меняю таблицу IP-маршрутов на это на обеих виртуальных машинах:
>>route --s
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.2.2 0.0.0.0 UG 0 0 0 eth0
10.0.2.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eth0
192.168.56.0 0.0.0.0 255.255.255.0 U 1 0 0 eth2
>>sudo route del default eth0
>>sudo route add default gw 192.168.56.1 eth2
>>route --s
0.0.0.0 192.168.56.1 0.0.0.0 UG 0 0 0 eth2
10.0.2.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eth0
192.168.56.0 0.0.0.0 255.255.255.0 U 1 0 0 eth2
В этом случае я определяю шлюз на 192.168.56.1
После прочтения множества блогов об IP-спуфинге / iptables / arptables и многом другом .. Я сделал сценарий (и применил его к обеим виртуальным машинам) для изменения некоторых переменных, параметров и правил, чтобы мои виртуальные машины принимали пакеты от неизвестных IP-адреса, а именно:
#Changing /proc/sys/net/ variables
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/ip_nonlocal_bind
echo 1 > /proc/sys/net/ipv4/ip_dynaddr
echo 1 > /proc/sys/net/ipv4/conf/all/forwarding
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/all/arp_filter
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_notify
echo 1 > /proc/sys/net/ipv4/conf/all/arp_accept
echo 0 > /proc/sys/net/ipv4/conf/all/bootp_relay
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
echo 1 > /proc/sys/net/ipv4/conf/eth2/forwarding
echo 0 > /proc/sys/net/ipv4/conf/eth2/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth2/arp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth2/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/eth2/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/eth2/arp_notify
echo 1 > /proc/sys/net/ipv4/conf/eth2/arp_accept
echo 0 > /proc/sys/net/ipv4/conf/eth2/bootp_relay
echo 1 > /proc/sys/net/ipv4/conf/eth2/log_martians
sudo echo 1 > /proc/sys/net/ipv4/conf/default/forwarding
sudo echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter
sudo echo 0 > /proc/sys/net/ipv4/conf/default/arp_filter
sudo echo 0 > /proc/sys/net/ipv4/conf/default/arp_announce
sudo echo 0 > /proc/sys/net/ipv4/conf/default/arp_ignore
sudo echo 1 > /proc/sys/net/ipv4/conf/default/arp_notify
sudo echo 1 > /proc/sys/net/ipv4/conf/default/arp_accept
sudo echo 0 > /proc/sys/net/ipv4/conf/default/bootp_relay
sudo echo 1 > /proc/sys/net/ipv4/conf/default/log_martians
#Ip tables
iptables -L -n -v
#Cleaning/Zeros/Flushing IP Tables:
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t filter -Z INPUT
iptables -t filter -Z OUTPUT
iptables -t filter -Z FORWARD
iptables -t nat -Z PREROUTING
iptables -t nat -Z POSTROUTING
iptables -t nat -Z OUTPUT
iptables -t mangle -Z INPUT
iptables -t mangle -Z OUTPUT
iptables -t mangle -Z FORWARD
#Setting Policies
#Table filter
iptables -t filter -P INPUT ACCEPT
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P FORWARD DROP
#Table nat
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
#Table mangle
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
#Chain's rules
#before routing
iptables -t raw -A PREROUTING -i eth2 -p udp -j ACCEPT
iptables -t mangle -A PREROUTING -i eth2 -p udp -j ACCEPT
iptables -t nat -A PREROUTING -p udp -i eth2 -j ACCEPT
#after routing decision
iptables -t mangle -A INPUT -p udp -j ACCEPT
iptables -A INPUT -m state --state NEW -j ACCEPT
iptables -A INPUT -p udp -i eth2 -j ACCEPT
iptables -A INPUT -j ACCEPT
#IT SHOULD BE IN LOCAL PROCESS IN THIS MOMENT!#
#OUTPUT
iptables -t raw -A OUTPUT -p udp -o eth2 -j ACCEPT
iptables -t mangle -A OUTPUT -p udp -o eth2 -j ACCEPT
iptables -t nat -A OUTPUT -p udp -o eth2 -j ACCEPT
iptables -A OUTPUT -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p udp -o eth2 -j ACCEPT
iptables -t mangle -A POSTROUTING -p udp -o eth2 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth2 -j ACCEPT
#DEBUGGING (to see in /var/log/kern.log)
modprobe ipt_LOG
iptables -t raw -A PREROUTING -p udp -j LOG --log-prefix "FW:RAW-PREROUTING->>>"
iptables -t nat -A PREROUTING -p udp -j LOG --log-prefix "FW:NAT-PREROUTING->>>"
iptables -A INPUT -p udp -j LOG --log-prefix "FW:INPUT>>>"
iptables -A OUTPUT -p udp -j LOG --log-prefix "FW:OUTPUT>>>"
iptables -t mangle -A POSTROUTING -p udp -j LOG --log-prefix "FW:MANGLE-POST:ROUTING->>>"
iptables -t raw -A OUTPUT -p udp -j LOG --log-prefix "FW:RAW-OUTPUT->>>"
iptables -t nat -A POSTROUTING -p udp -j LOG --log-prefix "FW:NAT-POST:ROUTING->>>"
#End
Я создал эти правила на основе потока пакетов в Netfilter и General Networking. грамм потока.
После анализа kernel.log , Я вижу, что пакеты отправляются от клиента к серверу, но ни один из них не поступает на сервер.
Сервер (kernel.log):
<Empty>
Клиент (kernel.log):
Feb 22 17:40:29 rnode1-VirtualBox kernel: [16884.120010] FW:RAW-OUTPUT->>>IN= OUT=eth2 SRC=192.168.33.120 DST=192.168.33.121 LEN=44 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF P$
Feb 22 17:40:29 rnode1-VirtualBox kernel: [16884.120026] FW:MANGLE-POST:ROUTING->>>IN= OUT=eth2 SRC=192.168.33.120 DST=192.168.33.121 LEN=44 TOS=0x00 PREC=0x00 TTL=64 $
Затем я использовал WireShark чтобы увидеть поток UDP-пакетов в устройстве (eth2), и я увидел, что клиент отправил запрос ARP (спрашивая кто это IP?) и сервер не отвечает.
Итак, я прочитал больше и выполнил следующие команды на обеих виртуальных машинах:
ifconfig eth2 promisc
ifconfig eth2 -arp
И не получается ... :(
Так,
> Am I doing something wrong and really stupid?
> Or
> Am I missing something around?
> Or
> Is VirtualBox's DHCP server (on Host-only adapter) blocking the packets?
> Or
> Is the problem before iptables?
> Or
> What I'm trying to do is impossible?
Заранее большое спасибо, я буду в долгу перед тем, кто может помочь в этой маленькой большой проблеме.
Гонсало
Попробуйте изменить «Host-Only Adapter» на этих виртуальных машинах на «Internal Network». Адаптер только для хоста позволяет виртуальной машине взаимодействовать только с самой хост-системой VirtualBox, в то время как «внутренняя сеть» разрешает обмен данными между виртуальными машинами.