相信玩NAS、软路由一类的同学都有这样一个诉求,就是随时随地地访问到家里的设备。大家听到的异地组网,VPN方案,内网穿透,反向代理等说法,都是实现这个诉求的,当时每一种也有一定的差异,感兴趣的可以自行查阅这些说法背后的原理和依赖的技术工具。
家庭网络一般只有公网v6地址,这个时候,可以使用动态DNS来实现远程访问,参考之前的文章 OpenWrt配置和使用DDNS-GO。今天说只有v4的情况下,采用frp怎么来实现外网访问家里的设备。
主要优点:
缺点:
A机器:内网机器,可以上外网 。即你家里的软路由或者nas设备
B机器:拥有公网ip,一般是云主机,或者vps
frp分为客户端和服务端,根据你的cpu和系统的情况,从github上可以直接拉取安装包,客户端和服务端的包都一样:
# x86 64位架构
wget https://github.com/fatedier/frp/releases/download/v0.59.0/frp_0.59.0_linux_amd64.tar.gz
tar xvf frp_0.59.0_linux_amd64.tar.gz
cd frp_0.59.0_linux_amd64
# 修改服务端监听端口
cat frps.toml
bindPort = 7000 #根据需要修改端口
# 以下命令启动服务器:
./frps -c ./frps.toml
使用systemd来管理服务,便于启动,停止等。
前提是需要系统安装systemd
# 查看是否安装systemd
system -h
# 使用 yum 安装 systemd(CentOS/RHEL)
yum install systemd
# 使用 apt 安装 systemd(Debian/Ubuntu)
apt install systemd
编辑服务文件 vim /etc/systemd/system/frps.service 填入如下内容:
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /path/to/frps -c /path/to/frps.toml
[Install]
WantedBy = multi-user.target
常见的命令
# 启动frp
sudo systemctl start frps
# 停止frp
sudo systemctl stop frps
# 重启frp
sudo systemctl restart frps
# 查看frp状态
sudo systemctl status frps
# 配置开机启动
sudo systemctl enable frps
部署 frpc 并编辑 frpc.toml 文件,假设 frps 所在服务器的公网 IP 地址为 x.x.x.x。以下是示例配置:
serverAddr = "x.x.x.x" # 这里是B机器的公网ip
serverPort = 7000 # 这个是B机器上frps开启的服务端口
# proxies部分,可以配置多个,根据不同的服务配置
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1" # 配置为需要从公网访问的内网服务的地址和端口。
localPort = 22 # 本地服务的端口
remotePort = 6000 # remotePort 表示在 frp 服务端监听的端口,访问此端口的流量将被转发到本地服务的相应端口。不是frps监听的服务端口
[[proxies]]
name = "xxwebservice"
type = "tcp"
localIP = "127.0.0.1" # 配置为需要从公网访问的内网服务的地址和端口。
localPort = 8080 # 本地服务的端口
remotePort = 6001 # remotePort 表示在 frp 服务端监听的端口,访问此端口的流量将被转发到本地服务的相应端口。不是frps监听的服务端口
同样的,客户端也可以使用systemd来管理,
vim /etc/systemd/system/frpc.service
[Unit]
# 服务名称,可自定义
Description = frp client
After = network.target syslog.target
Wants = network.target
[Service]
Type = simplec
# 启动frpc的命令,需修改为您的frps的安装路径
ExecStart = /path/to/frpc -c /path/to/frpc.toml
[Install]
WantedBy = multi-user.target
常见日常命令
# 启动frp
sudo systemctl start frpc
# 停止frp
sudo systemctl stop frpc
# 重启frp
sudo systemctl restart frpc
# 查看frp状态
sudo systemctl status frpc
# 配置开机启动
sudo systemctl enable frpc
至此, 配置完成。可以通过你的公网ip,跳转访问内网服务了。
启动frps和frpc,通过如下命令,访问内网机器,假设用户名是test
ssh -o Port=6000 test@x.x.x.x
frp 将请求发送到 x.x.x.x:6000 的流量转发到内网机器的 22 端口。
其他管理以及应用配置,参考官方文档和以及git的仓库。
frp官网帮助文档
frp官方github仓库