Назад | Перейти на главную страницу

Может ли машина (физическая или виртуальная) принимать и обрабатывать UDP-пакеты с другим IP-адресом, поступающие от известного устройства?

Прежде всего, спасибо, что прочитали следующий вопрос.

У меня есть сценарий, (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, в то время как «внутренняя сеть» разрешает обмен данными между виртуальными машинами.