frp内网穿透
## 原理
frp(fast reverse proxy)分为Server端和Client端,Server端安装在带有公网IP的服务器上,Client安装在内网环境但能上网的普通PC中。
流程:
- Server端提供一个bind_port端口,Client端提供remote_port端口和local_port端口
- Client端通过Server_IP+bind_port找到Server端,并告诉Server端我需要一个端口remote_port
- Server端在本地监听remote_port端口,把通过remote_port端口的流量传给remote_port对应的Client
- Client端把从Server端remote_port传过来的流量传到配置的local_port
用户访问流程:
- 用户通过访问Server_IP:remote_prot,相当于访问Client_IP:local_port。其中Client_IP(为内网IP),相当于实现了内网穿透
如图:
安装Server端
进入下载页面,下载frp_0.33.0_linux_amd64.tar.gz后,运行以下命令:
# 解压并进入目录
tar -zxvf frp_0.33.0_linux_amd64.tar.gz && cd frp_0.33.0_linux_amd64
# 把frps、frps.ini移动到适当位置
sudo mv ./frps /usr/bin/
sudo mkdir -p /etc/frp
sudo mv ./frps.ini /etc/frp/
# 创建frps.service
cat <<EOF | sudo tee /lib/systemd/system/frps.service
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frps -c /etc/frp/frps.ini
[Install]
WantedBy=multi-user.target
EOF
# 配置frps.ini,其他配置参考:https://github.com/fatedier/frp
cat <<EOF | sudo tee /etc/frp/frps.ini
[common]
bind_port = 7000
# http端口
vhost_http_port = 7001
# https端口
# vhost_https_port = 7002
EOF
# 开启frps并设置开机启动
sudo systemctl daemon-reload
sudo systemctl start frps
sudo systemctl enable frps
sudo systemctl status frps
# 开启防火墙
iptables -A INPUT -p TCP -i $EXTIF --dport 7000 --sport 1024:65534 -j ACCEPT
# firewall-cmd --add-port=7000/tcp --permanent; firewall-cmd --add-port=7000/tcp
/usr/sbin/netfilter-persistent save
安装Client端
Linux
进入下载页面,下载frp_0.33.0_linux_amd64.tar.gz后,运行以下命令:
# 解压并进入目录
tar -zxvf frp_0.33.0_linux_amd64.tar.gz && cd frp_0.33.0_linux_amd64
# 把frps、frps.ini移动到适当位置
mv ./frpc /usr/bin/
mkdir -p /etc/frp
mv ./frpc.ini /etc/frp/
# 创建frpc.service
cat <<EOF > /lib/systemd/system/frpc.service
[Unit]
Description=Frp Client Service,User=nobody
After=network.target
[Service]
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frpc -c /etc/frp/frpc.ini
ExecReload=/usr/bin/frpc reload -c /etc/frp/frpc.ini
[Install]
WantedBy=multi-user.target
EOF
# 配置frpc.ini,其他配置参考:https://github.com/fatedier/frp
cat <<EOF | sudo tee /etc/frp/frpc.ini
[common]
server_addr = IP地址
# 用于与服务端通信
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
# ssh端口
remote_port = 6000
[web]
type = http
local_port = 11000
local_ip = 127.0.0.1
custom_domains = IP地址或域名
EOF
# 开启frps并设置开机启动
sudo systemctl daemon-reload
sudo systemctl start frpc
sudo systemctl enable frpc
sudo systemctl status frpc
Win10
附上用于anydesk直连的frpc.ini配置
[common]
server_addr = ${服务端IP地址}
# 用于与服务端通信
server_port = 7000
[anydesk]
type = tcp
local_ip = 127.0.0.1
# 访问${remote_IP:remote_port}后,会转发到本地的7070端口(Anydesk直连端口)
local_port = 7070
# 远程端口,会使得服务端监听该端口
remote_port = 6000
[web]
type = http
local_port = 11000
local_ip = 127.0.0.1
custom_domains = example.com
启动命令
# 进入frp文件目录
cd C:\Users\DELL\Desktop\frp_0.38.0_windows_amd64
# 启动client
.\frpc.exe -c .\frpc.ini
内网穿透
解释:client端启动后,server端会开启${remote_port}端口。用户访问该server端的${remote_port}端口,则相当于访问client端的${local_port}
从ssh终端访问:ip:remote_port即可,在以上配置,则访问:IP地址:6000。(注意:需要server端开启对应端口的防火墙)
有其他需要,请自行参考:https://github.com/fatedier/frp/blob/master/README_zh.md