![关于MASQUERADE和SNAT/DNAT的一点疑问](https://linux22.com/image/123760/%E5%85%B3%E4%BA%8EMASQUERADE%E5%92%8CSNAT%2FDNAT%E7%9A%84%E4%B8%80%E7%82%B9%E7%96%91%E9%97%AE.png)
我知道 SNAT 和 DNAT 是什么意思。我知道当我想配置本地网络服务器向互联网开放服务时,我应该使用:
- SNAT 帮助将来自本地网络服务器的数据包更改为路由器的地址。
- DNAT 帮助将来自互联网的数据包更改为服务器的本地网络 IP
但是当我们使用 MASQUERADE 共享网络时,我们不需要为这些来自互联网的数据包配置 DNAT。有些文章说MASQUERADE除了自动查找路由器的外部IP之外与SNAT相同。但是为什么MASQUERADE不需要DNAT配置呢?假设 MASUQERADE 可以为我们做这些事情,为什么当我们设置 DNAT 时 iptables 不会自动为我们设置 SNAT?
编辑
我只是有一个新问题。假设本地网络中的两个用户浏览同一个网页,并且他们打开的客户端端口是相同的。当网页服务器响应数据包给路由器时,路由器如何知道这些数据包属于哪个用户呢?
答案1
conntrack
SNAT 和 DNAT 都使用内核的连接跟踪 ( ) 工具对传入和传出数据包进行地址转换。因此,如果内核检测到反向数据包属于 NATed 连接,它将自动进行反向转换,无需特殊规则。
这就是为什么例如单个 SNAT 规则就足够了(尽管如果您有另一个方向的 DNAT 规则也没有什么坏处)。
是的,MASQUERADE 基本上是 SNAT,其地址取自接口。去引用man iptables-extensions
:
伪装相当于指定到数据包发出的接口的 IP 地址的映射,但也会导致接口关闭时忘记连接。
顺便说一句,我发现更容易记住 SNAT = 源 NAT(更改数据包的源地址)和 DNAT = 目标 NAT(更改数据包的目标地址)。
编辑
(通常,您应该将新问题作为单独的问题提出)。
netstat
仅显示本地计算机上运行的应用程序与其他主机之间的连接。它不显示内核连接跟踪,您可以在/proc
(例如/proc/net/nf_conntrack
)中找到有关此信息的信息以及conntrack
包中的其他实用程序。
网络层对“用户”一无所知。连接由源地址、源端口、目的地址和目的端口组成。这就是网络层所知道的全部内容。它通过替换源/目标地址以及用其他数字替换目标/源(即本地)端口号(如果该端口已在使用中)来执行 NAT(网络地址转换)。
因此,不同主机上具有相同端口(在其计算机上)但未进行 NAT 的两个用户将在 NAT 主机上获得不同的端口。同一台计算机上的两个用户首先总是会使用不同的本地端口,因此这永远不会成为问题。如果一个用户同时打开两个连接,情况也是如此。