找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 10024|回复: 17

小白对OpenWrt防火墙IPv4 NAT环回 (NAT Loopback) 的一点学习理解

[复制链接]
发表于 2022-3-16 17:29 | 显示全部楼层 |阅读模式
本帖最后由 lgs2007m 于 2022-3-16 21:12 编辑

外网IPv4访问内网IPv4设备,需要在LuCI页面 防火墙->端口转发 设置端口转发。
单独设置端口转发(未启用NAT环回)会有NAT环回(NAT Loopback / Hairpin NAT / NAT Reflection)的问题:
内网设备通过wan口IP访问被端口转发的内网设备,因为访问数据是从区域lan进入的,不会匹配到从区域wan输入的端口转发规则,因此相当于访问wan口本身,所以访问不到被端口转发的内网设备。
LuCI页面添加端口转发是默认勾选启用NAT环回的,则防火墙除了添加端口转发还会添加一对SNAT(源地址转换)和DNAT(目的地址转换)规则来处理NAT环回的问题。

例如wan公网IP+端口是22.22.22.22:2222,设置端口转发给内网NAS+端口192.168.1.5:5555,协议tcp,
这样会在防火墙nat表添加3条规则(只在nat表添加,没有在filter表添加规则):
SSH登录或者TTYD终端登录使用命令 iptables-save | grep 5555 查看防火墙包含文本5555的规则
  1. *nat
  2. -A zone_lan_prerouting -s 192.168.1.0/24 -d 22.22.22.22/32 -p tcp -m tcp --dport 2222 -m comment --comment "!fw3: test (reflection)" -j DNAT --to-destination 192.168.1.5:5555
  3. -A zone_lan_postrouting -s 192.168.1.0/24 -d 192.168.1.5/32 -p tcp -m tcp --dport 5555 -m comment --comment "!fw3: test (reflection)" -j SNAT --to-source 192.168.1.1
  4. -A zone_wan_prerouting -p tcp -m tcp --dport 2222 -m comment --comment "!fw3: test" -j DNAT --to-destination 192.168.1.5:5555
复制代码


假设内网PC 192.168.1.3从内网访问NAS域名+2222,域名解析为22.22.22.22,即192.168.1.3:3333->22.22.22.22:2222,则PC需要得到22.22.22.22:2222->192.168.1.3:3333的回复数据包才能正常建立通信,否则会被PC丢弃。
下面来看这3条规则如何处理:

防火墙的一些知识可以去看我的另一篇帖子:
小白对OpenWrt防火墙基本设置的ip6tables IPv6规则的一点学习理解
https://www.right.com.cn/forum/thread-8183481-1-1.html

数据经过防火墙的流程:
--->PREROUTING------>[ROUTE]------->FORWARD---------->POSTROUTING------>
      raw                             |                  mangle        ^        mangle
      mangle                        |                   filter           |         nat
      nat                              |                                    |
                                        |                               [ROUTE]
                                        v                                    |
                                   INPUT  mangle                 OUTPUT  raw
                                        |       nat                        ^       mangle
                                        |       filter                       |        nat
                                        v ------------>local--------->|        filter


#----------------------------------------------------------------
# 首先内网PC访问NAS域名+2222,域名被解析为公网IP 22.22.22.22,因为不在同一网段,数据包会直接发给网关192.168.1.1,然后数据包从区域lan输入路由器防火墙,
# 数据包输入防火墙会查询连接跟踪表(conntrack table),没有就新建一条连接跟踪表条目(conntrack entry),
# 这个条目需要数据包出INPUT或者POSTROUTING链才最终确认生成,
# 在没有经过DNAT和SNAT的情况下,数据包从防火墙INPUT链输出后最终conntrack entry是这样的:
  1. cat /proc/net/nf_conntrack | grep 2222 #查看conntrack table
  2. ipv4     2 tcp      6 118 TIME_WAIT src=192.168.1.3 dst=22.22.22.22 sport=3333 dport=2222 packets=4 bytes=172 src=22.22.22.22 dst=192.168.1.3 sport=2222 dport=3333 packets=3 bytes=132 [ASSURED] mark=0 zone=0 use=2
复制代码

# 数据包会被当成访问wan口


#----------------------------------------------------------------
# 当添加了DNAT规则,数据包输入防火墙后先输入PREROUTING链,然后会匹配这条规则:
  1. -A zone_lan_prerouting -s 192.168.1.0/24 -d 22.22.22.22/32 -p tcp -m tcp --dport 2222 -m comment --comment "!fw3: test (reflection)" -j DNAT --to-destination 192.168.1.5:5555
复制代码

# 防火墙判定是从区域lan输入的,是内网192.168.1.0/24访问wan口地址22.22.22.22:2222的数据包,
# 则进行DNAT目的地址转换,修改目标地址和端口为192.168.1.5:5555,
# 经过DNAT后还会查询并修改对应的conntrack entry的后半部分源和目标的地址端口,
# 在没有SNAT的情况下,数据包从防火墙POSTROUTING链输出后最终conntrack entry是这样的:
  1. cat /proc/net/nf_conntrack | grep 5555 #查看conntrack table
  2. ipv4     2 tcp      6 113 SYN_SENT src=192.168.1.3 dst=22.22.22.22 sport=3333 dport=2222 packets=2 bytes=104 [UNREPLIED] src=192.168.1.5 dst=192.168.1.3 sport=5555 dport=3333 packets=0 bytes=0 mark=0 zone=0 use=2
复制代码

# 【返回的数据包】因为192.168.1.3是同一网段,NAS的回复数据包直接发给PC,不会发给路由器,则没有经过路由器防火墙,没有进行NAT反转,
# PC访问NAS的数据包:192.168.1.3:3333->22.22.22.22:2222
# 进行DNAT后变成了 :192.168.1.3:3333->192.168.1.5:5555
# NAS发出回复数据包:192.168.1.5:5555->192.168.1.3:3333
# PC直接收到源地址是192.168.1.5的回复数据包,不是22.22.22.22的,会丢弃。


#----------------------------------------------------------------
# 在DNAT基础上添加SNAT规则,数据包经过PREROUTING链进行了DNAT后会到FORWARD链,最后从区域lan输出前,到POSTROUTING链,会匹配这条规则:
  1. -A zone_lan_postrouting -s 192.168.1.0/24 -d 192.168.1.5/32 -p tcp -m tcp --dport 5555 -m comment --comment "!fw3: test (reflection)" -j SNAT --to-source 192.168.1.1
复制代码

# 防火墙判断是从区域lan输出的,内网192.168.1.0/24访问主机192.168.1.5:5555的tcp数据包,
# 则进行SNAT源地址转换,源地址192.168.1.3会被修改为192.168.1.1,
# 经过SNAT后,再查询修改conntrack entry的后半部分地址端口,
# 经过DNAT和SNAT的情况下,数据包从防火墙POSTROUTING链输出后最终conntrack entry是这样的:
  1. ipv4     2 tcp      6 39 TIME_WAIT src=192.168.1.3 dst=22.22.22.22 sport=3333 dport=2222 packets=0 bytes=0 src=192.168.1.5 dst=192.168.1.1 sport=5555 dport=3333 packets=0 bytes=0 [ASSURED] mark=0 zone=0 use=2
复制代码

# 【返回的数据包】因为NAS的回复数据包会发送回网关192.168.1.1,路由器防火墙就能根据conntrack entry将NAT转换反转过来,
# PC访问NAS的数据包:192.168.1.3:3333->22.22.22.22:2222
# 进行DNAT后变成了: 192.168.1.3:3333->192.168.1.5:5555
# 再进行SNAT后变成: 192.168.1.1:3333->192.168.1.5:5555
# NAS发出回复数据包:192.168.1.5:5555->192.168.1.1:3333
# 防火墙NAT反转后是:22.22.22.22:2222->192.168.1.3:3333
# 这样PC就可以收到22.22.22.22的回复,不会丢弃,通信建立了。


#----------------------------------------------------------------
# 这里是端口转发的那条规则,用于处理wan口输入的外网访问内网NAS的数据包。
# 数据包输入防火墙会查询conntrack table,没有就新建一条conntrack entry,
# 接着数据包先输入PREROUTING链,然后会匹配这条规则:
  1. -A zone_wan_prerouting -p tcp -m tcp --dport 2222 -m comment --comment "!fw3: test" -j DNAT --to-destination 192.168.1.5:5555
复制代码

# 防火墙判断是从区域wan输入的,访问tcp 2222端口的数据包,修改目标地址端口为192.168.1.5:5555。
# 经过DNAT后还会查询并修改对应的conntrack entry的后半部分源和目标的地址端口,
# 数据包从防火墙POSTROUTING链输出后最终conntrack entry是这样的:
  1. ipv4     2 tcp      6 1 TIME_WAIT src=11.11.11.11 dst=22.22.22.22 sport=1111 dport=2222 packets=0 bytes=0 src=192.168.1.5 dst=11.11.11.11 sport=5555 dport=1111 packets=0 bytes=0 [ASSURED] mark=0 zone=0 use=2
复制代码

# 【返回的数据包】这里NAS回复外网的数据包,因为不是同一网段,会先发给网关,路由器防火墙就能根据conntrack entry将NAT转换反转过来,
# 外网访问NAS数据包:11.11.11.11:1111->22.22.22.22:2222
# 进行DNAT后变成了: 11.11.11.11:1111->192.168.1.5:5555
# NAS发出回复数据包:192.168.1.5:5555->11.11.11.11:1111
# 防火墙NAT反转后是:22.22.22.22:2222->11.11.11.11:1111
# 外网设备也可以收到22.22.22.22的回复,通信建立。


How does NAT reflection (NAT loopback) work?
https://unix.stackexchange.com/q ... n-nat-loopback-work

Port forwarding for IPv4 (DNAT)
https://openwrt.org/docs/guide-u ... rding_for_ipv4_dnat

linux 连接跟踪nf_conntrack 与 NAT和状态防火墙
https://blog.csdn.net/whatday/article/details/105251137
Iptables之nf_conntrack模块
https://clodfisher.github.io/2018/09/nf_conntrack/

When does iptable's conntrack module track states of packets?
https://serverfault.com/question ... k-states-of-packets

评分

参与人数 2恩山币 +2 收起 理由
tanst + 1 一看就是觉得高端、大气、上档次!.
AnkeyVeronin + 1 感谢你的分享,无论怎样,你都是最无私的人!来,说说,你E盘上还有啥一起给我吧!

查看全部评分

我的恩山、我的无线 The best wifi forum is right here.
发表于 2022-3-16 17:47 | 显示全部楼层
楼主是一个有思想深度的人,建议下一步CCNP然后CCIE走起!!

点评

CCNP、CCIE含金量高难度大,我只是家用OpenWrt,想知其然知其所以然  详情 回复 发表于 2022-3-16 17:52
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2022-3-16 17:52 | 显示全部楼层
dust2k 发表于 2022-3-16 17:47
楼主是一个有思想深度的人,建议下一步CCNP然后CCIE走起!!

CCNP、CCIE含金量高难度大,我只是家用OpenWrt,想知其然知其所以然
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2022-3-16 18:46 | 显示全部楼层
本帖最后由 liyyyy 于 2022-3-16 18:47 编辑

楼主请教个问题,因为这两天在办公,要用 Cisco AnyConnet连公司服务器进公司办公系统,我路由器用的是K3 刷的论坛里的OpenWrt系统,结果Cisco AnyConnet连公司服务器,显示连上了,但是我进不去公司系统,然后把网线拔了其他设置不改变的情况下,直接插路由上就可以进公司系统,这个是因为OpenWrt防火墙问题吗?

点评

V P N我不是很懂,没研究过,可能帮不了你。 我认为连上了就是建立连接了,防火墙没有拦截,应该没问题才对。 简单的检查:你进公司系统使用的是系统的IP吧?AnyConnet会创建一个虚拟V P N网卡,看下网卡上配置  详情 回复 发表于 2022-3-16 19:16
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2022-3-16 19:16 | 显示全部楼层
本帖最后由 lgs2007m 于 2022-3-16 19:21 编辑
liyyyy 发表于 2022-3-16 18:46
楼主请教个问题,因为这两天在办公,要用 Cisco AnyConnet连公司服务器进公司办公系统,我路由器用的是K3  ...

V P N我不是很懂,没研究过,可能帮不了你。
我认为连上了就是建立连接了,防火墙会允许已建立连接的转发,不会拦截,应该没问题才对。

简单的检查:你进公司系统使用的是系统的IP吧?AnyConnet会创建一个虚拟V P N网卡,看下网卡上配置的网关。检查下电脑上的路由表,公司系统IP的网段是否指向该网关,或者默认路由指向该网关。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2022-3-17 15:39 | 显示全部楼层
实际就是端口回流,原理就是数据报文的构成要将内网源地址转换成公网地址形成源地址转换,不转换TCP的三次握手就成功不了。客户端-----网关 网关----内网服务器 内网服务器----客户端,源地址没有转换这样就形成了TCP握手失败。做个源地址转换就行
客户端----网关 网关(修改源地址为外网地址)----内网服务器 内网服务器----网关  网关(根据NAT表转换成客户端地址)------客户端 这样TCP报文交互就没有问题

点评

总结的简单明了  详情 回复 发表于 2022-3-17 16:02
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2022-3-17 16:02 | 显示全部楼层
EXIA文 发表于 2022-3-17 15:39
实际就是端口回流,原理就是数据报文的构成要将内网源地址转换成公网地址形成源地址转换,不转换TCP的三次 ...

总结的简单明了
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2022-3-19 19:08 来自手机 | 显示全部楼层
学习了,现象属于nat回流,思科资料里学习过
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2022-3-19 20:48 | 显示全部楼层
我最喜欢在恩山爬这么有水平的帖子,涨姿势了,果断收藏
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2022-5-26 02:48 | 显示全部楼层
膜拜大佬,继续学习
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2022-8-8 17:23 | 显示全部楼层
以为防火墙只是输入IP和端口,看了楼主的几个帖子才发现背后的原理还很多,我遇到了很多麻烦,明明配置正确就是不通。我也想了解背后的原理,请问楼主学习防火墙相关知识有没有系统资料或书籍,最好中文的。

点评

我也是小白,遇到问题才找资料,没系统学习过,推荐不了哦  详情 回复 发表于 2022-8-8 17:56
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2022-8-8 17:56 | 显示全部楼层
pisice 发表于 2022-8-8 17:23
以为防火墙只是输入IP和端口,看了楼主的几个帖子才发现背后的原理还很多,我遇到了很多麻烦,明明配置正确 ...

我也是小白,遇到问题才找资料,没系统学习过,推荐不了哦
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2023-4-17 11:28 | 显示全部楼层
好好学习,天天向上。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2023-7-14 21:50 | 显示全部楼层
好文章,能看懂,能理解
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2023-8-19 23:41 | 显示全部楼层
补充一下我的个人理解,这个NAT回环在配置文件中叫做反射选项option reflection,称为NAT反射更为合适且直观(不知道为啥中文UI叫回环)
配置NAT反射后的DNAT策略(源区域WAN>目的区域LAN),则会匹配来自 “源LAN>目的LAN” 的数据包,产生NAT反射(将NAT反射回源区域);将匹配该条DNAT策略,配置反射源使用内部地址,则使用目的LAN区域的IP作为源IP访问LAN区域的服务,如果配置反射源使用外部地址则使用源WAN区域地址【DNAT策略(源区域WAN>目的区域LAN)】

点评

一般这种效果在专业中被称为双向NAT,即目的方向和源方向都做NAT  详情 回复 发表于 2023-8-19 23:44
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /1 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-2-26 08:46

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表