26-Openwrt 端口转发 dmz upnp

我们经常会在路由器上面配置端口转发的规则,用来访问内网机器的某个端口,openwrt上面有很多中实现端口转发的方式。

1、端口转发

比如我想用wan口的IP,192.168.2.180,远程连接lan口内网192.168.18.235的ubuntu,如何实现:

  • 建立一个端口转发规则,将
    2222端口,访问路由器内网192.168.18.235ubuntu的22端口,

在防火墙下面添加如下规则cat /etc/config/firewall

config redirect
    option enabled '1'
    option proto 'tcp'
    option comment 'ubuntu'
    option src_dport '2222'
    option dest_ip '192.168.18.235'
    option dest_port '22'
    option src 'wan'
    option target 'DNAT'
    option dest 'lan'

实际实现在iptable的nat表下面添加了如下规则

root@openwrt:/# iptables -t nat -nvL | grep 235
  307 23589 zone_lan_prerouting  all  --  br-lan *       0.0.0.0/0            0.0.0.0/0           
    0     0 SNAT       tcp  --  *      *       192.168.18.0/24      192.168.18.235       tcp dpt:22 /* @redirect[0] (reflection) */ to:192.168.18.1
  307 23589 prerouting_lan_rule  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* user chain for prerouting */
    0     0 DNAT       tcp  --  *      *       192.168.18.0/24      192.168.2.180        tcp dpt:2222 /* @redirect[0] (reflection) */ to:192.168.18.235:22
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:2222 /* @redirect[0] */ to:192.168.18.235:22

这样通过wan ip加src_dport就可以访问到内网机器的ssh端口了。

2、DMZ

dmz就是加强版的端口转发,比如你内网IP里面有22端口给ssh用,也有80端口给web用,也有23端口给telnet用。如果用端口转发的话,你需要建立三条端口转发的规则。用dmz的话一下子就都可以了。

在防火墙下面添加如下规则cat /etc/config/firewall

config redirect 'dmz'
        option name 'dmz'
        option src 'wan'
        option proto 'tcp'
        option target 'DNAT'
        option dest_ip '192.168.18.235'
        option enabled '1'

config redirect 'dmzudp'
        option name 'dmzudp'
        option src_port '!67'
        option src 'wan'
        option proto 'udp'
        option target 'DNAT'
        option dest_ip '192.168.18.235'
        option enabled '1'

实际实现在iptable的nat表下面添加了如下规则

root@openwrt:/# iptables -t nat -nvL | grep 235
    0     0 SNAT       tcp  --  *      *       192.168.18.0/24      192.168.18.235       /* dmz (reflection) */ to:192.168.18.1
    0     0 SNAT       udp  --  *      *       192.168.18.0/24      192.168.18.235       /* dmzudp (reflection) */ to:192.168.18.1
    0     0 DNAT       tcp  --  *      *       192.168.18.0/24      192.168.2.180        /* dmz (reflection) */ to:192.168.18.235
    0     0 DNAT       udp  --  *      *       192.168.18.0/24      192.168.2.180        /* dmzudp (reflection) */ to:192.168.18.235
    5   405 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* dmz */ to:192.168.18.235
   26  2270 DNAT       udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp spt:!67 /* dmzudp */ to:192.168.18.23
3、Upnp

openwrt上面使用miniupnpd服务来实现upnp服务

root@zihome:# ps | grep mini
25503 root      1076 S    /usr/sbin/miniupnpd -f /var/etc/miniupnpd.conf
28450 root      1520 S    grep mini

/etc/config/upnpd里面的log_output设置成1,可以在logread下查看交互日志。

config upnpd 'config'
        option enable_natpmp '1'
        option enable_upnp '1'
        option secure_mode '1'
        option log_output '1'
开启upnp的时候:

打开控制面板->网络和 Internet->查看网络计算机和设备,可以看到路由器

右键查看属性可以看到路由器的信息

  • 制造商
  • 型号
  • 设备网页
  • mac地址
  • 唯一标识符
  • IP地址

抓包可以看到路由器发送SSDP广播包给239.255.255.250,NOTIFY消息内容包含上面信息。

关闭upnp的时候:

打开控制面板->网络和 Internet->查看网络计算机和设备,路由器丢失

抓包可以看到路由器发送SSDP广播包给239.255.255.250,NOTIFY消息内容被byebye。

upnp实现端口映射

upnp可以通过另一种方式实现端口映射,就是客户端告诉路由器说,我想要通过哪个端口应该到哪个端口,然后路由器帮忙建立端口转发规则。

ubuntu安装upnpc

sudo apt-get install -y miniupnpc

ubuntu的ssh添加2222端口,upnp默认只允许1024-65535端口的映射

config perm_rule
    option action 'allow'
    option ext_ports '1024-65535'
    option int_addr '0.0.0.0/0'
    option int_ports '1024-65535'
    option comment 'Allow high ports

sudo vim /etc/ssh/sshd_config

Port 22
Port 2222

sudo /etc/init.d/ssh restart

ubuntu 通过upnpc请求添加端口映射,2222内部端口,9000外部端口

upnpc -a 192.168.17.233 2222 9000 TCP

这时候在upnp.leases下面就会添加一条信息,iptable -t nat下面添加一条规则。完成端口映射

root@openwrt:/# cat /var/upnp.leases 
TCP:9000:192.168.17.233:2222:1655716845:libminiupnpc

ubuntu 通过upnpc请求删除端口映射

upnpc -d 192.168.17.233 2222 9000 TCP
当开启迅雷下载的时候

会有如下信息被upnpd捕获到

root@openwrt:/# cat /var/upnp.leases 
TCP:54366:192.168.17.151:53533:1655706396:PTL-000C29A6B88AGXGA
UDP:54366:192.168.17.151:54366:1655706396:PTL-000C29A6B88AGXGA
TCP:53532:192.168.17.151:53532:1655706396:PTL-000C29A6B88AGXGA


root@openwrt:/# iptables -t nat -nvL

Chain MINIUPNPD (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:63016 to:192.168.17.151:53866
    0     0 DNAT       udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:63016 to:192.168.17.151:63016
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53864 to:192.168.17.151:53864


<think>我们正在处理一个关于NAT类型配置的问题。用户希望将TCP的NAT类型从NAT4调整为NAT1,同时保持UDP的NAT类型为NAT1,并实现统一配置。我们需要参考提供的引用内容,并结合NAT类型的知识来回答。首先,我们需要理解NAT类型:-NAT4(对称型NAT):每个请求从同一个内部IP地址和端口到不同的外部目的地,都会被映射到不同的外部端口。也就是说,对于同一个内部主机,如果它访问不同的外部地址,NAT会分配不同的端口映射。这种类型安全性较高,但可能会阻碍某些P2P应用。-NAT1(完全锥型NAT):一旦内部地址(IP和端口)被映射到外部地址(IP和端口),任何外部主机都可以使用这个映射来发送数据包给内部主机。用户的目标是将TCP的NAT类型从对称型(NAT4)调整为完全锥型(NAT1),同时保持UDP为NAT1(即完全锥型),并希望统一配置。根据引用[1]提到配置对称型NAT的要点,我们可以推断,要配置为完全锥型NAT,我们需要确保NAT设备支持完全锥型NAT,并进行相应的配置。步骤:1.**确认NAT设备支持完全锥型NAT(NAT1)**:不是所有的NAT设备都支持完全锥型NAT。需要查阅设备文档或设置界面,确认设备支持配置为完全锥型NAT。2.**配置NAT类型**:-在NAT设备(如路由器)的设置中,找到NAT类型配置选项。通常,在防火墙设置或NAT设置中。-将TCP和UDP的NAT类型都设置为完全锥型(FullCone)。注意:有些设备可能允许分别设置TCP和UDP,有些则统一设置。3.**确保UDP保持在NAT1**:由于用户要求UDP已经是NAT1,我们只需要在配置中确保UDP的配置不被改变。如果设备允许分别设置,则保持UDP为完全锥型;如果是统一设置,则设置整个NAT为完全锥型,这样TCP和UDP都会是NAT1。4.**统一配置**:如果设备支持统一设置,那么设置一个全局的NAT类型为完全锥型即可。如果设备不支持统一设置,则需要分别将TCP和UDP都设置为完全锥型。5.**其他配置注意事项**(参考引用[1]):-正确配置内部网络和外部网络的访问控制列表(ACL):确保内部主机可以正常发起连接,并且外部主机可以访问到内部主机(在完全锥型NAT中,只要内部主机先发起过连接,外部主机就可以主动连接映射后的公网IP和端口)。-分配足够的公网IP地址:完全锥型NAT通常需要一个公网IP地址,但如果有多个内部主机,可能需要多个公网IP。不过,大多数家用路由器只有一个公网IP,所以会使用端口映射的方式。6.**特殊配置**(参考引用[2]):如果希望NAT内部的主机能够被外部访问,在对称型NAT下需要特殊配置(如端口转发),但在完全锥型NAT下,只要内部主机先向外部主机发送过数据,外部主机就可以直接通过映射的公网IP和端口访问内部主机。因此,在完全锥型NAT中,不需要额外的端口转发配置即可实现外部访问(但前提是内部主机先发起过连接)。如果希望内部主机作为服务端被随时访问,则可能需要设置静态端口映射(端口转发)或DMZ主机。7.**注意事项**:-将NAT类型改为完全锥型会降低安全性,因为外部主机可以更容易地访问内部主机。-确保更改配置后测试TCP和UDP的NAT类型,可以使用一些在线NAT类型测试工具。具体操作步骤(以一般路由器为例):1.登录路由器管理界面(通常通过浏览器访问路由器的IP地址,如192.168.1.1)。2.找到“安全设置”、“防火墙设置”或“NAT设置”等选项。3.寻找NAT类型配置,可能称为“NAT过滤”或“NAT类型”。选择“完全锥型”(FullCone)或“开放型”(Open)。4.如果设备支持分别设置TCP和UDP,则分别设置TCP和UDP为完全锥型。5.保存配置并重启路由器。6.测试:使用NAT类型测试工具(如STUN测试工具)测试TCP和UDP的NAT类型是否都为NAT1。如果设备不支持配置NAT类型,可能需要升级固件或更换路由器。相关问题:1.如何测试NAT类型?2.配置完全锥型NAT会带来哪些安全风险?3.除了完全锥型NAT,还有哪些NAT类型?它们的特点是什么?</think>### 如何统一配置TCP/UDP的NAT类型为NAT1 要实现TCP NAT类型从NAT4(对称型)调整为NAT1(完全锥型),同时保持UDP为NAT1并统一配置,需结合路由器设置、网络协议特性和安全策略。以下是具体步骤: --- #### **一、核心配置步骤** 1. **确认设备支持NAT1配置** - 登录路由器管理界面(如192.168.1.1),检查NAT类型配置选项。 - **关键要求**:设备必须支持完全锥型NAT(NAT1)[^1]。若仅支持对称型NAT(NAT4),需升级固件或更换设备。 2. **统一TCP/UDP的NAT映射规则** - **TCP配置**: - 关闭对称型NAT策略:在路由器设置中禁用"基于目标地址的端口随机化"(TCP对称型NAT的核心特征)。 - 启用静态端口映射:为内部主机分配固定公网端口,确保**同一内部端口始终映射到同一公网端口**(无论目标地址如何)。 ```bash # 示例:在Linux iptables中配置TCP完全锥型NAT iptables -t nat -A POSTROUTING -p tcp -j SNAT --to-source <公网IP>:<固定端口范围> ``` - **UDP保持NAT1**: - 检查现有UDP配置是否为完全锥型(允许外部任意主机通过映射端口访问内部主机)。 -UDP已是NAT1,无需修改;否则同步应用上述TCP的静态端口规则。 3. **访问控制与公网IP分配** - 配置ACL(访问控制列表),允许外部主机主动访问NAT映射后的公网端口[^1]。 - 为TCP/UDP分配**独立的公网IP段**,避免端口冲突(例如:TCP用IP1,UDP用IP2)[^1]。 4. **禁用防火墙干扰** - 关闭路由器的**SPI(状态包检测)** 功能,防止其干扰NAT1的连接状态跟踪。 - 在安全策略中允许**入站连接**(完全锥型NAT需接受外部主动请求)。 --- #### **二、验证与测试** 1. **测试工具**: - 使用`stun`客户端(如`stunclient`)或在线工具(如"NatTypeTester")检测TCP/UDP的NAT类型。 - **预期结果**:TCP和UDP均显示为"NAT1"或"Full Cone"。 2. **协议兼容性检查**: - **TCP**:通过`telnet <公网IP> <映射端口`测试外部主动连接。 - **UDP**:使用`iperf3 -u`验证外部主机能否直接发送数据包到内部主机。 --- #### **三、注意事项与风险** 1. **安全风险**: - NAT1允许任意外部主机访问映射端口,需严格限制内部服务暴露范围[^2]。 - 建议结合**应用层防火墙**(如仅允许可信IP访问)。 2. **协议差异处理**: - **TCP连接可靠性**:NAT1可能导致TCP连接被意外复用,需在应用层启用序列号或重传机制[^3]。 - **UDP保持NAT1**:避免启用ALG(应用层网关),防止路由器修改UDP包头破坏完全锥型规则。 3. **设备兼容性**: - 企业级路由器(如Cisco ASA、pfSense)支持细粒度NAT类型配置,家用路由器需刷机(如OpenWrt)[^1]。 --- #### **四、备选方案** 若设备不支持NAT1统一配置: - **方案1**:通过**端口转发**(Port Forwarding)将TCP流量强制指向特定内部主机,模拟NAT1行为。 - **方案2**:部署**UPnP(通用即插即用)** 协议,允许内部主机动态申请NAT1映射(需启用`upnpd`服务)。 > **关键引用**: > - 对称型NAT要求"每个连接的双向数据包必须通过相同NAT"[^2],而完全锥型NAT无需此限制。 > - UDP的可靠传输可通过应用层机制(如序列号、前向纠错)增强[^3],但NAT类型需独立配置。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Creator_Ly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值