“演示如何利用内网穿透工具FRP,实现域名访问内网Web服务;外网SSH访问内网主机;图文描述FRP基本原理。”
效果
前提条件
-
有固定公网IP地址的主机(下文命名为public)
-
可访问公网的内网主机(下文命名为internal)
下载安装
在public主机和internal主机上分别下载对应系统的frp程序压缩包。作者的公网主机和内网主机均为CentOS系统,因此在两台主机上均执行如下命令进行下载安装。(其他系统的安装包可以通过Github搜索frp仓库的发布页面进行下载)
wget https://github.com/fatedier/frp/releases/download/v0.37.0/frp_0.37.0_linux_amd64.tar.gz
tar -zxf frp_0.37.0_linux_amd64.tar.gz -C $HOME
# 建议修改解压后的文件夹名称
mv $HOME/frp_0.37.0_linux_amd64 $HOME/frp
# 建立软连接方便后续调用执行
ln -s $HOME/frp/frpc /usr/local/bin/frpc
ln -s $HOME/frp/frpc /usr/local/bin/frpc
访问内网Web服务
想要通过浏览器以 http://公网ip:8000 的方式,访问内网主机_80端口_上的Web服务,仅需要:
- 在public主机上修改配置文件frps.ini为:
[common]
bind_port = 7000
vhost_http_port = 8000
- 在internal主机上修改配置文件frpc.ini为:
[common]
server_addr = x.x.x.x
server_port = 7000
[web]
type = http
local_port = 80
custom_domains = your_domain
分别在内网主机启动frpc客户端程序,公网主机启动frps服务端程序:
# internal主机上
frpc -c ./frpc.ini
# public主机上
frps -c ./frps.ini
(注意配置文件中的端口需要保证可访问,其中x.x.x.x为你的公网主机IP地址)
此时即可通过 http://公网ip:8000 访问你部署在内网中的Web服务了。
SSH访问内网
在public主机上修改 frps.ini 文件,仅需设置 frp 服务器用户接收客户端连接的端口:
[common]
bind_port = 7000
在需要被访问的internal主机上修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为 x.x.x.x:
[common]
server_addr = x.x.x.x
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
(SSH 服务通常监听在 22 端口)
local_ip:内网主机需要暴露到公网的服务地址
local_port:内网主机需要暴露到公网的配置端口
remote_port:frp 服务端监听的端口
(访问remote_port端口的流量将会被转发到本地服务对应的端口)
分别在内网主机上启动frp客户端程序,公网主机上启动frps服务端程序:
# internal主机上
frpc -c ./frpc.ini
# public主机上
frps -c ./frps.ini
此时即可通过 SSH 访问内网机器,假设用户名为 test:
ssh -oPort=6000 test@x.x.x.x
(frp 会将请求 x.x.x.x:6000 的流量转发到内网机器的 22 端口)
FRP基本原理
几点优势
-
在可通过内网穿透技术发挥闲置电脑的余热,简单部署即可轻松获得公网可访问的Web服务(不建议在生产环境中这么做)
-
没有VPN一样能够访问内网,且部署成本更低