了解 iptables 中的 dnat 工作原理

了解 iptables 中的 dnat 工作原理

我正在运行 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        |
          +--------------------------------------------+

相关内容