我正在运行 3 个装有 Fedora 19 的虚拟机。机器 B 设置了两个网络适配器,并在机器 A 和机器 C 之间提供队列通道。
机器 A 的 IP 设置为192.168.1.3
,机器 C 的 IP 设置为172.16.1.1
。机器 BI 上有一个适配器的 IP 为192.168.1.254
,另一个适配器的 IP 为172.16.1.254
。
我必须在机器 B 上创建一条规则NAT表允许与机器 A 建立 SSH 连接,但使用机器 B 的外部 IP 地址。
我创建了这条规则(不知道这是否正确):
iptables -t nat -A PREROUTING -i p8p1 -s 172.16.1.1 -d 172.16.1.254 -p tcp --dport 22 -j DNAT --to-destination 192.168.1.3
如果我只这样做,如果我使用netcat
我无法连接到机器 A。现在,如果我插入这条规则:
iptables -A FORWARD -i p8p1 -o p7p1 -s 172.16.1.1 -d 192.168.1.3 -p tcp --dport 22 -j ACCEPT
我可以建立联系。
我的问题是:
插入第二条规则不会使得第一条规则变得不再必要吗?
答案1
第一条规则告诉内核对来自 172.16.1.1 的数据包进行 nat,将数据包转发到 172.16.1.254 的 22 端口,再转发到 192.168.1.3。
第二条规则告诉它允许来自 172.16.1.1 的数据包通过端口 22 到达 192.168.1.3。此规则在第一条规则处理数据包后应用,因此如果您的默认策略是拒绝转发的数据包,则这两条规则都是必需的。
描述该过程的 ASCII 艺术图:
Packet (src -> dst)
+-----------------------+--------------------+
machine C | 172.16.1.1 -> 172.16.1.254 |
+-----------------------+--------------------+
|
v
+---------------------p8p1-------------------+
| | |
|PREROUTING: 172.16.1.1 -> 192.168.1.3 (DNAT)|
machine B | | |
|FORWARD: ACCEPT |
| | |
+---------------------p7p1-------------------+
v
|
+-----------------------+--------------------+
machine A | 172.16.1.1 -> 192.168.1.3 |
+--------------------------------------------+