Добрый день. Пишу конфиг фаервола (iptables) который будет балансировать трафик между тремя провайдерами и шейпить его.
Маршрутизация и классификация трафика осуществляется через маркировку nfmark, для меня это очень удобно. Также на этом сервере будет находиться прокси-сервер squid работающий в full-transparent (TPROXY) режиме.
В процессе обнаружилась очень странная особенность работы TPROXY:
в iptables я не могу отловить первый пакет в соединении, которое squid устанавливает с удаленным хостом.
Самая простая конфигурация, взятая из руководства http://wiki.squid-cache.org/Features/Tproxy4
$IPT -F -t mangle ; $IPT -F -t nat ; $IPT -F -t raw; $IPT -F -t filter;
$IPT -X DIVERT -t mangle ; $IPT -t mangle -N DIVERT;
ip rule del fwmark 1 table 100
ip route flush table 100
ip rule add 1 fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
echo 0 > /proc/sys/net/ipv4/conf/lo/rp_filter
echo 1 > /proc/sys/net/ipv4/ip_forward
$IPT -t mangle -A DIVERT -j MARK --set-mark 1
$IPT -t mangle -A DIVERT -j ACCEPT
$IPT -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
$IPT -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 3129
$IPT -A POSTROUTING -t mangle -p tcp ! --sport 22 -j LOG --log-prefix "POST "
$IPT -t nat -A POSTROUTING -s 192.168.5.48/28 -j SNAT --to-source 82.179.92.7
Делаю telnet 93.158.134.203 80:
Смотрим, что происходит с tproxy: (логирую все tcp пакеты кроме ssh)
IN= OUT=eth0 SRC=93.158.134.203 DST=192.168.5.49 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=80 DPT=54612 WINDOW=14480 RES=0x00 ACK SYN URGP=0
1! только один пакет, с флагами ACK,SYN который пришел в ответ на SYN пакет. Но мы его не видели. Как так может быть? куда он исчез.
Также пакета, подтверждающего (ACK) нет. Как так может быть?
При этом Tproxy работает как положено.. т.е. все пакеты проходят через сквид, в FORWARD их нет и вообще, все зашибись.
При выключенном же TPROXY все нормально. Пакеты есть как с одной стороны так и c другой:
IN= OUT=eth1 SRC=192.168.5.49 DST=93.158.134.203 LEN=60 TOS=0x00 PREC=0x00 TTL=62 ID=19276 DF PROTO=TCP SPT=54616 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0
IN= OUT=eth0 SRC=93.158.134.203 DST=192.168.5.49 LEN=52 TOS=0x00 PREC=0x00 TTL=57 ID=0 DF PROTO=TCP SPT=80 DPT=54616 WINDOW=14100 RES=0x00 ACK SYN URGP=0
IN= OUT=eth1 SRC=192.168.5.49 DST=93.158.134.203 LEN=40 TOS=0x00 PREC=0x00 TTL=62 ID=19277 DF PROTO=TCP SPT=54616 DPT=80 WINDOW=92 RES=0x00 ACK URGP=0
Я показал только начало соединения. Дальше пакеты в OUTPUT и POSTROUTING все же появляются, т.е. там есть пакеты как ЛОКАЛНЫЙ_ХОСТ <-> SQUID, так и SQUID <-> УДАЛЕННЫЙ ХОСТ, и порты клиентских сторон различаются, что говорит о двух установленных соединениях. т.е. все правильно.
Все бы ничего, но у меня 3 провайдера.. вопрос, каким образом настроить маршрутизацию в этом случае, если пакетов от сквида в интернет просто не видно.. Или куда же все таки они деваются, как их отловить..
[
О системе:
Linux 2.6.39 - самосборное,
squid 3.1.9 (--enable-linux-netfilter --enable-zph-qos)
iptables 1.4.11.1
ipset 6.9.1
]