Привет.
Хочется добиться прозрачного проксирования с помощью Tproxy. Есть машина, на eth0 ip A.B.C.D. Есть приложение слушающее на A.B.C.D:port0. Есть приложение слушающиее на A.B.C.D:port1. С помощью Tproxy пакеты приходящие на A.B.C.D:port0 заворачиваются в A.B.C.D:port1. Далее, приложение, слушающее на A.B.C.D открывает сокет, делает setsockopt с IP_TRANSPARENT, делает bind с src-tuple сокета с A.B.C.D:port0 и делает коннект к A.B.C.D:port0. То есть в итоге, должна получиться схема, когда с помощью tproxy трафик заворачивается во второе приложение, там обрабатывается и проксируется снова в первое, с src ip и порт изначального коннекта. Чтобы было еще понятней - Exim cлушает на 25 порту. С помощью tproxy входящие коннекты заворачиваются на 26 порт (наша прокся), там происходит обработка и устанавливается коннект снова к Exim на 25 порт. Делается примерно так:
ip rule del fwmark 1 lookup 100
ip route del local 0.0.0.0/0 dev lo table 100
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t mangle -N DIVERT
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A DIVERT -j ACCEPT
iptables -t mangle -A PREROUTING -p tcp --dport 25 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 26
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev eth0 table 100
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 11951/nc
tcp 0 1 10.4.0.52:60951 10.3.0.234:25 SYN_SENT -
tcp 0 0 10.3.0.234:25 10.4.0.52:60951 ESTABLISHED -