FRP 内网穿透 2020年12月16日 IT Tech 0次评论 3887次阅读 983字数 预计阅读时间3分钟 FRP 内网穿透 ### 01. 什么是FRP FRP 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 ### 02. 内网穿透可以做什么 内网穿透最主要的功能是**将内网中无公网IP的终端和设备暴露在公网中,使得用户可以在公网中访问内网中设备和服务**。 ### 03. 准备工作 1. 处于内网中的设备; 2. 具有公网IP的VPS; 3. FRP软件。 下面,我将利用一台VPS服务器(Centos 8.2)对内网中的设备(Ubantu 20)实现内网穿透。 ### 04. 安装及配置 1. 首先,在GitHub的FRP项目[下载页面](https://github.com/fatedier/frp/releases)下载最新release的软件,注意需要下载自己设备对应平台的软件;  1. 解压下载的FRP软件包,可以看到以下文件:  这里我们需要的文件有: - fprc:客户端程序; - frpc.ini:客户端程序配置文件; - frps:服务网器端程序; - frps.ini:服务器端程序配置文件; 1. 配置服务器端程序frps: 在具有公网 IP 的机器上部署 frps,修改 frps.ini 文件,这里使用了最简化的配置,设置了 frp 服务器用户接收客户端连接的端口: ```Ini [common] bind_port = 7000 dashboard_port = 7500 token = test dashboard_user = admin dashboard_pwd = admin ``` - `bind_port`表示用于客户端和服务端连接的端口,这个端口号我们之后在配置客户端的时候要用到; - `dashboard_port`是服务端仪表板的端口,若使用`7500`端口,在配置完成服务启动后可以通过浏览器访问 `x.x.x.x:7500` (其中x.x.x.x为VPS的IP)查看frp服务运行信息; - `token`是用于客户端和服务端连接的口令,可以自行设置并记录,稍后会用到; - `dashboard_user`和`dashboard_pwd`表示打开仪表板页面登录的用户名和密码,自行设置即可。 1. 配置客户端程序frpc: 在需要被访问的内网机器上(SSH 服务通常监听在 22 端口)部署 frpc,修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为 x.x.x.x: ```Ini [common] server_addr = x.x.x.x server_port = 7000 token = test [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000 ``` - `local_ip` 和 `local_port` 配置为本地需要暴露到公网的服务地址和端口; - `remote_port` 表示在 frp 服务端监听的端口,访问此端口的流量将会被转发到本地服务对应的端口。 1. 分别在服务器和内网设备上运行FRP: - 在服务器上任意路径下新建frp文件夹,将frps和frps.ini上传到该文件夹,然后在该文件路径下执行以下命令,启动frp ```Bash ./frps -c ./frps.ini ``` - 同样,在内网设备上新建frp文件夹并上传frpc和frpc.ini文件,并在该文件路径下执行以下命令,启动frp ```Bash ./frpc -c ./frpc.ini ``` 1. 配置开机自启动FRP服务: - 服务器端,在终端执行 ```Bash sudo nano /lib/systemd/system/frps.service ``` 然后输入以下配置并保存 ```Ini [Unit] Description=Frp Server Service After=network.target Wants=network.target [Service] Type=simple Restart=always RestartSec=5s # 这里修改为frp程序及配置所在的路径 ExecStart=/home/derrors/frp/frps -c /home/derrors/frp/frps.ini [Install] WantedBy=multi-user.target ``` 然后,在终端启动frp服务,并设置开机自启动 ```Bash sudo systemctl start frps sudo systemctl start frps ``` - 客户端,在终端执行 ```Bash sudo nano /lib/systemd/system/frpc.service ``` 然后输入以下配置并保存 ```Ini [Unit] Description=Frp Server Service After=network.target Wants=network.target [Service] Type=simple Restart=always RestartSec=5s # 这里修改为frp程序及配置所在的路径 ExecStart=/home/derrors/frp/frpc -c /home/derrors/frp/frpc.ini [Install] WantedBy=multi-user.target ``` 然后,在终端启动frp服务,并设置开机自启动 ```Bash sudo systemctl start frpc sudo systemctl enable frpc ``` ### 05. 常见问题 1. 使用ssh连接时,连接超时并出现以下信息 ```Bash ssh: connect to host xx.xx.xx.xx port xx: Operation timed out ``` **原因:服务器防火墙未开放frp配置中对应的****`remote_port`****端口;** **解决:在服务器的防火墙中开放相应端口。** 1. 连接被拒绝,出现以下信息 ```Bash ssh: connect to host xx.xx.xx.xx port xx: Connection refused ``` **原因:服务器防火墙未开放frp配置中对应的****`server_port`****端口;** **解决:在服务器的防火墙中开放相应端口。** 1. 连接被远程主机关闭,出现以下信息 ```Bash kex_exchange_identification: Connection closed by remote host ``` 原因:可能是客户端的sshd服务出现了错误,在客户端执行命令 ```Bash systemctl status sshd.service ``` 可看到以下日志信息 ```Bash Jun 06 00:48:43 bogon systemd[1]: sshd.service: main process exited, code=exited, status=255/n/a Jun 06 00:48:43 bogon systemd[1]: Failed to start OpenSSH server daemon. Jun 06 00:48:43 bogon systemd[1]: Unit sshd.service entered failed state. Jun 06 00:48:43 bogon systemd[1]: sshd.service failed. ``` 执行命令 ```Bash /usr/sbin/sshd -t ``` **通过显示的信息可确定是****`/etc/ssh/sshd_config`****中出现了错误** ```Bash /etc/ssh/sshd_config line 135: Bad Match condition ``` **解决:修改****`/etc/ssh/sshd_config`****中出现的对应错误,然后重启sshd服务** ```Bash systemctl restart sshd ``` 1. **安装宝塔面板后,FRP服务失效** **原因:宝塔面板打开默认关闭的UDP;** **解决:执行以下命令,打开防火墙的相关配置:** ```Bash sudo /etc/init.d/ufw stop ``` 本文由 Derrors 创作,采用 知识共享署名4.0 国际许可协议. 最后编辑时间: 2021年01月28日 21:44.