我有两个系统A和B. A是一个TCP客户端,并在B上向TCP服务器发送消息。
------------------ -------------------------- System A System B 192.168.0.5 wlan0 192.168.0.3 wlan0 127.0.0.1 lo 127.0.0.1 lo TCP Client <------------> TCP Server on 127.0.0.1 ------------------ ----------------------------
TCP客户端发送消息到192.168.0.3。
这应该被redirect到B的本地接口,因为TCP服务器在系统B的端口8000上的127.0.0.1上运行。
因此,我写了下面的IP表规则,但是我的B服务器没有收到任何消息。 哦,顺便说一句,这两个系统是Ubuntu的Linux系统。
这是我在系统B上做的:
#Enable IP Forwarding for NAT echo "1" > /proc/sys/net/ipv4/ip_forward #Flush all iptable chains and start afresh sudo iptables -F #Forward incoming packets on 192.168.0.3 at wlan0 interface to 127.0.0.1 sudo iptables -t nat -A PREROUTING -p tcp -i wlan0 -d 192.168.0.3 --dport 8000 -j DNAT --to 127.0.0.1:8000 #Explicitly allow incoming connections on port 8000 sudo iptables -A INPUT -i wlan0 -p tcp --dport 8000 -m state --state NEW,ESTABLISHED -j ACCEPT #Explicitly allow outgoing messages from port 8000 sudo iptables -A OUTPUT -o wlan0 -p tcp --sport 8000 -m state --state ESTABLISHED -j ACCEPT
然后我启动B上的服务器并从A上的TCP客户端发送消息。我可以在wlan0上的192.168.0.5上看到wireshark上的数据包,但是他们永远不会被转发:(
请帮忙。
更新:
经过这里的专家的input,我已经为应用转发规则做了一个更现实的“NAT”场景,但是我仍然遇到以下问题:我在我的新post中解释了这个: iptables:转发数据包不起作用
这是一个完全没有答案的答案。
正如Jens Bradler在他的评论中所说的,最简单的做法是将服务绑定到端口8000上的公共IP地址,而不是NAT连接。 你可以像这样通过iptables规则来保护对单个服务器A的访问;
-A INPUT -s 192.168.0.5/32 -p tcp -m tcp --dport 8000 -j ACCEPT -A INPUT -p tcp -m tcp --dport 8000 -j REJECT
汤姆H的无答案是更好的,但如果你不喜欢,这里是一个直接的答案:
对不起,当我可以修补,testing,检查,logging,重复…我没有你的系统玩,但我的iptables技能是最好的,但这里是我的build议无论如何。 你可能会需要使用日志进行debugging。
按照Jens Bradler的说法,改变redirect的方向:
echo "1" > /proc/sys/net/ipv4/ip_forward
certificate是对的
cat /proc/sys/net/ipv4/ip_forward
猫的输出:
1
也使用FORWARD表添加一个规则到ACCEPT。
sudo iptables -A FORWARD -i wlan0 -p tcp --dport 8000 -j ACCEPT
从传入的规则中删除“-m状态”的东西(可选…不必要的我认为):
sudo iptables -A INPUT -i wlan0 -p tcp --dport 8000 -j ACCEPT
可能在你添加“ESTABLISHED”的任何地方,你也应该有“RELATED”(不知道,但我认为一个返回数据包开始连接是相关的,但没有build立)。
sudo iptables -A OUTPUT -o wlan0 -p tcp --sport 8000 -m state --state RELATED,ESTABLISHED -j ACCEPT
FORWARD规则与上述接受相反,另一个FORWARD。 sudo iptables -A FORWARD -o wlan0 -p tcp -s 127.0.0.1 –sport 8000 -m状态–state RELATED,ESTABLISHED -j ACCEPT
而不是使用wireshark,使用-j LOG。
首先检查一下,是否还有LOG规则(默认的规则比以下更好…但你使用了flush;我的服务器会很难将你的服务器垃圾邮件):
sudo iptables --list --line-numbers -v sudo iptables -t nat --list --line-numbers -v
如果不是,则添加它们:
sudo iptables -A INPUT -j LOG sudo iptables -A OUTPUT -j LOG sudo iptables -A FORWARD -j LOG sudo iptables -t nat -A PREROUTING -j LOG
观看日志
tail -F /var/log/firewall # or if that file doesn't exist: tail -F /var/log/messages
您无法执行-j DNAT --to 127.0.0.1 。
127.0.0.1是一个超级特殊的地址; 它只会接受来自127.0.0.1的连接。
@汤姆H的答案是你应该设置你的服务器的方式。