У меня есть 3 системы Linux A, B и C. A является TCP-клиентом и отправляет сообщение на TCP-сервер на C. A может видеть только внешний IP-адрес B, который находится на интерфейсе wlan0, 192.168.0.3
------------------ --------------------- --------------------------
System A System B System C
192.168.0.5 wlan0 <-----> 192.168.0.3 wlan0
192.168.61.73 eth0 <---> 192.168.61.81 eth0
TCP Client TCP Server on 192.168.61.81
------------------ ---------------------- -------------------------
Клиент TCP отправляет сообщение на 192.168.0.3.
Это должно быть перенаправлено на TCP-сервер, работающий на 192.168.61.81 на порту 8036 системы C (через интерфейс eth0 системы B).
Поэтому я написал следующие правила таблицы IP, а затем я запускаю сервер на C и отправляю сообщение от TCP-клиента на A. Я вижу пакеты в системе B от A на wlan0, но они никогда не пересылаются. Система B, похоже, получает SYN-пакеты от A, но отбрасывает их (см. Журналы).
Вот что я сделал в системе B:
#Enable IP Forwarding for NAT
echo "1" > /proc/sys/net/ipv4/ip_forward
#Flush all iptable chains and start afresh
sudo iptables -F
#Forwarding rules
sudo iptables -A PREROUTING -p tcp -m tcp -d 192.168.0.3 --dport 8036 -j DNAT --to-destination 192.168.61.81:8036
sudo iptables -A FORWARD -m state -p tcp -d 192.168.61.81 --dport 8036 --state NEW,ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -p tcp -m tcp -s 192.168.61.81 --sport 8036 -j SNAT --to-source 192.168.0.3
#Enable logging
sudo iptables -A INPUT -j LOG --log-prefix INPUT
sudo iptables -A OUTPUT -j LOG --log-prefix OUTPUT
sudo iptables -A FORWARD -j LOG --log-prefix FORWARD
sudo iptables -A INPUT -j LOG --log-prefix 'drop:'
sudo iptables -A OUTPUT -j LOG --log-prefix 'drop:'
sudo iptables -A FORWARD -j LOG --log-prefix 'drop:'
tail -F /var/log/messages
May 2 11:53:17 my-laptop kernel: [42879.905449] FORWARDIN=wlan0 OUT=eth0 SRC=192.168.0.5 DST=192.168.61.81 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=30394 DF PROTO=TCP SPT=40582 DPT=8036 WINDOW=5840 RES=0x00 SYN URGP=0
May 2 11:53:17 my-laptop kernel: [42879.905459] drop:IN=wlan0 OUT=eth0 SRC=192.168.0.5 DST=192.168.61.81 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=30394 DF PROTO=TCP SPT=40582 DPT=8036 WINDOW=5840 RES=0x00 SYN URGP=0
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.61.0 * 255.255.255.0 U 0 0 0 eth0
default localhost 0.0.0.0 UG 0 0 0 eth0
Пожалуйста помоги.
ОБНОВЛЕНО:
sudo iptables -L -n -v
Chain INPUT (policy ACCEPT 39844 packets, 25M bytes)
pkts bytes target prot opt in out source destination
26926 10M LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4
12866 8559K LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4 prefix `INPUT'
12862 8558K LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4 prefix `drop:'
Chain FORWARD (policy ACCEPT 43 packets, 2580 bytes)
pkts bytes target prot opt in out source destination
79 4740 ACCEPT tcp -- * * 0.0.0.0/0 192.168.61.81 state NEW,RELATED,ESTABLISHED tcp dpt:8036
16 960 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4 prefix `FORWARD'
16 960 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4 prefix `drop:'
Chain OUTPUT (policy ACCEPT 36130 packets, 4943K bytes)
pkts bytes target prot opt in out source destination
27863 4093K LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4
14035 2296K LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4 prefix `OUTPUT'
14034 2296K LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4 prefix `drop:'
sudo iptables -t nat -L -n -v
Chain PREROUTING (policy ACCEPT 252 packets, 63782 bytes)
pkts bytes target prot opt in out source destination
8 480 DNAT tcp -- * * 0.0.0.0/0 192.168.0.3 tcp dpt:8036 to:192.168.61.81:8036
236 59206 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4
Chain OUTPUT (policy ACCEPT 3098 packets, 208K bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 3121 packets, 210K bytes)
pkts bytes target prot opt in out source destination
0 0 SNAT tcp -- * * 192.168.61.81 0.0.0.0/0 tcp spt:8036 to:192.168.0.3
2975 199K LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4
Странная конфигурация для простой конфигурации Я бы сказал, не нужно так много возиться с iptables, snat и так далее. После настройки B для IP-адресации должно было быть достаточно установить статические маршруты в A и C, чтобы достичь сетей друг друга через B. Или, если у вас уже были маршрутизаторы / шлюзы в локальных сетях, вы могли бы установить статический маршрут прямо в их (хотя и менее эффективно, поскольку пакеты связи будут делать еще 2 перехода - к маршрутизатору, а затем к B)
Я обнаружил, что мне пришлось установить gw по умолчанию в системе B и системе C как 192.168.0.3, в противном случае по умолчанию 192.168.0.1 (маршрутизатор WLAN) был установлен в качестве маршрута по умолчанию.
Как только я установил маршруты по умолчанию, все заработало как шарм :)