超詳細的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 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配置  

image-20211118090659734

添加允許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管理頁面正常登錄,發現端口號和設置的不一樣,放行此端口號使用該端口號登錄成功。(解決了因為客戶端配置文件中后面的文字沒刪。。也沒注釋!導致設置的端口無效)

image-20211118103353997


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM