Featured image of post Frp内网穿透

Frp内网穿透

intranet penetration by frp

之前通过 AutoSSH 实现内网穿透,但是只能 SSH 远程服务器,将网络穿透工具升级为 Frp,实现 TCP(SSH) 和 HTTP(s) 网络连接


之前的博客介绍了通过 AutoSSH 来配置远程 SSH 服务器连接,后面由于云服务器的配置有限,就把一些应用服务迁移到本地的机子上,因此需要配置 Http 转发来外网访问服务,采用 Frp 来实现内网穿透。

前期准备

公网服务器一台,内网服务器一台,公网服务器绑定域名1个

公网服务器配置

ssh连接到公网服务器上,新建目录

1
mkdir -p /usr/local/frp

根据对应的操作系统及架构,从 Frp 项目的 Release 页面下载最新版本的程序。

1
2
3
4
5
# 例如远程服务器是 Ubuntu 18.04 系统
wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz

# 解压
tar -zxvf  frp_0.38.0_linux_arm64.tar.gz

解压后得到的文件中,frpsfrps.ini为服务端软件和配置文件,frpcfrpc.ini为客户端软件和配置文件。此处我们先配置服务端,frpcfrpc.ini两个文件可删除,接下来修改 frps.ini 文件,添加如下配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# frps.ini
[common]
bind_port = 7000
vhost_http_port = 8888
vhost_https_port = 8889
max_pool_count = 20
allow_ports = 2000-3000 #端口白名单
dashboard_port = 8008 #frp管理后台端口
dashboard_user = admin #管理后台用户名
dashboard_pwd = admin #管理后台密码
token = 12341234 #客户端也要配置一样的token
authentication_timeout = 90000 #超时时间

保存然后启动服务

1
2
3
./frps -c ./frps.ini
# 这是前台启动,后台启动命令为
nohup ./frps -c ./frps.ini &

可以通过访问 http://xx.xx.xx.xx:8008 访问frp服务的监控界面,账号密码与上面配置的一致。

内网服务器配置

与服务端类似,根据对应的操作系统及架构,从 Frp 项目的 Release 页面下载最新版本的程序。

1
2
3
4
5
# 例如系统是 Ubuntu 20.04
wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz

# 解压
tar -zxvf  frp_0.38.0_linux_amd64.tar.gz

然后再进行客户端配置,修改 frpc.ini 文件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
[common]
server_addr = 150.158.170.242 #远程VPS服务器地址
server_port = 7000
token = 12341234 #与服务端一致
tls_enable = true #是否开启TLS认证

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

[web]
type = http
local_port = 8280
custom_domains = domain.domain.com #自定义域名
use_encryption = true #是否开启加密
use_compression = true #是否开启压缩

开机自启动

为了防止因为网络、供电或者重启等问题导致 Frp 失效,所以写了一个开机启动服务,本地服务器的配置如下:

1
vim /etc/systemd/system/frp.service
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[Unit]
Description=frp
After=network.target
Wants=network.target

[Service]
TimeoutStartSec=30
Type=simple
ExecStart=/usr/local/frp/frpc -c /usr/local/frp/frpc.ini
ExecStop=/bin/kill
Restart=on-failure
RestartSec=60s

[Install]
WantedBy=multi-user.target

启动服务

1
systemctl restart frp.service

对于服务器端,也配置了一个开机启动服务,如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[Unit]
Description=frp

[Service]
TimeoutStartSec=30
Type=simple
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini
ExecStop=/bin/kill $MAINPID
Restart=on-failure
RestartSec=60s

[Install]
WantedBy=multi-user.target