如何使用iptables制定IP转发规则

我有两个系统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的答案是你应该设置你的服务器的方式。