找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 7632|回复: 53

宽带没有公网IP地址也能开TCP服务并从任意主机访问

[复制链接]
本帖最后由 heiher 于 2022-12-25 20:16 编辑

有消息称国内各大运营商将会逐步收紧家庭宽带分配公网IPv4地址,有些地区已经在执行了,申请改公网IPv4的难度越来越大了。

好消息是几大运营商的固网宽带的CGNAT基本都是NAT1(Full cone)类型的,技术层面上给打洞开TCP服务允许任意公网主机访问提供了可能性。在此也非常感谢v2ex网友mike wang分享了这一思路。

现在,我们可以很方便的借助 natmap 工具来完成私网内的TCP服务端口向公网开放。

1. 适用于路由器拨号的场景,如果是光猫拨号,需要登录光猫配置DMZ。(也有用户反馈光猫实为NAT1无需配置DMZ)
2. 建议将natmap程序运行在拨号路由器上,如果运行在用户侧内网PC上,则同样需要配置拨号路由器的DMZ。
3. 支持调用脚本进行公网地址分发,比如更新到DDNS记录中。

下面以OpenWrt 路由器拨号并将natmap运行在路由器上例举两种基本场景的使用方法,详细使用文档见项目的README。

项目地址: https://github.com/heiher/natmap
程序下载: https://github.com/heiher/natmap/releases

NATMap已经集成至OpenWrt社区仓库,22.03及以后版本可以直接使用opkg安装:

  1. opkg update
  2. opkg install natmap
  3. opkg install luci-app-natmap
复制代码





场景一:开放路由器HTTP服务至公网

1. 配置防火墙

配置防火墙允许WAN口访问路由器的TCP 80端口:
登录路由器Web管理页面,转到 网络 -> 防火墙 -> 传输规则,增加如下配置:
  1. * Protocol: TCP
  2. * Source zone: wan
  3. * Destination zone: Device (input)
  4. * Destination port: [bind port]
  5. * Action: accept
复制代码

2. 运行 natmap

  1. natmap -s stun.stunprotocol.org -h qq.com -b 80
复制代码

程序运行后会输出映射后的公网IPv4地址和端口,在浏览器中能够访问说明映射成功:
  1. 101.82.24.32 43648 2001::aa80:6552:1820 80 tcp
复制代码
浏览器中访问: http://101.82.24.32:43648

场景二:开放内网PC上SSH服务至公网

1. 配置防火墙

同上

2. 运行 natmap

  1. natmap -s stun.stunprotocol.org -h qq.com -b 80 -t 10.0.0.2 -p 22
复制代码
-t 指定转发的目标地址
-p 指定转发的目标端口

场景三:开放内网PC上的WireGuard服务至公网

1. 配置防火墙

同上

2. 运行 natmap

  1. natmap -u -s stun.qq.com -b 6900 -t 192.168.0.2 -p 6901 -e /usr/bin/ddns
复制代码

192.168.0.2: 运行WireGuard的内网主机
6901: 运行WireGuard的内网主机端口
/usr/bin/ddns: 将脚本参数3(IP4P)更新到DDNS域名的AAAA记录中。


3. WireGuard Android客户端访问

下载支持IP4P地址格式的WireGuard Android客户端: https://github.com/heiher/wireguard-android/releases/
Peer地址写为:

  1. domain:0
复制代码

场景四:开放内网PC上的FRP服务至公网

配置、运行方法参考场景三的WireGuard,支持IP4P的FRP程序下载地址:https://github.com/heiher/frp/releases/

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

点评

nanopi r1s h5 是要运行 natmap-openwrt-armhf 这个吗?  发表于 2022-10-22 15:45
我的恩山、我的无线 The best wifi forum is right here.
来自手机 | 显示全部楼层
谢谢分享,学习了
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

本帖最后由 huaxie1988 于 2022-10-16 17:02 编辑

经测试,openwrt绑定端口时当端口在使用报错Segmentation fault,监听未使用端口再转发到其他应用已监听端口可以。

点评

确实,当时该功能只在PC上测试过没能发现问题,感谢反馈~ 刚发布了 20221016 版本修复了该问题,需要注意的是当绑定端口已在使用中且服务程序没有配置reuse port时,需在 Linux 5.6及以上版本的内核上,natmap才  详情 回复 发表于 2022-10-16 17:43
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

来自手机 | 显示全部楼层
也就是场景1无法使用,场景2正常。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| | 显示全部楼层
huaxie1988 发表于 2022-10-16 16:55
经测试,openwrt绑定端口时当端口在使用报错Segmentation fault,监听未使用端口再转发到其他应用已监听端口 ...

确实,当时该功能只在PC上测试过没能发现问题,感谢反馈~

刚发布了 20221016 版本修复了该问题,需要注意的是当绑定端口已在使用中且服务程序没有配置reuse port时,需在 Linux 5.6及以上版本的内核上,natmap才能绑定成功。

点评

经测试20221016版本的可以使用场景1,绑定到已监听端口。  详情 回复 发表于 2022-10-16 20:43
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

heiher 发表于 2022-10-16 17:43
确实,当时该功能只在PC上测试过没能发现问题,感谢反馈~

刚发布了 20221016 版本修复了该问题,需要 ...

经测试20221016版本的可以使用场景1,绑定到已监听端口。

点评

好的。 另外补充一下,natmap在完成TCP端口映射和获得公网IP地址、端口后,支持调用脚本并传入绑定端口、公网地址、端口等参数,在脚本中可以进行地址分发,比如更新到DDNS记录中等等。具体用法请参考项目的READM  详情 回复 发表于 2022-10-16 21:41
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

来自手机 | 显示全部楼层
马克下,暂时无法访问github

点评

已将由Github Action自动构建的最新发布版本程序打包上传到附件中  详情 回复 发表于 2022-10-16 21:47
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| | 显示全部楼层
huaxie1988 发表于 2022-10-16 20:43
经测试20221016版本的可以使用场景1,绑定到已监听端口。

好的。

另外补充一下,natmap在完成TCP端口映射和获得公网IP地址、端口后,支持调用脚本并传入绑定端口、公网地址、端口等参数,在脚本中可以进行地址分发,比如更新到DDNS记录中等等。具体用法请参考项目的README。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| | 显示全部楼层
olvolv 发表于 2022-10-16 21:20
马克下,暂时无法访问github

已将由Github Action自动构建的最新发布版本程序打包上传到附件中

点评

经测试,wan重拨后不会重新映射。  详情 回复 发表于 2022-10-16 22:14
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

heiher 发表于 2022-10-16 21:47
已将由Github Action自动构建的最新发布版本程序打包上传到附件中

经测试,wan重拨后不会重新映射。

点评

20221016版本吗?重拨后等待了大概多久?目前是基于超时机制触发重新映射的,超时为2个keep-alive间隔(即-k参数的值,默认值为30秒)  详情 回复 发表于 2022-10-16 22:18
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| | 显示全部楼层
huaxie1988 发表于 2022-10-16 22:14
经测试,wan重拨后不会重新映射。

20221016版本吗?重拨后等待了大概多久?目前是基于超时机制触发重新映射的,超时为2个keep-alive间隔(即-k参数的值,默认值为30秒)

点评

不用nohup,直接在终端运行可以看到重拨后是有新的ip映射输出的。  详情 回复 发表于 2022-10-16 22:51
还有有时候会失败,换个域名又好了,日志如下  详情 回复 发表于 2022-10-16 22:44
有半个小时了,我是用nohup挂到后台的,看nohup.out没新的输出。  详情 回复 发表于 2022-10-16 22:38
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

heiher 发表于 2022-10-16 22:18
20221016版本吗?重拨后等待了大概多久?目前是基于超时机制触发重新映射的,超时为2个keep-alive间隔(即 ...

有半个小时了,我是用nohup挂到后台的,看nohup.out没新的输出。

点评

可能是标准输出重定向的问题,跑在后台可以用 -d 参数实现。试下 -e 调用脚本,比如在脚本中把公网地址写到文件中: /tmp/update:  详情 回复 发表于 2022-10-16 22:48
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

heiher 发表于 2022-10-16 22:18
20221016版本吗?重拨后等待了大概多久?目前是基于超时机制触发重新映射的,超时为2个keep-alive间隔(即 ...

还有有时候会失败,换个域名又好了,日志如下
  1. root@OpenWrt:~# /opt/bin/natmap -4 -s stun.stunprotocol.org -h baidu.com -b 80
  2. [E] hev_sock_client_http src/hev-sock.c:168
  3. [E] http_run src/hev-http.c:92
  4. [E] hev_sock_client_http src/hev-sock.c:168
  5. [E] http_run src/hev-http.c:92
  6. [E] hev_sock_client_http src/hev-sock.c:168
  7. [E] http_run src/hev-http.c:92
  8. [E] hev_sock_client_http src/hev-sock.c:168
  9. [E] http_run src/hev-http.c:92
  10. ^C
  11. root@OpenWrt:~# /opt/bin/natmap -4 -s stun.stunprotocol.org -h www.baidu.com -b 80
  12. 公网IP 34969 2001::xxxx:xxxx:xxxx 80
复制代码

点评

这是正常现象,按照TCP的连接断开退出机制,主机执行close的一端会进入TIME_WAIT状态,在TIME_WAIT的一小段时间内,绑定源文件和目标地址端口四元组处于锁定状态,natmap会间隔5秒重试,一小段时间后系统解除锁定即  详情 回复 发表于 2022-10-16 22:52
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| | 显示全部楼层
huaxie1988 发表于 2022-10-16 22:38
有半个小时了,我是用nohup挂到后台的,看nohup.out没新的输出。

可能是标准输出重定向的问题,跑在后台可以用 -d 参数实现。试下 -e 调用脚本,比如在脚本中把公网地址写到文件中:

/tmp/update:

  1. #!/bin/bash

  2. echo $[url=home.php?mod=space&uid=162986]@[/url] >> /tmp/natmap.log
复制代码
  1. chmod +x /tmp/update

  2. natmap -d -s stun.stunprotocol.org -h qq.com -b 80 -e /tmp/update
复制代码


点评

经测试,采用脚本写ip重拨后更新正常。  详情 回复 发表于 2022-10-16 23:04
好的,研究下。  详情 回复 发表于 2022-10-16 22:52
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

heiher 发表于 2022-10-16 22:18
20221016版本吗?重拨后等待了大概多久?目前是基于超时机制触发重新映射的,超时为2个keep-alive间隔(即 ...

不用nohup,直接在终端运行可以看到重拨后是有新的ip映射输出的。

点评

重定向输出不及时可见的问题将会在下个发布版本中修复。  详情 回复 发表于 2022-10-17 22:37
是的,重连机制是正常的。  详情 回复 发表于 2022-10-16 22:53
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 01:06

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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

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