2021年9月11日

技术教程 IPv4下的内网穿透工具-NPS

作者 TheWhiteDog9487

惯用词语表:

协议四:IPv4
协议六:IPv6(这篇文章内一般指的是公网IPv6,私网的也不管用啊)
光猫:光调制解调器
路由器:集成多功能路由器

一些问题:

由于协议四地址的严重短缺,咱国内家庭宽带白嫖IPv4公网地址逐渐变成奢望,这时候就出现了两种解决方法(也许更多)

  1. 内网穿透
  2. IPv6

首先需要明确几个问题:

  • 端口转发 or 内网穿透?
  • 什么时候使用内网穿透?
  • 什么时候使用IPv6?

端口转发适用于:家庭网络中的网关能拿到公网地址,但由于家里的路由器之类设备叠加的NAT导致无法使用公网IP
内网穿透适用于:最高层设备拿到的是运营商级NAT地址,没公网用

只要最高级联网设备(通常是光猫或者路由器,如果光猫桥接路由器拨号那就是路由器,光猫拨号就是光猫)能拿到公网地址就用端口转发,没公网用就走内网穿透,如果有协议六尽量走协议六

端口转发的缺点:没多少人能用(因为没公网)
内网穿透的缺点:各种软件五花八门,不然给钱不然限制多
协议六的缺点:大多数人没得用(主要怪运营商,有些地方压根没部署,部署了你设备不一定支持),而且要用就要双向支持,服务器和客户端任何一边不支持都没得搞

标题也能看出来,这篇文章讲的是自建内网穿透。但这种东西肯定涉及到给钱这个必要环节(免费的当然可以,只要你能忍受那些限制也行,一些公益的排除在外),那肯定就有有人要问了:与其我自己搭建,为什么不直接购买成品方案?同样是给钱,而且给了钱就能用。

自己做的主要好处有以下几点:

  1. 东西是自己的,在服务器层面保证数据安全不被监控和泄漏
  2. 从过程中学习新的知识
  3. 内网穿透对机器不会有很高的负载,所以你可以顺便泡网站,容器,虚拟机(前提是支持嵌套虚拟化),编译器,转码,渲染,游戏服务器(Minecraft那货就是个典型例子,只是很可惜最新版本的服务器对配置要求有点高),全域或局部代理等等,能玩能折腾的简直不要太多

成品方案至少存在以下明显缺点:

  1. 专款专用,这么多钱只能干这一件事
  2. 商业公司,信息安全是个问题
  3. VIP→VIP+→MVP→MVP+→MVP++(感觉有点百度网盘和迅雷那味)

认清自我需求,多方获取信息,拒绝跟风盲从,要从自己做起!

正文:

NPS这货可以工作在各种系统和架构上,Github上面是这么显示的:

比较主流的Linux,Android,Windows,BSD 全部都支持。Linux和BSD版还支持ARM架构

要弄这个肯定要有台服务器,国外说的VPS和国内说的云服务器都行,但是一定要有IPv4公网。
操作系统随便选,上面列表之内的都行(如果只有客户端的话不行,比如Android),架构一般不用担心,应该都是AMD64,如果不放心的话可以查一下或者问一下厂商。Windows Server因为涉及到许可证费用所以可能比Linux和BSD贵出来一截,这个自己看着办。本文以Ubuntu 20.04作为服务器,Windows10作为客户端来演示。

下面的命令全部都要在连接了远程服务器的终端里面运行,这个都不会的话先去找别的教程连接上服务器了再来看这个!
如果你运行一些命令(例如apt update / wget这种有中文但不显示中文的强烈建议先把语言修改过来,可以参考这个

首先要建一个文件夹用来存放程序本体和配置,我习惯放在/home,这个是可以修改的,自己怎么喜欢怎么来

mkdir /home/nps
cd /home/nps

然后你要把服务端软件部署到你的服务器上,你可以使用FTP/SFTP/Wget等等方法,只要是能下载或传输文件都行(建议传输完之后校验一下文件完整性,如果文件有损坏就没得搞了)。比如说使用Wget下载目前为止的最新版本,可以这样:

wget https://github.com/ehang-io/nps/releases/download/v0.26.10/linux_amd64_server.tar.gz
tar -zxvf linux_amd64_server.tar.gz
rm linux_amd64_server.tar.gz

第一条命令是下载服务端文件压缩包,第二个是解压,第三个是删除压缩文件(因为已经不需要了)

文件下载链接和压缩文件名不要照抄!下载链接是因为会有新版本,文件名是作者可能会更改,按照自己实际情况来,不要照抄!

这样完成之后先要改一下配置文件(主要原因是端口占用)
有些设置项我自己都没玩明白,就简单说一下就过

cd conf
nano nps.conf

第一个是进入配置文件的文件夹,第二个是通过nano编辑器对主配置进行修改

修改完之后Ctrl+O然后回车保存文件,Ctrl+X退出编辑器

这么做完之后就可以开启服务器了,回到程序主目录(/home/nps),使用这个指令开启服务器:

./nps
没报错的话就问题不大,正常开起来了

由倒数第二条信息可知,NPS的Web管理面板已经在127.0.0.1:8080开起来了,你可以选择在防火墙上开启这个端口,然后通过IP:8080或域名:8080访问,或者做个反向代理,由Nginx处理端口问题并接管流量,像这样:

server {
    listen 443 ssl http2;
#   listen [::]:443 ssl http2;
    server_name -;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

    location / {
      proxy_pass https://127.0.0.1:8080/;
      proxy_set_header Host $host;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection upgrade;
      proxy_set_header Accept-Encoding gzip;
                        }
       }

上面这个例子还是要修改一下,比如说 server_name 的值要换成你的域名(如果你要用的话)
# listen [::]:443 ssl http2; 前面的#可以取消,如果你想让Web控制面板支持IPv6
add_header Strict-Transport-Security “max-age=31536000; includeSubDomains”; 负责启动严格安全传输协定(HSTS),如果你不喜欢的话可以删掉
proxy_pass https://127.0.0.1:8080/; 要注意一下协议,如果NPS那边不支持HTTPS的话也要修改一下

用你的方法(直接IP/域名或者反向代理)打开控制面板,像这样就对了(不排除后续程序更新导致界面大改的情况):

这里的账号密码就是配置文件里面web_username和web_password的值,用你设置的值登陆就行了

完成之后先添加一个客户端,左侧导航栏选择之后点新建
参数其实不太需要动,加密建议开一下,压缩看情况,其他的需要就设置不需要就不用动,然后确认就行

这个完成之后你就可以按照自己的需要来新建转发隧道了,我下面的操作按照我的需求:TCP 445(SMB)对外访问来设置,你自己可以按照需求来调整配置

左侧导航栏选择TCP隧道,新建,里面的信息按照你的实际情况填,客户端ID可以在左侧导航栏的客户端里面看到,服务器端口就是别人访问的端口(像我这里就是把内网服务器192.168.1.2:445的SMB穿透到了服务器的1445端口,不用445是因为服务商在ISP层面就把这端口封了,没得用)
完成之后回到客户端这里,点击客户端条目前面的加号,在下面可以获得连接命令
再然后就是客户端了,解压一份客户端程序并在nps可执行文件那里开启一个终端,把控制面板给的命令输进去就行了,连接成功之后就好了

再之后如果能正常用的话其实也不需要管什么了,不能用的话记得检查一下防火墙(ufw/安全组/FirewallGroup),服务器端的端口是需要放行的