Добрый день! Есть такая схемка:client -> proxy:5060 -> server:5060
Приложение клиента общается с proxy:tcp:5060. Прокси работает прозрачно, используя TPROXY (реализовано через haproxy), т.е. он берёт IP:PORT клиента, и при пересылке пакетов на server, подставляет их как SOURCE. Сервер видит, что отправитель пакетов - client, и отправляет пакеты на client:IP:PORT, НО cо своим адресом в поле SOURCE (server:tcp:5060), следовательно, клиент не сможет обработать эти сообщения, т.к. он ждёт ответа от proxy:tcp:5060. И поэтому я хочу научить сервер подставлять в поле SOURCE ip адрес proxy сервера (proxy:tcp:5060)
Добавляю правило:
# Generated by iptables-save v1.3.5 on Thu Nov 5 14:38:24 2015
*mangle
:PREROUTING ACCEPT [710363:567027885]
:INPUT ACCEPT [704372:566539955]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [753088:91182712]
:POSTROUTING ACCEPT [753309:91198200]
COMMIT
# Completed on Thu Nov 5 14:38:24 2015
# Generated by iptables-save v1.3.5 on Thu Nov 5 14:38:24 2015
*nat
:PREROUTING ACCEPT [24883:1646686]
:POSTROUTING ACCEPT [4320:257154]
:OUTPUT ACCEPT [4146:245907]
-A POSTROUTING -j SNAT --to-source 1.1.1.1
COMMIT
# Completed on Thu Nov 5 14:38:24 2015
# Generated by iptables-save v1.3.5 on Thu Nov 5 14:38:24 2015
*filter
:INPUT ACCEPT [2499922263:423836859984]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2652526754:403919398770]
COMMIT
# Completed on Thu Nov 5 14:38:24 2015
Проверяю, локальные пакеты натятся:
14:37:14.149450 IP 1.1.1.1 > 8.8.8.8: ICMP echo request, id 55064, seq 1, length 64
14:37:15.149680 IP 1.1.1.1 > 8.8.8.8: ICMP echo request, id 55064, seq 2, length 6
Но для приложения, сервер всё равно отвечает со своим адресом:
14:39:35.172003 IP 192.168.55.55.46390 > 192.168.100.246.sip: S 2735509705:2735509705(0) win 29200 <mss 1460,sackOK,timestamp 154932215 0,nop,wscale 7>
14:39:35.172142 IP 192.168.100.246.sip > 192.168.55.55.46390: S 2647903661:2647903661(0) ack 2735509706 win 5792 <mss 1460,sackOK,timestamp 3733232086 154932215,nop,wscale 7>
14:39:35.172689 IP 192.168.55.55.46390 > 192.168.100.246.sip: R 2735509706:2735509706(0) win 0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 0a:c3:4a:44:3e:bb brd ff:ff:ff:ff:ff:ff
inet 192.168.216.246/30 brd 192.168.106.247 scope global eth0
inet 192.168.110.159/32 scope global eth0
inet6 fe80::8c3:4aff:fe44:3ebb/64 scope link
valid_lft forever preferred_lft forever
Добавляю логирование для цепочки nat и не вижу чтобы пакеты попадали в POSTROUTING:
mangle PREROUTING: IN=eth0 OUT= SRC=192.168.55.55 DST=192.168.100.246 LEN=60 TOS=0x18 PREC=0xA0 TTL=61 ID=31487 DF PROTO=TCP SPT=48328 DPT=5060 WINDOW=29200 RES=0x00 SYN URGP=0
nat PREROUTING: IN=eth0 OUT= SRC=192.168.55.55 DST=192.168.100.246 LEN=60 TOS=0x18 PREC=0xA0 TTL=61 ID=31487 DF PROTO=TCP SPT=48328 DPT=5060 WINDOW=29200 RES=0x00 SYN URGP=0
mangle OUTPUT: IN= OUT=eth0 SRC=192.168.100.246 DST=192.168.55.55 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=5060 DPT=48328 WINDOW=5792 RES=0x00 ACK SYN URGP=0
mangle POSTROUTING: IN= OUT=eth0 SRC=192.168.100.246 DST=192.168.55.55 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=5060 DPT=48328 WINDOW=5792 RES=0x00 ACK SYN URGP=0
mangle PREROUTING: IN=eth0 OUT= SRC=192.168.55.55 DST=192.168.100.246 LEN=40 TOS=0x18 PREC=0xA0 TTL=63 ID=50715 DF PROTO=TCP SPT=48328 DPT=5060 WINDOW=0 RES=0x00 RST URGP=0
# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
# sysctl net.ipv4.conf.eth0.rp_filter
net.ipv4.conf.eth0.rp_filter = 0