@Konkase

Как пустить разные тип трафика по разным провайдерам?

Требуется маркировать нужный трафик в iptables и отправлять его на нужный шлюз.

сейчас всё работает через первый аплинк:
# traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
 1  192.168.210.1  0.220 ms  0.243 ms  0.234 ms
 2  192.168.105.101  20.163 ms  20.188 ms  20.224 ms
 3  192.168.66.131  1.653 ms  1.718 ms  2.050 ms
 4  193.106.112.21  8.025 ms  7.841 ms  8.005 ms
 5  216.239.47.145  8.984 ms 216.239.47.149  8.520 ms 216.239.47.151  8.927 ms
 6  8.8.8.8  9.259 ms  8.713 ms  9.580 ms

добавляю правила:
# ip ru a fwmark 1 tab 1077
# ip ro sh tab 1077
default via 192.168.110.129 dev eth1
# ip ru l
0:	from all lookup local 
32764:	from all fwmark 0x1 lookup 1077 
32765:	from 192.168.110.135 lookup 1077
32766:	from all lookup main 
32767:	from all lookup default
# iptables -A OUTPUT -t mangle -d 8.8.8.8 -j MARK --set-mark 0x1
# iptables -A POSTROUTING -t nat -d 8.8.8.8 -j SNAT --to-source 192.168.110.135
# traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
 1  192.168.110.129 (192.168.110.129)  1.771 ms  2.202 ms  4.950 ms
 2  * * *
 3  * * *
 4  * * *

и не работает. причём tcpdump ловит пакеты в обоих направлениях
# tcpdump -i eth1 icmp and host 8.8.8.8 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
17:18:29.578352 IP 192.168.110.135 > 8.8.8.8: ICMP echo request, id 4077, seq 1, length 64
17:18:29.586762 IP 8.8.8.8 > 192.168.110.135: ICMP echo reply, id 4077, seq 1, length 64


адреса реальные, просто законспирированные. других правил в iptables нет

куда посмотреть глядеть?
  • Вопрос задан
  • 555 просмотров
Решения вопроса 1
Правила выглядит правильно... Но такое поведение очень похоже на rp_filter.

Попробуйте его отключить:
sysctl net.ipv4.conf.default.rp_filter=0
sysctl net.ipv4.conf.all.rp_filter=0

UPD
Немного погрузился в эту ситуацию, тут есть фича. Если убрать SNAT, но при этом сделать ping 8.8.8.8 -I eth1, то при включенном rp_filter оно работает. Дело в том, что в таблицах роутинга у вас исходящий адрес для 8.8.8.8 из другой сети/интерфейса (т.к. есть дефолтовый или иной подходящий для 8.8.8.8 маршрут), поэтому любая программа (сокет), будь то ping или браузер, выберет дефолтовый нужный исходящий адрес по таблицам роутинга (но не по меткам там). А когда iptables маркирует, и пакет попадает в другой шлюз/интерфейс согласно метке, срабатывает rp_filter, ведь адрес источника не принадлежит сети на исходящем интерфейсе. Поэтому, если задача направить конкретные адреса в конкретный шлюз, то лучше создать много правил ip rule и не маркировать трафик, избавиться от SNAT. Если так нельзя, то да, отключать rp_filter.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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