Коллеги, разъясните пожалуйста, что может происходить?
Есть 2 устройства (условно, D63 и D64) - на каждом по одному 1G интерфейсу в общую сеть и по одному 10G интерфейсу, друг на друга. Схема примерно такая:
D64 D63
<=1G=> | eth0 : 172.17.5.202/22 | | eth1 : 172.17.0.2/16 | <=1G=>
| | | |
| eth3 : 192.168.100.64/24 | <=10G=> | eth11 : 192.168.100.63/24 |
| / | | |
| (tun00e...tun07e) |
| / |
| ping 172.17.0.2 |
# ip route show dev eth3
172.17.0.0/16 scope link
192.168.100.0/24 proto kernel scope link src 192.168.100.64
На D64 запускается приложение, которое создаёт 8 (по числу процессоров) TUN-интерфейсов с именами (tun00e..tun07e) после чего происходит хитрая настройка фильтра пакетов так, чтобы локально генерируемый на D64 в сторону D63 (например, с использованием ping) трафик распределялся по tun-устройствам в соответствии с номером обрабатывающего пакет процессора. Пример настройки такой:
ip link set dev tun00e up
ip link ...
ip link set dev tun07e up
ip route add default dev tun00e table 100
ip route ...
ip route add default dev tun07e table 107
ip rule add fwmark 100 table 100
ip rule ...
ip rule add fwmark 107 table 107
iptables -t mangle -A OUTPUT -o eth3 -m cpu --cpu 0 -j MARK --set-mark 100
iptables ...
iptables -t mangle -A OUTPUT -o eth3 -m cpu --cpu 7 -j MARK --set-mark 107
На каждом из tun-устройств сидит поток приложения, который вычитывает оттуда IP-пакет и, далее, инкапсулирует его в UDP-датаграмму (sport:10000, dport=10000, checksum=0) с добавлением нового IP заголовка (saddr:192.168.100.64, daddr:192.168.100.63). После чего заталкивает полученный пакет обратно в стек через это же устройство.
Вот что далее запускается на D64:
ip route add 172.17.0.2/16 dev eth3
ping 172.17.0.2
ПРОБЛЕМА в том, что данные через eth3 НЕ ХОДЯТ.
С использованием tcpdump видно, что данные через tun-устройства идут. Более того, tcpdump подтверждает корректность построения новой IP-датаграммы.
Ниже приведу вывод статистики по iptables, из которой видно, что ICMP-пакеты проходят по цепочкам: OUTPUT и POSTROUTING, попадая, очевидно, на tun-устройство. Далее, видно также, что из tun-устройства выходят необходимые UDP-пакеты — цепочка PREROUTING. Но почему-то, далее эти пакеты не идут.
# iptables -t mangle -L -vn
Chain PREROUTING (policy ACCEPT 18685 packets, 1904K bytes)
pkts bytes target prot opt in out source destination
4278 479K udp -- * * 0.0.0.0/0 0.0.0.0/0 udp spt:10000
0 0 icmp -- * * 0.0.0.0/0 0.0.0.0/0
Chain INPUT (policy ACCEPT 14997 packets, 1480K bytes)
pkts bytes target prot opt in out source destination
0 0 udp -- * * 0.0.0.0/0 0.0.0.0/0 udp spt:10000
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 udp -- * * 0.0.0.0/0 0.0.0.0/0 udp spt:10000
0 0 icmp -- * * 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 5644 packets, 772K bytes)
pkts bytes target prot opt in out source destination
650 54600 MARK all -- * eth3 0.0.0.0/0 0.0.0.0/0 cpu 0 MARK set 0x64
...
615 51660 MARK all -- * eth3 0.0.0.0/0 0.0.0.0/0 cpu 7 MARK set 0x6b
3465 291K icmp -- * * 0.0.0.0/0 0.0.0.0/0
Chain POSTROUTING (policy ACCEPT 5644 packets, 772K bytes)
pkts bytes target prot opt in out source destination
0 0 udp -- * * 0.0.0.0/0 0.0.0.0/0 udp spt:10000
3449 290K icmp -- * * 0.0.0.0/0 0.0.0.0/0
Что смотреть, куда копать? ;)
P.S.
net.ipv4.ip_forward = 1