Добрый день. Пишу конфиг фаервола (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
Смотрим, что происходит с 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
При этом 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
]