好用轻量的内网穿透软件NPS

内网穿透用过几个了,有用过群晖自带,用过FRP,用过ngrok,用过阿里云DDNS,还尝试用过LEDE自带的Kool DDNS。但是说到最满意的,还是当下使用的NPS。NPS的特点嘛,简单、好用、硬件要求低、轻量,还有配置简单和跨平台性极好。

内网穿透干嘛

干啥用呢,说几个使用场景吧。第一,公司电脑上有工作需要的文件,家里电脑没有,突然需要工作需要的文件,可以通过内网穿透实现文件访问获取到需要的文件;第二,公司电脑上有特定的程序,在家里电脑安装不了,突然需要使用那个程序,可以通过内网穿透实现远程控制公司电脑使用程序;第三,公司的电脑需要开机,那么可以通过内网穿透远程访问路由器(作为堡垒机),利用WOL(局域网唤醒)唤醒目标电脑;第四,想玩的游戏的服务器架设在国内,国外玩起来很卡,那么可以通过内网穿透代理UDP,实现游戏加速……

服务端

NPS服务端的安装非常简单,这里给出简单的步骤,同时给出一个简单的配置。我的服务器是Linux 64Bit,其他的平台类似。当前,NPS最新版本是0.26.4。

1
2
3
mkdir -p /data/nps #创建目录
wget https://github.com/ehang-io/nps/releases/download/v0.26.4/linux_amd64_server.tar.gz -O /data/linux_amd64_server.tar.gz #下载文件
tar xzf /data/linux_amd64_server.tar.gz -C /data/nps/ #解压文件

编辑配置/data/nps/conf/nps.conf文件,修改成如下(public_vkey、web_username和web_password分别代表验证密钥、web管理需要的用户名和密码,自行修改):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
appname = nps
#Boot mode(dev|pro)
runmode = pro

#HTTP(S) proxy port, no startup if empty
http_proxy_ip=0.0.0.0
http_proxy_port=20080
https_proxy_port=20443
https_just_proxy=true
#default https certificate setting
https_default_cert_file=conf/server.pem
https_default_key_file=conf/server.key

##bridge
bridge_type=tcp
bridge_port=8024
bridge_ip=0.0.0.0

# Public password, which clients can use to connect to the server
# After the connection, the server will be able to open relevant ports and parse related domain names according to its own configuration file.
public_vkey=leochan1234556789

#Traffic data persistence interval(minute)
#Ignorance means no persistence
#flow_store_interval=1

# log level LevelEmergency->0 LevelAlert->1 LevelCritical->2 LevelError->3 LevelWarning->4 LevelNotice->5 LevelInformational->6 LevelDebug->7
log_level=7
#log_path=nps.log

#Whether to restrict IP access, true or false or ignore
#ip_limit=true

#p2p
#p2p_ip=127.0.0.1
#p2p_port=6000

#web
#web_host=host
web_username=yonghuming
web_password=mima123456
web_port = 8080
web_ip=0.0.0.0
web_base_url=
web_open_ssl=false
web_cert_file=conf/server.pem
web_key_file=conf/server.key
# if web under proxy use sub path. like http://host/nps need this.
#web_base_url=/nps

#Web API unauthenticated IP address(the len of auth_crypt_key must be 16)
#Remove comments if needed
#auth_key=test
auth_crypt_key =1234567812345678

#allow_ports=9001-9009,10001,11000-12000

#Web management multi-user login
allow_user_login=false
allow_user_register=false
allow_user_change_username=false


#extension
allow_flow_limit=false
allow_rate_limit=false
allow_tunnel_num_limit=false
allow_local_proxy=false
allow_connection_num_limit=false
allow_multi_ip=false
system_info_display=false

#c
http_cache=true
http_cache_length=100

#get origin ip
http_add_origin_header=false

#pprof debug options
#pprof_ip=0.0.0.0
#pprof_port=9999

继续执行以下命令完成安装并启动!!

1
2
3
cd /data/nps #切换目录
./nps install #开始安装
nps start #启动引擎

反向代理

反向代理,我用的是Caddy,因为简单高效,最重要的是不用管证书,可以自动获取更新SSL证书。Caddy的2.0版本已经出来,但还处于beta版本,所以我用的是1.0系列版本。Caddy自带启动脚本,我用的服务器系统是centos 7.4 64bit,所以,我用到的启动脚本是init/linux-systemd/caddy.service。根据启动脚本的内容,得知需要把caddy可执行文件放到/usr/local/bin目录,并且确定配置文件是/etc/caddy/Caddyfile。

1
2
3
4
5
6
7
8
9
10
11
12
mkdir -p /data/caddy #建立基地
wget https://github.com/caddyserver/caddy/releases/download/v1.0.3/caddy_v1.0.3_linux_amd64.tar.gz -O /data/caddy/caddy_v1.0.3_linux_amd64.tar.gz #运货到基地
cp /data/caddy/caddy /usr/local/bin/ #拷贝可执行文件到目标目录
chmod a+x /usr/local/bin/caddy #更改权限
cat /data/caddy/init/linux-systemd/caddy.service > /etc/systemd/system/caddy.service #搬动启动脚本内容
sed -i ’s/www-data/root/g’ /etc/systemd/system/caddy.service #替换caddy运行用户,懒得去处理权限问题
chmod 755 /etc/systemd/system/caddy.service #更改脚本文件权限
systemctl enable caddy.service #自启动
mkdir -p /etc/ssl/caddy #建立caddy证书存取目录
mkdir -p /var/log/caddy #建立日志目录
mkdir -p /etc/caddy #建立以下配置存放目录
touch /etc/caddy/Caddyfile #建立配置文件

修改/etc/caddy/Caddyfile文件并保存,内容如下(nps.domain.tls是绑定的域名,10000@163.com
是邮箱地址,请按照自己的实际内容修改):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
nps.domain.tls{
gzip
redir 301{
if {>X-Forwarded-Proto} is http
/ https://nps.domain.ltd{uri}
}
tls 10000@163.com
log /var/log/caddy/nps.domain.tls.log{
rotate_size 5
rotate_age 5
rotate_keep 2
rotate_compress
}
proxy / 127.0.0.1:8080{
transparent
}
}

启动服务端

1
2
3
4
5
echo $PATH #查看以下/usr/local/bin是否包含在环境变量里,如果没有匹配,请执行下三步的环境变量配置和环境变量生效,否则跳过;
echo ‘PATH=$PATH:/usr/local/bin’ >> ~/.bash_profile #环境变量配置
echo ‘export PATH’ >> ~/.bash_profile #环境变量配置
source ~/.bash_profile #环境变量生效
systemctl start caddy.service #启动caddy

caddy网页端管理

访问“https://nps.domain.tls”,输入上面配置文件里面的web_username和web_password登录。点击左边菜单“客户端”,点击“新增”按钮新增客户端。按照下图填写表单,填写好了,点击“新增”按钮保存。

新增客户端

查看客户端ID

客户端

大部分的客户端安装都比较简单,也基本是一键安装。这里还是以Linux 64Bit为例安装客户端。

1
2
3
mkdir -p /data/npc #找块地
wget https://github.com/ehang-io/nps/releases/download/v0.26.4/linux_amd64_client.tar.gz -O /data/linux_amd64_client.tar.gz #拿到货
tar xzf /data/linux_amd64_client.tar.gz -C /data/npc/ #卸货

编辑配置/data/npc/conf/npc.conf,内容如下(vkey是添加客户端时候需要用到的,详看caddy网页端管理那一步的图片,8.8.8.8换成真实的服务器IP地址)

1
2
3
4
5
6
7
8
9
10
[common]
server_addr=8.8.8.8:8024
conn_type=tcp
vkey=leochan.me
auto_reconnection=true
max_conn=1000
flow_limit=1000
rate_limit=1000
crypt=true
compress=true

执行以下命令,完成安装并启动客户端

1
2
3
cd /data/npc #找到解压目录
./npc install -config=/data/npc/conf/npc.conf #执行安装
npc start #启动客户端

域名解析

假设,本地局域网有一台机器,局域网IP是192.168.2.50,服务绑定的端口号是5000,绑定的域名是file.domain.tls。那么,请按照下图配置:

新增主机

配置好之后,我们回到反向代理那一步,处理一下域名。编辑/etc/caddy/Caddyfile,追加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
file.domain.tls {
gzip
redir 301 {
if {>X-Forwarded-Proto} is http
/ https://{host}{uri}
}
tls 10000@163.com
log /var/log/caddy/nps.log {
rotate_size 5
rotate_age 5
rotate_keep 2
rotate_compress
}
proxy / 127.0.0.1:20080 {
ransparent
}
}

重启一下caddy,收工了!!

后话

需要开辟另一篇来做以下nps的其他代理的介绍!!