内网穿透 by FRP

前期准备

  • 具有公网IP的服务器
  • 本地主机(内网机器,内网服务器)

服务器配置(具有公网IP的服务器)

下载并解压frp包

$ wget https://github.com/fatedier/frp/releases/download/v0.30.0/frp_0.30.0_linux_amd64.tar.gz
$ tar -xf frp_0.30.0_linux_amd64.tar.gz
$ cd frp_0.30.0_linux_amd64

Tips:选择对应的安装包,由于服务器和本地主机都是ubuntu系统,选择了linux_amd64安装包

配置frps.ini文件

frps.ini文件内容为

[common]
bind_port = 7000

如果不设置token的话不用修改

运行frps

$ ./frps -c frps.ini

出现下面的信息就代表运行成功了

[I] [service.go:141] frps tcp listen on 0.0.0.0:7000
[I] [root.go:205] start frps success

如果希望后台运行的话

$ nohup ./frps -c frps.ini &

本地主机配置(本地服务器)

下载frp包

$ wget https://github.com/fatedier/frp/releases/download/v0.30.0/frp_0.30.0_linux_amd64.tar.gz
$ tar -xf frp_0.30.0_linux_amd64.tar.gz
$ cd frp_0.30.0_linux_amd64

Tips:一般内网穿透的都是本地的服务器

配置frpc.ini文件

frpc.ini文件内容为

[common]
server_addr = 服务器公网IP
server_port = 7000

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

local_port是通过内网ssh连接本地主机时的端口
remort_port是设置的通过公网IP连接本地主机的端口

如果要用一台公网IP服务器为两台本地主机做内网穿透,则第二台内网主机的frpc.ini文件改成下面的样子

[common]
server_addr = 服务器公网IP
server_port = 7000

[ssh1] 
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6667

frp是通过[ssh]这个名称来区分客户端的,第一台本地主机已经使用了[ssh]这个名称,第二台改成[ssh1],同时remote_port也要改成未使用的端口

运行frpc

$ ./frpc -c frpc.ini

出现下面的信息就代表运行成功了

[I] [service.go:130] frps tcp listen on 0.0.0.0:7000
[I] [root.go:207] Start frps success
[I] [service.go:319] client login info: ip [xxxxx] version [0.30.0] hostname [] os [linux] arch [amd64]
[I] [proxy.go:217] [7940291c148c2fca] [ssh] tcp proxy listen port [6666]
[I] [control.go:335] [7940291c148c2fca] new proxy [ssh] success

如果希望后台运行的话

$ nohup ./frpc -c frpc.ini &

通过公网IP访问本地主机

$ ssh userName@public_IP -p remote_port 

remote_prort是frpc.ini中设置的端口

使用Systemctl设置开机自启动

在服务器上配置(具有公网IP的服务器)

$ sudo vim /lib/systemd/system/frps.service

创建并且编辑frps.service文件
填写以下内容:

[Unit]
Description=frps
[Service]
Type=simple
ExecStart=/home/userName/frp_0.30.0_linux_amd64/frps -c /home/userName/frp_0.30.0_linux_amd64/frps.ini
[Install]
WantedBy=multi-user.target

ExecStart填写要执行的命令(通过根目录运行指令)

然后启动frps.service

$ sudo systemctl start frps
$ sudo systemctl enable frps

在本地主机上配置(本地服务器)

$ sudo vim /lib/systemd/system/frpc.service

创建并且编辑frpc.service文件
填写以下内容:

[Unit]
Description=frp

[Service]
Type=simple
ExecStart=/opt/frp_0.30.0_linux_amd64/frpc -c /opt/frp_0.30.0_linux_amd64/frpc.ini

[Install]
WantedBy=multi-user.target

ExecStart填写要执行的命令(通过根目录运行指令)

然后启动frpc.service

$ sudo systemctl start frpc
$ sudo systemctl enable frpc

可能出现的错误(connect time out)

由于我使用的是阿里云服务器,默认不允许6666端口的使用(frpc.ini中的remote_port)
需要登录阿里云的控制台配置
"规则配置"
"规则配置"

上图允许6000端口(remote_port)连接
接着允许7000端口(bind_port)的连接

Reference

阿里云服务器实现 frp 内网穿透
frp 配置内网穿透、ssh远程访问、systemctl 自启动