title: 超詳細的frp內網穿透
date: 2021-11-18 22:19:42
tags: ssh,內網穿透,frp
categories: 實用技能
cover: https://gitee.com/matytan/tupic/raw/master/uPic/365a845ea0f5bdb9207d82769780e609.jpeg
內網穿透和防火牆問題
什么是內網穿透?
簡單來說,就是將內網的電腦利用公網的IP來連接,公網服務器IP作為一個轉發的過程。
其中分為服務端server,運行在公網服務器
客戶端client,運行在內網電腦!
frp內網穿透
推薦使用,簡單,快捷
下載 linux版本
[root@VM-4-8-centos .ssh]# uname -r
4.18.0-305.10.2.el8_4.x86_64
wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz
解壓
tar -xvf frp_0.38.0_linux_amd64.tar
#或者 如果是tar.gz 需要加z表示gzip文件
tar -zxvf frp_0.38.0_linux_amd64.tar.gz
安裝 配置
進入解壓后的目錄:
cd frp_0.33.0_linux_amd64
,然后進入解壓目錄之后使用用vim/nano等編輯器編輯frps.ini
文件(可以下載到本地,編輯好后再上傳上去)
通過 SSH 訪問內網機器 以及配置http服務器
1.在具有公網 IP 的機器上部署 frps,修改
frps.ini
文件,這里使用了最簡化的配置,設置了 frp 服務器用戶接收客戶端連接的端口
[common]
# frp監聽的端口,默認是7000,可以改成其他的
bind_port = 7000
# 授權碼,請改成更復雜的
token = 12345678
# frp管理后台端口,請按自己需求更改
dashboard_port = 7500
# frp管理后台用戶名和密碼,請改成自己的
dashboard_user = admin
dashboard_pwd = admin
enable_prometheus = true
# frp日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 3
2.在需要被訪問的內網機器上(SSH 服務通常監聽在 22 端口)部署 frpc,修改 frpc.ini 文件,假設 frps 所在服務器的公網(服務器的)IP 為 x.x.x.x:
# 客戶端配置
[common]
server_addr = 服務器ip
# 請換成設置的服務器端口
server_port = 7000
token = 12345678
# 配置ssh服務
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 自定義的遠程服務器端口,例如2222
# 配置http服務,可用於小程序開發、遠程調試等
[web]
type = http
local_ip = 127.0.0.1
local_port = 8080
subdomain = test.hijk.pw
remote_port = 自定義的遠程服務器端口,例如1280
#其他服務可以自己添加相應端口,例如VNC服務
[range:VNC-Pi]
type = tcp
local_ip = 127.0.0.1
local_port = 5900 #本地機器端口
remote_port = 5901
分別啟動 frps 和 frpc。(看下方啟動發發)
通過 SSH 訪問內網機器,假設用戶名為 test:
ssh -oPort=6000 test@x.x.x.x
frp 會將請求
x.x.x.x:6000
的流量轉發到內網機器的 22 端口。
更多示例參考官方文檔:https://gofrp.org/docs/examples/vhost-http/
啟動
簡單啟動測試
編寫配置文件,
先通過 ./frps -c ./frps.ini 啟動服務端,
再通過 ./frpc -c ./frpc.ini 啟動客戶端。
如果需要在后台長期運行,建議結合其他工具使用,例如 systemd 和 supervisor。(看下方)
配置為系統服務
mkdir -p /etc/frp
cp frps.ini /etc/frp
cp frps /usr/bin
#如果需要在后台長期運行,建議結合其他工具使用,例如 systemd 和 supervisor。
cp systemd/frps.service /usr/lib/systemd/system/
systemctl enable frps
systemctl start frps
# 客戶端配置后台(也就是內網機器)
sudo mkdir -p /etc/frp
sudo cp frpc.ini /etc/frp
sudo cp frpc /usr/bin
# Centos
sudo cp systemd/frpc.service /usr/lib/systemd/system/
# 烏班圖
sudo cp systemd/frpc.service /lib/systemd/system/
sudo systemctl enable frpc
systemctl start frpc
防火牆問題(Centos為例) 非常重要!
1.首先是,雲服務器頁面配置,規則里面放通設置的端口。
2.若雲服務器提供商設置的防火牆也打開了,但是還是訪問不了的話,是因為CentOS7系統中的防火牆沒有所需要的端口,需要進行如下操作:
系統防火牆,放通端口或者永久關閉(不安全)
如果是firewall防火牆 添加放通規則
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --permanent --add-port=1280/tcp
firewall-cmd --permanent --add-port=38952/tcp
firewall-cmd --permanent --add-port=2223/tcp
ssh: connect to host 110.42.206.214 port 2222: Connection refused
firewall-cmd --reload
## 查看當前開發的端口
firewall-cmd --zone=public --list-ports
如果iptables防火牆
iptables -L -n #查看當前所有的iptables配置
添加允許INPUT訪問規則,以下時常見服務的端口設置,如果需要拒絕訪問,則將ACCEPT改為DROP即可 端口
iptables -A INPUT -p tcp --dport 7000 -j ACCEPT
iptables -A INPUT -p tcp --dport 1280 -j ACCEPT
添加使用IP限制INPUT訪問規則,這里拿SSH為例,192.168.0.100為允許的IP
#DELETE
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
#ADD
iptables -A INPUT -s 192.168.0.100 -p tcp --dport 22 -j ACCEPT
添加完保存
iptables-save
iptables-save
[root@VM-4-8-centos frp_0.38.0_linux_amd64]# iptables-save
# Generated by iptables-save v1.8.4 on Thu Nov 18 09:15:10 2021
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p tcp -m tcp --dport 7000 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 1280 -j ACCEPT
COMMIT
一個比較久的錯誤關於iptables
發現保存之后很多命令用不了,開始以為是系統問題,后面發現是沒有安裝iptable的服務,先安裝即可
1.安裝
yum install iptables-services
2.設置開機啟動:
systemctl enable iptables.service
3.以下指令都可以使用了
systemctl stop iptables
systemctl start iptables
systemctl restart iptables
systemctl reload iptables
4.然后添加上面規則並保存
iptables -A INPUT -p tcp --dport 7000 -j ACCEPT
iptables -A INPUT -p tcp --dport 1280 -j ACCEPT
iptables -A INPUT -p tcp --dport 1280 -j ACCEPT
總結
因為對雲服務器防火牆規則已經修改放行,並沒有關注系統的軟件如iptables或者firewall對於到端口系統被防火牆攔截問題,后面經過思考發現是系統防火牆問題,
最開始以為是iptables的防火牆問題,添加端口放行之后仍然無效
然后排除firewall的防火牆,放行之后。但是發現還是客戶端連接服務器任然有問題,然后緊接着繼續排除搜索相關問題
然后發現是軟件本身對tls的支持問題,需要修改配置。
仍然被阻斷問題
commen下添加`tls_enable=true`
參考https://blog.phpgao.com/frp_tcp_reset.html
修改完成之后,7000成功綁定
ssh連接問題
本以為都可以了,結果發現端口被拒絕!此時web管理頁面正常登錄,發現端口號和設置的不一樣,放行此端口號使用該端口號登錄成功。(解決了因為客戶端配置文件中后面的文字沒刪。。也沒注釋!導致設置的端口無效)