![iptables(DNAT)使用“-dport”标志时出现“多个 -d 标志不允许错误”](https://linux22.com/image/588063/iptables%EF%BC%88DNAT%EF%BC%89%E4%BD%BF%E7%94%A8%E2%80%9C-dport%E2%80%9D%E6%A0%87%E5%BF%97%E6%97%B6%E5%87%BA%E7%8E%B0%E2%80%9C%E5%A4%9A%E4%B8%AA%20-d%20%E6%A0%87%E5%BF%97%E4%B8%8D%E5%85%81%E8%AE%B8%E9%94%99%E8%AF%AF%E2%80%9D.png)
我有一台主机,充当其他主机的网关。配置如下:eth0(192.168.1.3)通过路由器连接到互联网,eth1(172.16.2.50)通过交换机连接到内部网络。鉴于此,此主机还运行与 eth1 绑定并为内部网络提供服务的服务。我想将此服务扩展到外部世界,并试图操纵 iptables,以便任何通过 eth0 到达此主机并定向到 192.168.1.3:80 的请求都会发送到 172.16.2.50,互联网用户也可以使用该服务。
下面是我将主机设置为网关的 iptable 规则(这些规则运行良好):
sudo iptables -t nat -A POSTROUTING -s 172.16.2.0/16 -o eth0 -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE
sudo iptables -A FORWARD -s 172.16.2.0/16 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -d 172.16.2.0/16 -m state --state ESTABLISHED,RELATED -i eth0 -j ACCEPT
这些是我试图添加到 iptables 中以实现我的目的的规则:
sudo iptables -A INPUT -d 192.168.1.3 -p tcp -dport 80 -i eth0 -j ACCEPT
sudo iptables -t nat -A PREROUTING -d 192.168.1.3 -p tcp -dport 80 -j DNAT --to-destination 172.16.2.50:80
sudo iptables -t nat -A PREROUTING -s 172.16.2.50 -p tcp -sport 80 -j SNAT --to-source 192.168.1.3:80
sudo iptables -A FORWARD -d 192.168.1.3 -p tcp -dport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT
当我这样做时,我收到如下错误:“不允许使用多个 -d 标志”...有人能告诉我如何解决这个错误吗...并且我想要添加的条目是否可以达到我的目的?
谢谢!
答案1
正如@Vladimir 所说,您需要使用双破折号来书写--sport
和--dport
。使用单破折号会使-dport
iptables 混淆使用其他-d
选项。
为了规则的正确性,添加此规则就足以实现您的目标:
iptables -t nat -A PREROUTING -d 192.168.1.3 -p tcp --dport 80 -j DNAT --to-destination 172.16.2.50
假设您正在通过 IP 192.168.1.3(公有到私有的 NAT 在路由器中完成)接收来自互联网(来自您的路由器)的流量,那么这应该可以工作。
此外,您只需编写一次 RELATED/ESTABLISHED 规则,格式如下:
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
FORWARD
只允许所有相关/已建立的连接。这不应该是一个安全漏洞,因为您使用其他规则仅允许相关流量。
答案2
两个都- 运动和--dport参数前面需要有 2 个破折号,我猜这是导致您收到错误的原因。