-
下载frp, 使用
curl -# -LJO <地址>下载frp 的安装包, 地址在GitHub寻找:https://github.com/fatedier/frp/releases, 会下载到当前文件夹. -
使用
tar -zxvf <文件名>解压. 会解压到一个新文件夹. 然后使用mv 1 2来给文件夹重新命名(可选步骤). -
删除安装包:
rm frp_0.52.3_linux_amd64.tar.gz -
编辑服务器配置文件
frps.toml来允许http代理穿透和ssh的代理穿透.# frps.toml bindPort = 7000 #内部通信端口 vhostHTTPPort = 8080 #向外暴露的http端口, 使用的时候输入的网址也是这个端口 auth.method = "token" #授权方法为密匙 auth.token = "1234" #密匙内容
-
在vps的网页管理端加入防火墙规则, 允许使用7000 以及 6000 端口进行入站通讯.
-
服务启动命令:
./frps -c ./frps.toml, 要在安装frp的目录内执行.
可以在~/.profile文件中加入下面一句, 下次可以使用命令 frp-start快速启动:
alias frp-start='~/frp_0.52.3_linux_amd64/frps -c ~/frp_0.52.3_linux_amd64/frps.toml'-
下载同样的frp:
curl -# -LJO https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz -
使用命令解压:
tar -zxvf frp_0.52.3_linux_amd64.tar.gz -
删除安装包:
rm frp_0.52.3_linux_amd64.tar.gz -
编辑客户机配置文件
frpc.toml, 结果如下:serverAddr = "192.9.179.x" #vps的ip serverPort = 7000 #vps的内部通讯端口 auth.method = "token" #验证方法为密匙 auth.token = "1234" #密匙内容服务端要和客户端一致 [[proxies]] name = "web" #不重要的名字 type = "http" #协议, 如果要放网页就用http localIP = "192.168.3.139" #内网服务器的ip localPort = 8080 #内网服务器的web服务端口, 不重要, 主要看本地的服务对外端口是什么, 跟服务器上暴露的无关 customDomains = ["192.x.179.x"] #vps的域名, 没有域名就用IP地址 [[proxies]] name = "ssh" #ssh服务 type = "tcp" localIP = "192.168.3.139" localPort = 22 remotePort = 6000 #vps服务器上需要在防火墙打开的端口
-
启动命令:
./frpc -c ./frpc.toml, 要在frp安装目录下运行. -
可以在
~/.profile文件中加入下面一句, 下次可以快速启动:alias frp-start='~/frp_0.52.3_linux_amd64/frpc -c ~/frp_0.52.3_linux_amd64/frpc.toml' -
frp支持多个客户端. 使用frp服务器来代理ssh, 那么在客户端配置上, 只需要如下配置就可以. 例如
serverAddr = "192.9.xxx.x" #vps的ip serverPort = 7000 #vps的绑定端口 auth.method = "token" #验证方法为密匙 auth.token = "1234" #密匙内容服务端要和客户端一致 [[proxies]] name = "ssh2" #ssh服务 type = "tcp" localIP = "192.168.3.156" localPort = 22 remotePort = 6001
- 可以看到这台机器的配置上内网地址变了, 说明是不同的机器. 服务器需要暴露的端口也变了, 这样就可以区分不同的内网机器了.
- 还有
name参数也要跟别的机器区分开, 不然同时使用就会有冲突. - 要注意同样需要在vps上打开6001端口.
-
如果要在一台机器上部署多个服务, 代理类型用tcp就可以, 也可以兼容常见的http服务. 例如:
serverAddr = "xxx.xxx.xxx.xxx" serverPort = 7000 auth.method = "token" auth.token = "xxxx" [[proxies]] name = "app1" type = "http" localIP = "192.168.3.131" localPort = 8081 #因为这里是http类, 不用指定代理机器上的端口, 机器上有vhttphost参数统一指定 [[proxies]] name = "app2" type = "tcp" localIP = "192.168.3.131" localPort = 808 remotePort = 8897 # 第二个服务 [[proxies]] name = "ssh" type = "tcp" localIP = "192.168.3.131" localPort = 22 remotePort = 6002 #ssh 服务
- 以上8897端口和6002端口要在代理服务器(frp server端)打开.
-
可以使用插件来提供frp客户端机器上静态文件访问的服务.
serverAddr = "x.x.x.x" serverPort = 7000 auth.method = "token" auth.token = "xxxx" [[proxies]] name = "static_file" type = "tcp" remotePort = 8897 [proxies.plugin] type = "static_file" # 本地文件目录,对外提供访问 localPath = "/home/johnson/luck44" # URL 中的前缀,将被去除,保留的内容即为要访问的文件路径 stripPrefix = "lucky" httpUser = "abc" httpPassword = "abc"
- localPath是本机的文件目录路径
- stripPrefix 是URL的请求子目录
- 然后要填入用户名和密码
- 使用网址
http://x.x.x.x:8897/lucky来访问这个文件服务器 - 共享文件夹内容发生变化以后, 要reload frp服务
-
首先在
/lib/systemd/system/建立frp.service对象文件, 其中写入:[Unit] Description=FrpService After=network-online.target #在网络启动后执行Frp服务 Wants=network-online.target [Service] Type=simple User=root #以root权限运行 Restart=on-abort #停止时重启 ExecStart=/home/ubuntu/frp_0.52.3_linux_amd64/frps -c /home/ubuntu/frp_0.52.3_linux_amd64/frps.toml #不能在路径中使用~符号, 要写绝对路径 上面是服务端 ExecStart=/home/johnson/frp_0.52.3_linux_amd64/frpc -c /home/johnson/frp_0.52.3_linux_amd64/frpc.toml #以上为客户端 [Install] WantedBy=multi-user.target
systemctl start frp.service启动服务systemctl stop frp.service停止服务systemctl enable frp.service设置开机启动, 同理设为disable就是不要开机启动systemctl status frp.service查看服务状态systemctl daemon-reload修改服务配置文件后要重新加载
-
然后在
~/.profile文件里面加入下面两句用来快速启动和关闭:alias frp-start='sudo systemctl start frp.service', 使用frp-start即可alias frp-stop='sudo systemctl stop frp.service', 使用frp-stop即可alias frp-status='sudo systemctl status frp.service'alias frp-restart='sudo systemctl restart frp.service'
- frp的服务器端(VPS端)要先启动, 客户端才能启动成功. 两者不独立. 客户端依赖于服务器端. 所以启动时要注意顺序.
- 在实际使用中发现问题, 此服务在开机时会启动失败需要手动启动. 在服务的定义文件中, 执行可执行命令语句之前加入一句
ExecStartPre=/bin/sleep 10, 延时10秒, 等待网络启动完毕以后就可以自动启动成功.