DITG (ITGSend, ITGRecv) через два сетевых интерфейса одной машины
У меня есть сервер, на котором должны быть выполнены тесты передачи. Этот сервер имеет 3 сетевых интерфейса (172.16.10.205 для SSH, 10.0.4.105 для отправки, 10.0.8.105 для приема)
to satellite from satellite
/\ \/
/\ \/
|-----------| |-------------|
| Modulator | | Demodulator |
|-----------| |-------------|
10.0.4.244 10.0.8.27
\ /
\ /
(eno7) 10.0.4.105 10.0.8.105 (eno8)
|------------|
| Server |
|------------|
172.16.10.205 (eno1)
На сервере я настроил следующие правила, маршруты:
# ip rule
100: from 10.0.8.105 to 10.0.8.105 lookup 250
30000: from all lookup local
32766: from all lookup main
32767: from all lookup default
# ip route show table 250
default via 10.0.4.244 dev eno7
10.0.8.105 via 10.0.4.244 dev eno7
Я начал ITGSend
Поток на Модулятор:
ITGSend -a 10.0.8.105 -Sda 172.16.10.205 -c 600 -C 20 -t 2000 -poll
и получать ITGRecv
поток из демодулятора:
ITGRecv -l itgrecv_kkr.log -q 1 -a 10.0.8.105 -i eno8
На tcpdump
это выглядит довольно хорошо...
# tcpdump -i eno8 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eno8, link-type EN10MB (Ethernet), capture size 262144 bytes
10:34:32.538165 ARP, Request who-has 10.0.8.105 tell 10.0.8.27, length 46
10:34:32.538190 ARP, Reply 10.0.8.105 is-at 00:25:90:5d:df:ad, length 28
10:34:32.538276 IP 10.0.8.105.60367 > 10.0.8.105.8999: UDP, length 600
10:34:32.588162 IP 10.0.8.105.60367 > 10.0.8.105.8999: UDP, length 600
10:34:32.637465 IP 10.0.8.105.60367 > 10.0.8.105.8999: UDP, length 600
..но по какой-то причине, ITGRecv
не получает данных...
ОБНОВЛЕНИЕ: я попробовал второй вариант использования, чтобы гарантировать, что входящие данные не обрабатываются данным правилом:
1) Я должен создать правило для local
Правило, которое обрабатывает локальные интерфейсы (сделано local
=30000 и новое правило = 100):
ip rule del from all lookup local
ip rule add from all lookup local pref 30000
ip rule add from all fwmark 0x1 lookup 250 pref 100
2) Это новое правило отправляет пакеты только в таблицу маршрутизации 250, когда MARK установлен в 1. Это делается с помощью iptables
- путем маркировки всех исходящих пакетов на данный IP-адрес:
iptables -A OUTPUT -t mangle -p all -d 10.0.8.105 -j MARK --set-mark 1
3) На последнем шаге я создаю маршрут, который перенаправляет все (помеченные) пакеты на устройство модулятора:
ip route add default via 10.0.4.244 dev eno7 table 250
Но все равно безуспешно - посылки приходят eno8
правильно, но iperf -s
не получает их.
1 ответ
Согласно ip-sysctl.txt ядро сбрасывает пакеты, которые приходят с локального интерфейса. Отключение этой опции позволит отправлять с INTERFACE1 на INTERFACE2 тех же пакетов хоста:
accept_local - BOOLEAN
Accept packets with local source addresses. In combination with
suitable routing, this can be used to direct packets between two
local interfaces over the wire and have them accepted properly.
default FALSE