frp内网穿透
Cleo Lv2

通常,局域网如教育网内的主机无法通过教育网以外的机器进行连接,因此需要做内网穿透,即将内网的ip暴露在公网。frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网,且frp是开源的,免费的,无需任何账户注册、登录,支持Linux、Mac、Windows等多个平台。本文介绍如何针对内网主机使用frp进行内网穿透。

准备

  • 在公网的主机A,可以是云服务器,也可以是自己的PC。
  • 在内网的主机B,也就是需要访问的目的主机。

配置

主机A

这里以Ubuntu 18.04 LTS为例。首先从frp官网下载对应的包,注意一定要下载正确的架构。这里以v0.38.0为例:

1
2
3
wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz
tar -xzvf frp_0.38.0_linux_amd64.tar.gz
cd frp_0.38.0_linux_amd64

解压之后可以看frp目录下有这些文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
frp_0.38.0_linux_amd64
|
|-- frpc # 客户端程序
|-- frpc_full.ini # 客户端完整配置文件
|-- frpc.ini # 客户端配置文件
|-- frps # 服务器程序
|-- frps_full.ini # 服务器端完整配置文件
|-- frps.ini # 服务器端配置文件
|-- LISENSE
|-- systemd
|
|-- xxx
|-- xxx

主机A为公网能访问的服务器,我们将它作为代理,需要在主机A上运行frp的服务器端,也就是fprs。首先需要配置服务器端的配置文件,使用vim frps.ini进行编辑,内容如下:

1
2
3
4
5
6
7
8
[common]
bind_port = 7000

# dashboard
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
enable_prometheus = true

bind_port为服务器程序运行时需要打开的端口,dashboard_port为后台管理程序的端口,用户名和密码可以自行设置。注意这两个端口都需要通过防火墙打开,Ubuntu 18.04 LTS打开命令为:

1
2
3
sudo ufw allow 7000
sudo ufw allow 7500
sudo ufw reload

保存配置后,就可以启动frps:

1
./frps -c frps.ini

此时,可以访问x.x.x.x:7500来测试是否能进入dashboard,成功进入,说明启动成功。

主机B

主机B为内网服务器,同样首先下载frp后解压,主机B需要运行frpc也就是frp客户端,因此先配置客户端配置文件,使用命令vim frpc.ini,内容如下:

1
2
3
4
5
6
7
8
9
[common]
server_addr = x.x.x.x # 这里填写你的主机A的公网IP地址
server_port = 7000

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

为主机B打开端口:

1
2
3
4
sudo ufw allow 7000
sudo ufw allow 22
sudo ufw allow 6000
sudo ufw reload

为主机A打开额外的6000端口:

1
2
sudo ufw allow 6000
sudo ufw reload

这里的6000端口配置文件中写的是remote_port,不太清楚指的是主机A还是主机B,我的理解应该是通过主机A的端口6000转发,这里就先都开放。

接着运行frp客户端程序:

1
./frpc -c frpc.ini

ssh连接测试

这里注意,端口号要使用6000,IP地址要用公网主机A的IP地址,用户名用内网主机B的用户名:

1
ssh -p 6000 username@x.x.x.x

输入密码内网主机B的用户名对应的密码即可完成连接。

其他

后台运行

frpc和frps当终端退出时也就自动退出,为了能够一直在后台运行,可以使用nohup命令在后台挂起:

1
2
3
4
# 公网主机A
nohup ./frps -c frps.ini &
# 内网主机B
nohup ./frpc -c frpc.ini &

ssh免密登录

每次ssh登录都要输密码太麻烦,只要把本地主机的ssh公钥放在远程主机的.ssh/authorized_keys中即可,如果没有公钥,则生成:

1
2
ssh-keygen -t rsa -C "邮箱"   # 或 ssh-keygen -o
cat .ssh/id_rsa.pub

将公钥复制后拷贝近远程主机的.ssh/authorized_keys中即可。