什么是内网穿透

内网穿透,即NAT穿透,网络连接时术语,计算机是局域网内时,外网与内网的计算机节点需要连接通信,有时就会出现不支持内网穿透。

也就是说, 当你的某台计算机处于局域网中, 而你又需要在局域网外对其进行访问, 那么使用内网穿透, 将内网计算机映射至公网服务器的某个端口, 通过访问这一端口来实现访问内网计算机.

想要搭建基础的内网穿透, 你需要:

  • 外网具有独立公网 IP 地址的服务器
  • 内网计算机(没有公网 IP 却有暴露至公网的需求)

此外, 如果需要使用 web 服务的话, 你可能还需要一个域名.

常见的内网穿透包括花生壳, ngrok 等, 本文采用另一种方案: frp.

frp 是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持 tcp, http, https 等协议类型,并且 web 服务支持根据域名进行路由转发。

frp 的使用方法

frp 十分易用, 你需要分别在服务器端下载两个对应平台的程序, 你可以直接下载最新发行版本.

本文采用的公网服务器为 Ubuntu 16.04 LTS x64 版本, 因此下载 linux_amd64 版本安装包, 而内网计算机为树莓派, 下载 linux_arm 版.

你可以在 Release fatedier/frp 页面中找到最新的 frp 发行版本, 并使用下面的参考指令下载文件:

1
2
3
4
# Ubuntu 16.04 LTS x64
wget https://github.com/fatedier/frp/releases/download/v0.13.0/frp_0.13.0_linux_amd64.tar.gz
# 树莓派
wget https://github.com/fatedier/frp/releases/download/v0.13.0/frp_0.13.0_linux_arm.tar.gz

下载完成后使用 tar 指令解压压缩包, 进入解压出来的文件夹.

注意目录下的这几个文件:

  • frps - frp 服务器端的可执行文件, 客户端可删除此文件
  • frps.ini - frp 服务器端的配置文件, 客户端可删除此文件
  • frpc - frp 客户端的可执行文件, 服务器端可删除此文件
  • frpc.ini - frp 客户端的配置文件, 服务器端可删除此文件

一般来说如果只需要 ssh 隧道穿透的话使用最简配置即可.

在服务器端编辑 frps.ini 文件:

1
2
3
# frps.ini
[common]
bind_port = 7000

启动 frps:

1
./frps -c ./frps.ini

在客户端编辑 frpc.ini 文件:

1
2
3
4
5
6
7
8
9
10
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

启动 frpc:

1
./frpc -c ./frpc.ini

请注意: 在启动之前请确保文件可以被执行(使用 chmod +x filename 来增加执行权限)

这样就可以通过访问外网服务器的 6000 端口来访问内网计算机了:

1
ssh -oPort=6000 intranet_username@remote_server

同样地, 如果要反向代理 web 服务器, 就新建一个配置文件 frpc_http.ini 并在其中加入 web 服务器的信息:

1
2
3
4
5
6
7
8
9
# frpc_http.ini
[common]
server_addr = x.x.x.x
server_port = 7001 # 使用不同端口以避免冲突
auth_token = webserver # 如果有这一项, 则服务器和客户端都要记录令牌内容

[web]
type = http
local_port = 8081

对应的 frps_http.ini:

1
2
3
4
5
6
7
8
[common]
bind_port = 7001
vhost_http_port = 8081

[web]
type = http
custom_domains = x.x.x.x
auth_token = webserver

请注意:

  • 具体的配置信息既可以写在服务器上也可以写在客户端上, 如果同时使用哪个有效的话尚不确定, 保留一个就行了.
  • frp 只支持一个端口的转发, 如果要转发多个端口, 请使用多个配置文件.
  • 由于国内 80 端口被封禁, 请更改 http 监听端口(Ubuntu 中的 Apache 监听端口文件位于 /etc/apache2/ports.conf).
  • 不要忘记设置开机自动启动 frp 服务.

关于运行多个 frp 进程的补充说明

使用 nohup 来托管 frp, 以客户端为例:

1
2
3
4
# 不要省略 & 符号, 服务器端方法类似, 可以写入 rc.local 来实现开机启动
# 在 rc.local 中最好使用绝对路径
nohup ./frpc -c ./frpc.ini &
nohup ./frpc -c ./frpc_http.ini &

参考

frp 中文文档

使用frp实现内网穿透 - 群晖NAS+frp发挥更大作用