Есть странное желание - иметь несколько сокетов, забинденных на одну и ту же src-ip:src-port пару. Только один из сокетов в listen и accept, все остальные в connect.
В чем с точки зрения TCP принципиальная невозможность этого?
Повторяю, не с точки зрения OS (и address already in use), а с точки зрения TCP.
На мой взгляд это ограничение только OS, так как established соединения всегда будут иметь разные src-ip:src-port <=> dst-ip:dst-port. Конфликтов быть не должно.
Хочется добиться прозрачного проксирования с помощью 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:
Вопрос заключается в том, как сделать так, чтобы tproxy не считал второе соединение(из приложения к Exim) первым коннектом на внешний адрес и не заворачивал его снова в Tproxy?