LINUX.ORG.RU
ФорумAdmin

прозрачный прокси с tproxy

 tproxy iptabltes


1

2

Привет.

Хочется добиться прозрачного проксирования с помощью 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
Пакеты доходят до моего приложения на 26 порт, но дальше, при connect() - они не доходят снова на 25 порт Exim - в tcpdump SYN не видно. Проблема, видимо, возникает из-за того, что есть два сокета с одинаковыми src-tuple и dst-tuple:
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 -    
Вопрос заключается в том, как сделать так, чтобы tproxy не считал второе соединение(из приложения к Exim) первым коннектом на внешний адрес и не заворачивал его снова в Tproxy?



Последнее исправление: jopka3 (всего исправлений: 1)

После размышлений, пришел к выводу, что такое работать не может. После получения SYN с подделаным через IP_TRANSPARENT src-tuple, дальше после accept в Exim должен быть отправлен SYN/ACK на изначальный адрес. Во-первых тут не понятно что в сетевом стеке будет - возможно ядро уже увидит что такой сокет(а их два, один в Established, второй как раз в SynSent) уже Established и молча дропнет пакет. Во-вторых возможен вариант, что пакет уйдет к изначальному клиенту - но у него то сокет уже в Established он дропнет пакет(как дубликат) или пошлет RST - опять этот сокет не установит соединение.

Короче, работать не должно.

jopka3
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.