利用公网IP+内网穿透访问本地服务

点对点与C/S方案

上回说到异地组网的方案,虽然免费,高速,但是随着长时间的使用,也出现了一些问题。

  1. 设备要支持开启客户端
    这其实不是一个大问题,电脑和手机可以开启客户端是理所当然的,这部分设备带出门也可以使用,而其他无法开启客户端的设备也可以通过路由器进行组网,这部分设备一般不会带出门,影响不大。我其实就是不想每次都要点开客户端
  2. 对网络环境的要求较高
    虽然有一端是IPV6公网的设备,但如果你正处于较差的网络环境中(例如商场、咖啡店和酒店的公共WiFi),此时开启点对点穿透,可能会出现无法连接上服务提供商的节点,或者打洞失败的情况。以ZeroTier和Tailscale举例,如果打洞失败,则会使用自身的节点直接转发,但此时的速度就无法保证了。因此,点对点的穿透方案较为适合在多个固定的地点部署,实现多个地点之间的异地组网。
  3. 对客户端的审查风险
    如果你在公司或者安全要求较高的地点打开点对点内网穿透,虽然管理人员无法获取你与另一边的传输内容,但是可以探测到你正在使用此类服务,从而对你发出警告。我真的被警告过 所以,一个公网IPV4服务器还是很有必要的,可以弥补点对点内网穿透没有覆盖的情境,我将这种需求总结为两点:
  4. 高通用性——哪里都能用
  5. 低流量——在无法点对点穿透的场景使用,频率较低,降低公网服务器的使用成本
    通过两种方法共同覆盖自己的访问需求,从我的实际应用来说,大流量交换的需求在家进行,离开路由器则使用公网服务。

内网穿透

接下来就是内网穿透的方案,由于有公网服务器的参与,这部分的原理较为简单,现存的软件都比较轻量化,试用过后,我觉得Frp和NPS是其中较为好用的两种。两者略有不同,可以按需选择。

首先是NPS,NPS的端口配置部分在服务器上,客户端只作为一个终端连接上服务器。这种架构比较适合个人用户控制名下的所有客户端,可以先将客户端连接到服务器,再决定要穿透哪些服务,或者随时关闭服务。

Frp的配置方法和NPS相反,所有的配置文件存储在客户端,服务器则负责提供内网穿透服务供客户端使用。这种架构比较适合将内网穿透服务公开给非特定的人群使用,有需要的用户都可以通过鉴权或非鉴权的方式登录到服务器,自行配置内网穿透服务,在配置的层面做到互不干扰。

NPS

接下来详细介绍如何在服务端和客户端配置NPS

服务端

  1. 通过wget或其他方式将安装包传输至服务器并解压

    1
    2
    3
    wget https://github.com/ehang-io/nps/releases/download/v0.26.10/linux_amd64_server.tar.gz
    mkdir nps
    tar -zxvf ./linux_amd64_server.tar.gz -C nps
  2. 进入nps文件夹中,安装nps

    1
    2
    chmod 755 ./nps # 如果需要权限
    ./nps install # 安装
  3. 修改配置文件,以下提供一些建议修改的部分

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # /etc/nps/conf/nps.conf
    #修改web的默认账号密码端口
    web_username=admin
    web_password=123
    web_port = 8080

    #http代理 建议删除
    #HTTP(S) proxy port, no startup if empty
    http_proxy_ip=0.0.0.0
    http_proxy_port=80
    https_proxy_port=443
    https_just_proxy=true
    #default https certificate setting
    https_default_cert_file=conf/server.pem
    https_default_key_file=conf/server.key
  4. 启动!

    1
    2
    3
    4
    ./nps start
    # 其他命令
    ./nps stop|restart
    ./nps update|uninstall
  5. 服务器ip:8080进入web设置界面,通过配置文件设置的密码登录nps,点击左边菜单的客户端-新增,进入客户端设置,可以使用默认配置新增一个客户端,也可以自定义。完成后刷新,点击红框处的+号可以查看客户端命令,接下来会用到。

客户端

  1. 下载对应的客户端,参照服务端的第1步,客户端为client后缀的压缩包
  2. 进入文件夹,执行上文提到的客户端命令,根据情况不同,建议在server和veky上增加双引号,如下所示
1
./npc -server="xxx" -vkey="xxx" -type=tcp

通过这种方法启动,只要关闭终端,程序就关闭了。
当然,npc也是支持安装的,其实就是上面nps的命令。

1
2
3
4
5
./npc install -server="xxx" -vkey="xxx" # 或者-config=xxx
./npc start
# 其他命令
./npc stop|restart
./npc update|uninstall

也支持通过配置文件连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[common]
server_addr=127.0.0.1:8024 #修改
conn_type=tcp
vkey=123 #修改
auto_reconnection=true
max_conn=1000
flow_limit=1000
rate_limit=1000
basic_username=11
basic_password=3
web_username=user
web_password=1234
crypt=true
compress=true
#pprof_addr=0.0.0.0:9999
disconnect_timeout=60
  1. 连接成功之后,在服务端的web页面客户端菜单中,此条目的[连接]状态会变为[在线]。

docker

如果你由于某种原因不能使用完整的linux环境,nps也有第三方的docker方案,需要将配置文件映射到容器。

https://github.com/iAsuma/nps-docker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 服务端
version: "3"
services:
nps:
image: iasuma/nps
container_name: nps
volumes:
- ./conf:/etc/nps/conf:rw
network_mode: host
restart: always

# 客户端
version: "3"
services:
nps:
image: iasuma/npc
container_name: npc
volumes:
- ./conf:/etc/npc/conf:rw
restart: always
network_mode: host
Author: Links
Link: http://blog.taiho.cc/post/Nat/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.