简介
我们来假设一种场景,就是如何能让我们在公网访问局域网内部不具有公网ip的服务器?
解决方案至少有三个:
- 在局域网的出口路由器上实现端口映射。但是此种方案依赖于出口路由上的固定公网ip,对于家庭网络以及部分小型公司网络来讲,都不具备固定公网ip的条件。
- 基于第一种方案的改进,虽然不具备固定公网ip,但只要是动态公网ip也可以。就是使用ddns方案,来实现公网ip的动态映射。前提是仍然得要有公网ip,只不过不再需要这个公网ip非得固定。事实上,在现在一些家庭网络中,我们的出口ip甚至不是公网ip,在这种情况下,这种方案也无法使用了。
- 基于内网穿透的方案。简单讲,就是在公网上找一台固定的服务器,这台服务器得要有公网ip,将这台服务器配置为一个服务端,将内网中的所有需要在公网被访问到的服务器配置为客户端。但我们需要访问内网中的服务器时,直接访问公网上这台服务器,这台服务器来帮助我们转发请求至内网之中。
frp实现了第3种方案,除此之外,还有ngrok以及其他开源解决方案
下面是内网穿透的架构图:
frp项目地址:https://github.com/fatedier/frp
配置
服务端
frp的配置相对比较简单
- 安装
wget https://github.com/fatedier/frp/releases/download/v0.24.1/frp_0.24.1_linux_amd64.tar.gz
tar xf frp_0.24.1_linux_amd64.tar.gz -C /alidata/server/
cd /alidata/server
ln -s frp_0.24.1_linux_amd64 frp
- 修改配置文件
# 默认情况下,在安装目录中就有frps_full.ini的示例文件,里面绝大多数配置项不需要修改,下面简单列下需要的变更
[common]
# 服务端监听的地址和端口
bind_addr = 0.0.0.0
bind_port = 7000
# web端监听的地址和端口
dashboard_addr = 0.0.0.0
dashboard_port = 7500
# web端登录的帐号和密码
dashboard_user = admin
dashboard_pwd = 12345678
# 用于客户端验证的token
token = 12345678
# 允许代理的端口号列表,如果客户端有需要代理的端口号不在此范围,需要添加
allow_ports = 2000-3000,3001,3003,4000-50000
- 创建启动文件
#cat /etc/systemd/system/frp.service
[Unit]
Description=https://github.com/fatedier/frp/
[Service]
Type=simple
ExecStart=/alidata/server/frp/frps -c /alidata/server/frp/frps_full.ini
Restart=always
KillMode=process
RestartSec=1
[Install]
WantedBy=multi-user.target
- 启动
systemctl daemon-reload
systemctl restart frp
客户端
客户端,我这里就直接用容器拉起来了,下面给出docker-compose的写法:
version: '3'
services:
frp-client:
image: oldiy/frpc:0.24.1
restart: always
network-mode: host
volumes:
- "/volume2/docker/frpc/conf/frpc.ini:/frp/frpc.ini"
/volume2/docker/frpc/conf/frpc.ini
配置文件示例如下:
[common]
# 服务端ip和port
server_addr = xx.xx.xx.xx
server_port = 7000
# 连接服务端使用的token
token = 12345678
# 映射本地27100端口至服务端的27100
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 27100
remote_port = 27100
[baidupcs]
type = tcp
local_ip = 127.0.0.1
local_port = 5299
remote_port = 5299
[transmission]
local_port = 9091
remote_port = 9091
# 映射本地5000-5001端口至服务端的5000-5001
[range:web]
local_port = 5000-5001
remote_port = 5000-5001
拉起服务:
docker-compose up -d
需要说明的是,客户端版本尽可能与服务端保持一致
验证
直接访问frp服务端的dashboard即可: