技术教程 IPv4下的内网穿透工具-NPS
惯用词语表:
协议四:IPv4
协议六:IPv6(这篇文章内一般指的是公网IPv6,私网的也不管用啊)
光猫:光调制解调器
路由器:集成多功能路由器
一些问题:
由于协议四地址的严重短缺,咱国内家庭宽带白嫖IPv4公网地址逐渐变成奢望,这时候就出现了两种解决方法(也许更多)
- 内网穿透
- IPv6
首先需要明确几个问题:
- 端口转发 or 内网穿透?
- 什么时候使用内网穿透?
- 什么时候使用IPv6?
端口转发适用于:家庭网络中的网关能拿到公网地址,但由于家里的路由器之类设备叠加的NAT导致无法使用公网IP
内网穿透适用于:最高层设备拿到的是运营商级NAT地址,没公网用
只要最高级联网设备(通常是光猫或者路由器,如果光猫桥接路由器拨号那就是路由器,光猫拨号就是光猫)能拿到公网地址就用端口转发,没公网用就走内网穿透,如果有协议六尽量走协议六
端口转发的缺点:没多少人能用(因为没公网)
内网穿透的缺点:各种软件五花八门,不然给钱不然限制多
协议六的缺点:大多数人没得用(主要怪运营商,有些地方压根没部署,部署了你设备不一定支持),而且要用就要双向支持,服务器和客户端任何一边不支持都没得搞
标题也能看出来,这篇文章讲的是自建内网穿透。但这种东西肯定涉及到给钱这个必要环节(免费的当然可以,只要你能忍受那些限制也行,一些公益的排除在外),那肯定就有有人要问了:与其我自己搭建,为什么不直接购买成品方案?同样是给钱,而且给了钱就能用。
自己做的主要好处有以下几点:
- 东西是自己的,在服务器层面保证数据安全不被监控和泄漏
- 从过程中学习新的知识
- 内网穿透对机器不会有很高的负载,所以你可以顺便泡网站,容器,虚拟机(前提是支持嵌套虚拟化),编译器,转码,渲染,游戏服务器(Minecraft那货就是个典型例子,只是很可惜最新版本的服务器对配置要求有点高),全域或局部代理等等,能玩能折腾的简直不要太多
成品方案至少存在以下明显缺点:
- 专款专用,这么多钱只能干这一件事
- 商业公司,信息安全是个问题
- VIP→VIP+→MVP→MVP+→MVP++(感觉有点百度网盘和迅雷那味)
认清自我需求,多方获取信息,拒绝跟风盲从,要从自己做起!
正文:
NPS这货可以工作在各种系统和架构上,Github上面是这么显示的:
要弄这个肯定要有台服务器,国外说的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)对外访问来设置,你自己可以按照需求来调整配置
再之后如果能正常用的话其实也不需要管什么了,不能用的话记得检查一下防火墙(ufw/安全组/FirewallGroup),服务器端的端口是需要放行的