我知道 SNAT 和 DNAT 是什么意思。而且我知道当我想配置一个本地网络服务器开放服务到互联网时,我应该使用:
- SNAT 帮助将来自本地网络服务器的数据包更改为路由器的地址。
- DNAT 帮助将来自互联网的数据包更改为服务器的本地网络 IP
但是当我们使用 MASQUERADE 共享网络时,我们不需要为这些来自互联网的数据包配置 DNAT。有的文章说MASQUERADE和SNAT一样,除了自动查找路由器的外网ip。但是为什么MASQUERADE不需要DNAT配置呢?并且假设 MASUQERADE 可以为我们做这些事情,为什么我们设置 DNAT 时 iptables 不自动为我们设置 SNAT?
编辑
我只是有一个新问题。假设本地网络中的两个用户浏览同一个网页,并且他们打开的客户端端口是相同的。当网页服务器响应包给路由器时,路由器如何知道这些包属于哪个用户?
SNAT 和 DNAT 都使用
conntrack
内核的连接跟踪 ( ) 工具对传入和传出的包进行地址转换。因此,如果内核检测到反向的数据包属于经过 NAT 的连接,它会自动进行反向转换,而无需为其设置特殊规则。这就是为什么例如单个 SNAT 规则就足够了(尽管如果您有另一个方向的 DNAT 规则也没有什么坏处)。
是的,MASQUERADE 基本上是 SNAT,地址取自接口。引用
man iptables-extensions
:顺便说一句,我发现记住 SNAT = Source NAT(更改数据包的源地址)和 DNAT = Destination NAT(更改数据包的目标地址)更简单。
编辑
(通常,您应该将新问题作为单独的问题提出)。
netstat
仅显示在本地计算机上运行的应用程序与其他主机之间的连接。它不显示内核连接跟踪,您可以在/proc
(例如/proc/net/nf_conntrack
)中找到有关此信息的信息,以及包中的其他实用conntrack
程序。网络层对“用户”一无所知。连接由源地址、源端口、目的地址和目的端口组成。这就是网络层所知道的全部。它通过替换源/目标地址来执行 NAT(网络地址转换),并且如果该端口已在使用中,则还通过将目标/源(即本地)端口号替换为其他数字。
因此,不同主机上具有相同端口(在他们的机器上)但未经过 NAT 的两个用户将在 NATing 主机上获得不同的端口。同一台机器上的两个用户总是首先使用不同的本地端口,所以这从来都不是问题。如果一个用户同时打开两个连接,则相同。