Loading...  ### 1.前言 作为互联网症候群的一份子,对于各种各样的网络技术充满了热情,同时因为家里有NAS,因此也折腾了不少的内网穿透技术,从蛤蟆吃到花生壳、FRP,再从ZeroTier到TailScale,各种内网穿透技术层出不穷,他们各有各的有缺点,限于篇幅,这里就不展开讨论,有机会我会以后写一篇文章来介绍各种内网穿透技术的优劣。(咕咕咕咕咕咕) 以上的内网穿透技术都很优秀且有其独特的应用场景的,但都有的一个问题是,**要么需要服务器中转速度慢,要么就需要在访问端安装客户端不灵活**,这在PC上不是问题,但在权限限制严格的手机端就要开始取舍了,是富强还是穿透回内网有时候是个二选一的问题,诚然可以用tasilcale内网穿透全局回家,然后再在家里部署网络环境,但这个方法其实十分折腾且效率不高,数据包全部都要转发到家里造成延迟高,路由器部署网络环境十分复杂且修改不便,而Natter就是来解决这个特定应用场景下的问题的。 > 引用mikewang大佬的说法: > > 目前公网 IP 越来越稀缺,有些地区已经无法申请公网 IP 了。 > 不过,在 NAT 1 网络下,我们可以通过一种 “打洞” 的方式,将本地的 TCP 端口暴露至公网上,运行 HTTP 服务等。 > 经过一番研究,我使用 Python 写了一个工具,起名叫 Natter 。 > > 简洁地说,Natter 的原理就是端口重用: > > 1. 由本地端口 A 向外发起 TCP 长连接,维持 NAT 端口映射关系; > 2. 同时监听端口 A ,对外提供服务。 > > Natter 应当运行于路由器上,因为这样只经过一层 NAT 。不过,正确设置 DMZ 主机,经过多层 NAT 也是 OK 的。 > > 好消息是国内运营商级 NAT 多数已经转为 NAT 1 了,因此开放公网 TCP 端口应该是比较容易的。 > 目前我在中国移动的家庭宽带上已经成功使用 Natter 开放公网 TCP 端口。 > > GitHub: [https://github.com/MikeWang000000/Natter](https://github.com/MikeWang000000/Natter) ### 2. Natter的独特应用场景 我个人暂时碰到的场景是一下两个 1. 利用家宽中转家宽所属宽带友好型的VPS 2. 在OpenWrt上安装新型的一些VPN协议以实现灵活回内网的需求 场景1很好理解,场景2什么叫灵活回内网呢?其实就是我利用Clash分流的技术,将不同的流量分流到不同的地点,富强的流量分流到对应的服务器,回内网的流量分流到家宽的地址, **受限于移动端的限制,你不能即开TailScale之类的软件来打V4的洞,再打开Clash等软件** 因此就需要一种不需要客户的打洞方法,至此,我们的Natter就找到了其独特的应用场景了。 ### 3. 搭建的过程 我是在我的垃圾路由器上搭建的,路由器的系统是Openwrt,路由器的ROM只有16M,因此其实空间十分紧缺,但好在有python-light之类的python环境包,挤一挤空间还是能够用。下面是一些搭建的步骤,这里我利用了Screen实现了后台运行。 #### 3.1 安装Python环境 这里需要去更新一些软件包,在软件包配置正确的情况下只需要执行如下命令 ```shell opkg update opkg install python3-light ``` 安装完成后可以运行 python -h 验证 ```shell python -h usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ... Options and arguments (and corresponding environment variables): -b : issue warnings about str(bytes_instance), str(bytearray_instance) and comparing bytes/bytearray with str. (-bb: issue errors) -B : don't write .pyc files on import; also PYTHONDONTWRITEBYTECODE=x -c cmd : program passed in as string (terminates option list) -d : turn on parser debugging output (for experts only, only works on debug builds); also PYTHONDEBUG=x -E : ignore PYTHON* environment variables (such as PYTHONPATH) -h : print this help message and exit (also -? or --help) -i : inspect interactively after running script; forces a prompt even if stdin does not appear to be a terminal; also PYTHONINSPECT=x -I : isolate Python from the user's environment (implies -E and -s) -m mod : run library module as a script (terminates option list) -O : remove assert and __debug__-dependent statements; add .opt-1 before .pyc extension; also PYTHONOPTIMIZE=x -OO : do -O changes and also discard docstrings; add .opt-2 before .pyc extension -q : don't print version and copyright messages on interactive startup -s : don't add user site directory to sys.path; also PYTHONNOUSERSITE -S : don't imply 'import site' on initialization -u : force the stdout and stderr streams to be unbuffered; this option has no effect on stdin; also PYTHONUNBUFFERED=x -v : verbose (trace import statements); also PYTHONVERBOSE=x can be supplied multiple times to increase verbosity -V : print the Python version number and exit (also --version) when given twice, print more information about the build -W arg : warning control; arg is action:message:category:module:lineno also PYTHONWARNINGS=arg -x : skip first line of source, allowing use of non-Unix forms of #!cmd ``` 看起是否出现帮助信息,如果出现了上文一样的帮助信息则是完成了安装,**如果是硬路由刷的OpenWrt请注意你的硬件空间,很多安装问题都出在软件源或者存储空间上。** 安装好python后我们就可以进入下一步了。 #### 3.2 安装Screen实现方便的后台运行 Screen是一个很方便的多窗口工具,详细信息可以看[VPS侦探的这篇教程。](https://www.vpser.net/manage/screen.html) ```shell opkg install screen ``` 安装完成后输入 ```shell screen -h ``` 看到帮助信息及代表安装成功,这些都安装好后就可以开始运行Natter了。 #### 3.4 Natter的安装 因为是基于python的文件,安装也特别简单,只需要下载官网的natter.py,将其放在/root/ 这个文件夹下,然后即可以进入下面的运行步骤。 ### 4. Natter的运行 其实特别简单,简单到让我感觉像是废话,先输入创建一个新的窗口。(创建完成后所有上面的Shell信息会消失,这样就代表创建成功了。) ```shell screen -S natter ``` 然后在窗口中执行Natter在GitHub上的Readme里介绍的指令即可。其中括号前面是公网ip地址,后面是打洞的端口,填入你需要的地方即可。如果重新拨号相关信息是会改变的,期待mikewang大佬能完善相关的通知API,让我们可以在不在内网的环境下获得相关信息,解决先鸡还是先蛋的Boot难题。 ```shell python natter.py 80 [INFO] - Getting STUN server IP... [INFO] - Checking NAT Type for UDP... [INFO] - NAT Type for UDP: [ Full cone (NAT 1) ] [INFO] - Checking NAT Type for TCP... [INFO] - NAT Type for TCP: [ Cone NAT ] [INFO] - Start punching... [INFO] - The TCP hole punching appears to be successful. Please test this address from another network: ('112.*.*.*', 17183) ================================ ('112.*.*.*', 17183) ================================ ``` **如果成功打洞,记录下对应的信息后按Ctrl+A+D三键组合即可退出窗口但不中止程序。** 想要再次登陆这个窗口输入 ```shell screen -D -r natter ``` 即可进入重新进入窗口,如果想要多了解一下Screen的使用可以看我上面推荐的教程,讲地十分详细,我就不再废话了。 ### 5. 小小的总结 其实如果你都开始手撸Clash配置文件需要这个需求了,相信上面的介绍对你而言可能真的是废话吧,当然如果你有什么不懂的,也欢迎在评论区交流,我接触这个工具也就才几个小时,不可能写出一篇面面俱到的教程的,教程有时候也是需要不停迭代才能完善的嘛。希望你玩地开心。 如果精力允许,这个教程是会同步更新的,敬请关注,说不定下次回来就不一样了呢? 最后修改:2022 年 09 月 16 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏