首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NAT反射(NAT回环)是如何工作的?

NAT反射(NAT回环)是如何工作的?
EN

Unix & Linux用户
提问于 2016-05-09 16:53:53
回答 2查看 23.6K关注 0票数 12

我使用来自OpenWRT的自动生成规则作为NAT反射(NAT回环)的一个例子。

让我们假设有两个主机(+路由器)的网络192.168.1.0/24 : 192.168.1.100和192.168.1.200。路由器有两个接口局域网(br- LAN )和广域网(eth0).LAN接口具有IP 192.168.1.1,WAN接口具有IP 82.120.11.22 (public)。192.168.1.200上有一个www服务器。我们希望使用公共IP地址从192.168.1.100连接到web服务器。

如果您想重定向WAN->LAN,以便来自互联网的用户可以访问web服务器,您将向iptables添加以下规则:

代码语言:javascript
复制
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.200:80

我知道这些规则意味着什么。但是还有另外两条规则,它们对NAT反射负责。其中一个对我来说不像上面的那个那么清楚。第一条规则是这样的:

代码语言:javascript
复制
iptables -t nat -A PREROUTING -i br-lan -s 192.168.1.0/24 -d 82.120.11.22/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.200

这意味着,从192.168.1.0/24网络发送到公共IP到端口80的所有流量都应该发送到本地web服务器,这意味着我在firefox中输入公共IP,我应该得到服务器返回的页面,对吗?filter表中的所有其他转发魔术都已经完成,但我仍然无法使用公共IP连接到web服务器。这个包符合规则,但什么也没发生。

为了使整个机制正常工作,我们需要另一个nat规则:

代码语言:javascript
复制
iptables -t nat -A POSTROUTING -o br-lan -s 192.168.1.0/24 -d 192.168.1.200/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.1.1

我不知道为什么需要这条规则。有人能解释一下这条规则到底是干什么的吗?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2016-05-09 17:49:29

要使NAT正常工作,从客户端到服务器的数据包和从服务器到客户端的数据包都必须通过NAT。

注意,iptables中的NAT表仅用于连接的第一个数据包。随后,使用在第一个数据包被翻译时建立的内部映射表来处理与连接相关的包。

代码语言:javascript
复制
iptables -t nat -A PREROUTING -i br-lan -s 192.168.1.0/24 -d 82.120.11.22/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.200

只要有了这条规则,就会发生以下情况。

  • 客户端创建初始数据包(tcp syn)并将其发送给公共IP。客户端希望通过交换源ip/端口和目标ip/端口来获得对此数据包的响应。
  • 由于客户端在其路由表中没有特定的条目,所以它将其发送到默认网关。默认网关是NAT框。
  • NAT盒接收初始数据包,修改目标IP,建立映射表条目,在路由表中查找新的目的地,并将数据包发送到服务器。源地址保持不变。
  • 服务器接收初始数据包并完成响应(syn-ack)。在响应中,源IP/端口与目标IP/端口交换。由于传入数据包的源IP保持不变,应答的目标IP是客户端的IP。
  • 服务器在其路由表中查找IP并将数据包发送回客户端。
  • 客户端拒绝数据包,因为源地址与它所期望的不匹配。
代码语言:javascript
复制
iptables -t nat -A POSTROUTING -o br-lan -s 192.168.1.0/24 -d 192.168.1.200/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.1.1

一旦我们添加了这个规则,事件的顺序就会发生变化。

  • 客户端创建初始数据包(tcp syn)并将其发送给公共IP。客户端希望通过交换源ip/端口和目标ip/端口来获得对此数据包的响应。
  • 由于客户端在其路由表中没有特定的条目,所以它将其发送到默认网关。默认网关是NAT框。
  • NAT盒接收初始数据包,在NAT表中的条目之后,它修改目标IP、源IP和可能的源端口(只有在需要时才修改源端口以消除歧义),建立映射表条目,在其路由表中查找新的目的地,并将数据包发送到服务器。
  • 服务器接收初始数据包并完成响应(syn-ack)。在响应中,源IP/端口与目标IP/端口交换。由于传入数据包的源IP是由NAT框修改的,所以数据包的目标IP是NAT框的IP。
  • 服务器在其路由表中查找IP并将数据包发送回NAT框。
  • NAT框在NAT映射表中查找数据包的详细信息(源IP、源端口、目标IP、目标端口),并执行反向转换。这将将源IP更改为公共IP,将源端口更改为80,将目标IP更改为客户端的IP,将目标端口更改回客户端使用的任何源端口。
  • NAT框在其路由表中查找新的目标IP,并将数据包发送回客户端。
  • 客户端接受数据包。
  • 通信继续与NAT之间的数据包来回转换。
票数 24
EN

Unix & Linux用户

发布于 2016-05-09 17:14:47

这听起来似乎强制相反的流量也通过openwrt。通过重写see服务器将看到的源地址。

如果the服务器直接回复客户端,则这些数据包的源地址仍然是the服务器的源地址。但是客户端正在尝试与openwrt IP对话。因此,应答包将被丢弃。

在第一种情况下,您不需要这种强制执行,因为从don服务器到跨internet的客户端的路由已经通过openwrt框。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/282086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档