1. 程式人生 > 其它 >超詳細的frp內網穿透

超詳細的frp內網穿透


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
  1. 分別啟動 frps 和 frpc。(看下方啟動發發)

  2. 通過 SSH 訪問內網機器,假設使用者名稱為 test:

ssh -oPort=6000 [email protected]

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管理頁面正常登入,發現埠號和設定的不一樣,放行此埠號使用該埠號登入成功。(解決了因為客戶端配置檔案中後面的文字沒刪。。也沒註釋!導致設定的埠無效)