iptables(DNAT)使用“-dport”标志时出现“多个 -d 标志不允许错误”

iptables(DNAT)使用“-dport”标志时出现“多个 -d 标志不允许错误”

我有一台主机,充当其他主机的网关。配置如下: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。使用单破折号会使-dportiptables 混淆使用其他-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 个破折号,我猜这是导致您收到错误的原因。

相关内容