单就家用路由器来讲,现在很多家用路由器都提供了 DMZ 主机的功能
普通主机向 internet 发起一个连接,路由器会动态分配一个端口 x ,修改数据包的源为"公网 IP:x"并发送出去,当接收到发送给"公网 IP:x"的数据包时,路由器也会修改数据包的目的地址,把数据包交给发起连接的主机
但是当存在 DMZ 主机时,按照定义相当于做了一个全端口映射,那么当路由器收到发送给"公网 IP:x"的数据包时,它是将数据包交给 DMZ 主机,还是发起这个连接的普通主机呢?
1
jasontse 2017-04-09 11:37:28 +08:00 via iPad
DMZ 的优先级肯定低于 NAT 表,端口映射不能是无止境的,否则整个网络内就只有 DMZ 一台主机能上网。
|
2
Aliencn 2017-04-09 11:38:35 +08:00
|
3
linxy19957 OP @jasontse 原来如此,也就是说如果 NAT 刚好随机到了一个 DMZ 主机在监听的端口, DMZ 主机也是收不到数据的是吗?
|
4
KCheshireCat 2017-04-09 12:10:38 +08:00
其实就是 iptables 两个个模块 Masquerade 和 DNAT
对于由内向外发起的链接都经过 Masquerade 做了双向自动 DNAT 和 SNAT ,并且有连接追踪。 而 DMZ 之际上就是对所有外向内发起的连接都做了 DNAT 导向到一个内网机器。 两者并没有什么干扰。 |
5
linxy19957 OP @KCheshireCat 我的问题实际上就是我觉得两条 DNAT 会冲突
DMZ 会创建一条 DNAT 把发送到路由器公网 IP 数据包的目的地址修改为 DMZ 主机 Masquerade 也会创建一条 DNAT 把发送到路由器公网 IP "某个端口" 的数据包的目的地址改为 NAT 表中记录的主机地址和端口 那么一个发送到路由器公网 IP"某个端口"的数据包,适用哪条 DNAT 规则?如果它选择 Masquerade 创建的规则,是否意味着 DMZ 失效?或者它会区分从外向内的主动被动来选择 DNAT 规则,那对于 UDP 怎么办? |
6
JackyBao 2017-04-09 13:06:49 +08:00 via Android
从来不用 dmz 的飘过,感觉很不安全。
|
7
MFC 2017-04-09 13:19:53 +08:00
@linxy19957 嗯,我也一直有此疑惑,感觉 iptables 比 BSD 上的 pf 要复杂多了,有些地方很让人困惑。。。
|
8
xi_lin 2017-04-09 13:23:40 +08:00
关注一下,我也一直没搞懂。。
|
9
KCheshireCat 2017-04-09 13:50:10 +08:00 2
要知道这个你需要全面的去了解 iptables 原理
DNAT 是用来修改目的地 IP 和端口的,这回影响路由表的判断,使包流向不同出口。 而 Masquerade 是在路由表判断之后的,在将要离开 iptables 时判断数据包是不是需要做源地址 IP 伪装。 通常一个需要转发的数据包包通过 iptables 的顺序是 端口 -》 PREROUTING 链 -》 路由判断 -》 FORWARD 链 -》 POSTROUTING 链 -》 端口 PREROUTING 链有一个 NAT 表,而 DNAT 就只能设置在这个表里。 POSTROUTING 链也有一个 NAT 表,而 Masquerade 就只能设置在这个表里。 NAT 表这个表有一个特性就是只有一条连接的第一个包会经过这个表,因为经过一次这个表 iptables 就已经有这条连接路由的记录了,不需要重新路由。 所以当一个出站连接的反向数据包经过 iptables 的时候是会被自动路由的,不会经过这两条规则。 而一条入站的新连接的第一个包经过 iptables 的时候就会先进过 DNAT ,影响路由表的选择,然后经过 Masquerade 时,发现不需要伪装,就直接通过了,后续的包也不会经过这两条规则。 |
10
KCheshireCat 2017-04-09 13:52:32 +08:00
至于 UDP 流,对 iptables 来说,它是也是一条连接。
|
11
KCheshireCat 2017-04-09 13:55:20 +08:00
啊, iptables 实际上是 NAT 表里有 PREROUTING 链和 POSTROUTING 链。我表述有错误,但不影响理解。
|
12
linxy19957 OP @KCheshireCat @MFC @xi_lin
首先感谢 KCheshireCat 的回答,加上我又翻了一些资料,我的结论如下: Masquerade 实际上是"动态的"SNAT ,本质上和 SNAT 没什么区别。 iptables 里有一个 nf_conntrack (或者叫 ip_conntrack )模块来跟踪连接,它通过每条连接通信双方的 IP 和端口来区分,因此它可以区分 nat 和 DMZ 流量。当设置了 Masquerade ,局域网中某主机发起连接,第一个包命中 Masquerade 规则时, nf_conntrack 记录了这次连接,接下来属于这个连接的所有数据包(正反向)都由 nf_conntrack 处理而不会经过 iptables 的 nat 表。对于 DMZ ,由于是从外向内发起连接, nf_conntrack 一开始没有这条记录,于是由 iptables 接手处理,经过 PREROUTING 传给了 DMZ 主机,同时 nf_conntrack 也记录了这次连接并随后接管这条连接。 |