DIY DNAT – catch all TCP packets, not only SYN
flush ruleset table ip diy-dnat { chain prerouting { type filter hook prerouting priority mangle; iif eth0 tcp dport 80 notrack ip daddr set 10.1.1.1; iif eth0 tcp dport 1234 notrack ip daddr set 10.1.1.1; iif eth0 udp dport 1234 notrack ip daddr set 10.1.1.1; iif eth0 tcp dport 2201 notrack ip daddr set 10.1.1.1 tcp dport set 22; } }
DIY SNAT – catch all TCP packets, not only SYN – and spoof lbs' IP address (needed for both TCP and UDP)
flush ruleset table ip diy-snat-spoof { chain postrouting { type filter hook postrouting priority mangle; oif eth0 ip saddr 10.1.1.1/32 tcp sport 22 tcp sport set 2201 oif eth0 ip saddr 10.1.1.0/24 notrack ip saddr set 192.168.122.12 } }
we are just checking that SNAT+SPOOF works for now.
send some requests from workstation
curl -I 192.168.122.12 ssh 192.168.122.12 -l root -p 2201
sniff what is coming out as an answer on gw
tcpdump -ni eth0 not tcp port 22 04:33:25.450833 IP 192.168.122.12.80 > 192.168.122.1.44252: Flags [S.], seq 47328729, ack 2311807596, win 65160, options [mss 1460,sackOK,TS val 2345412055 ecr 3985664520,nop,wscale 5], length 0
==> so far so good, we now see 192.168.122.12 instead of 10.1.1.1, eventhough we’re on established TCP
on server
ncat -ulvp 1234 -e /bin/bash
on workstation
ncat -nvu 192.168.122.12 1234 echo test ok
==> works, we are spoofing 192.168.122.12 alright
on server
ncat -lvp 1234 -e /bin/bash
on workstation
ncat -nv 192.168.122.12 1234 echo test ok
==> works after enabling diy-dnat (diy-snat-spoof was not enough as we were getting RSTs)