文章發(fā)布地址:https://blog.qiuluo.xin/2019/06/07/frp%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/
1 背景
1.1 正常情況一個(gè)內(nèi)網(wǎng)主機(jī)與外網(wǎng)服務(wù)器的交互
以訪問(wèn)google為例符糊。
假設(shè)我們的主機(jī)IP是192.168.0.0倍阐,路由器LAN IP為192.168.0.1机久,WAN IP為211.22.145.234(這是一個(gè)公網(wǎng)IP),google 服務(wù)器 IP 為74.125.204.101黎比。
- 主機(jī)構(gòu)建HTTP請(qǐng)求數(shù)據(jù)包,目標(biāo)IP為74.125.204.101,目標(biāo)端口是80/443,源IP為192.168.0.0,源端口隨機(jī)生成比搭,假定為5000
- 主機(jī)檢查目標(biāo)IP地址,發(fā)現(xiàn)不在一個(gè)網(wǎng)段南誊,數(shù)據(jù)包丟給默認(rèn)網(wǎng)關(guān)192.168.0.1
- 路由器LAN口收到數(shù)據(jù)包身诺,構(gòu)建NAT映射,隨機(jī)生成端口弟疆,假定為5500,這樣映射就是:5500->192.168.0.0:5000.WIN口收到的數(shù)據(jù)包戚长,如果目標(biāo)端口是5500,則會(huì)轉(zhuǎn)發(fā)給192.168.0.0的5000端口。
- 路由器修改數(shù)據(jù)包的源端口為5500,源IP地址為211.22.145.234怠苔,使用WAN口將數(shù)據(jù)包發(fā)出去
- google服務(wù)器收到請(qǐng)求同廉,構(gòu)建響應(yīng)HTTP數(shù)據(jù)包,目標(biāo)IP地址為211.22.145.234,目標(biāo)端口是5500
- 路由器WAN口收到數(shù)據(jù)包柑司,目標(biāo)端口是5500,查詢NAT表迫肖,發(fā)現(xiàn)對(duì)應(yīng)的機(jī)器是192.168.0.0:5000,所以修改目標(biāo)IP為192.168.0.0攒驰,目標(biāo)端口為5000蟆湖,并通過(guò)LAN口發(fā)送給主機(jī)
- 主機(jī)收到數(shù)據(jù)包,完成一次通信
1.2 內(nèi)網(wǎng)穿透實(shí)現(xiàn)
測(cè)試服務(wù)器沒(méi)有公網(wǎng)IP玻粪,想要讓外網(wǎng)直接調(diào)用內(nèi)網(wǎng)的服務(wù)隅津,就需要用到內(nèi)網(wǎng)穿透。
和使用路由器與外網(wǎng)交互類似劲室,需要有一個(gè)第三方擁有公網(wǎng)IP的服務(wù)器進(jìn)行路由的中轉(zhuǎn)伦仍,代替路由器的角色。
由內(nèi)網(wǎng)服務(wù)器主動(dòng)請(qǐng)求公網(wǎng)服務(wù)器很洋,建立一個(gè)長(zhǎng)連接充蓝,這時(shí)公網(wǎng)服務(wù)器就可以隨時(shí)隨地的向內(nèi)網(wǎng)服務(wù)器發(fā)送消息了。
當(dāng)使用瀏覽器想要訪問(wèn)內(nèi)網(wǎng)服務(wù)時(shí)喉磁,先將請(qǐng)求發(fā)送到公網(wǎng)服務(wù)器上谓苟,公網(wǎng)服務(wù)器再通過(guò)之前建立的長(zhǎng)連接將請(qǐng)求發(fā)送到內(nèi)網(wǎng)服務(wù)器中。從而實(shí)現(xiàn)在外網(wǎng)請(qǐng)求內(nèi)網(wǎng)服務(wù)的需求协怒。
2 服務(wù)搭建
2.1 公網(wǎng)服務(wù)搭建
2.1.1 下載工具
通過(guò)下面的鏈接下載frp上傳到服務(wù)器涝焙。
https://github.com/fatedier/frp/releases/download/v0.14.1/frp_0.14.1_linux_amd64.tar.gz
或直接使用wget下載
wget https://github.com/fatedier/frp/releases/download/v0.14.1/frp_0.14.1_linux_amd64.tar.gz
解壓
sudo tar zxf frp_0.14.1_linux_amd64.tar.gz
2.1.2 修改配置
cd frp_0.14.1_linux_amd64/
sudo vim frps.ini
內(nèi)容如下:
[common]
bind_port = 8989 # frp服務(wù)的端口
vhost_http_port = 8889 # frp的http服務(wù)的端口
2.1.3 啟動(dòng)服務(wù)
兩種啟動(dòng)方式使用一種即可
./frps -c frps.ini # 前臺(tái)直接啟動(dòng),測(cè)試看日志方便
nohup ./frps -c ./frps.ini > /dev/null 2>&1 & # 后臺(tái)運(yùn)行
2.2 內(nèi)網(wǎng)服務(wù)搭建
2.2.1 下載工具
與公網(wǎng)服務(wù)器下載同樣的文件斤讥,通過(guò)下面的鏈接下載frp上傳到服務(wù)器纱皆。
https://github.com/fatedier/frp/releases/download/v0.14.1/frp_0.14.1_linux_amd64.tar.gz
或直接使用wget下載
wget https://github.com/fatedier/frp/releases/download/v0.14.1/frp_0.14.1_linux_amd64.tar.gz
解壓
sudo tar zxf frp_0.14.1_linux_amd64.tar.gz
2.2.2 修改配置
cd frp_0.14.1_linux_amd64/
sudo vim frpc.ini
內(nèi)容如下:
[common]
server_addr = 47.95.199.112 # 公網(wǎng)服務(wù)器IP
server_port = 8989 # 公網(wǎng)服務(wù)器的bind_port
[ssh]
type = tcp # 協(xié)議格式
local_ip = 127.0.0.1
local_port = 22 # 本地ssh服務(wù)端口
remote_port = 7878 # 遠(yuǎn)程連接時(shí)使用的端口
[web]
type = http # 協(xié)議格式
local_ip = 127.0.0.1
local_port = 7006 # 本地服務(wù)端口
custom_domains = frp.qiuluo.xin # 域名
2.1.3 啟動(dòng)服務(wù)
兩種啟動(dòng)方式使用一種即可
./frpc -c ./frpc.ini # 前臺(tái)直接啟動(dòng)湾趾,測(cè)試看日志方便
nohup ./frpc -c ./frpc.ini > /dev/null 2>&1 & # 后臺(tái)運(yùn)行
3 測(cè)試
3.1 ssh
配置了ssh芭商,所以可以在遠(yuǎn)程連接本地服務(wù)器
使用下面的命令遠(yuǎn)程進(jìn)行連接派草,成功的話輸入密碼即可進(jìn)入系統(tǒng)。
ssh 用戶名@IP或域名 -p 之前配置的remote_port端口號(hào)
例:ssh wenjijie@47.95.199.112 -p 7878
3.2 http
在內(nèi)網(wǎng)服務(wù)器啟動(dòng)一個(gè)http服務(wù)铛楣,這里使用一個(gè)7006端口的后端服務(wù)近迁。
在瀏覽器使用之前配置的域名和端口進(jìn)行訪問(wèn)
http://frp.qiuluo.xin:8889/
頁(yè)面成功顯示內(nèi)網(wǎng)服務(wù)返回的內(nèi)容。
4 nginx映射
現(xiàn)在已經(jīng)實(shí)現(xiàn)了內(nèi)網(wǎng)映射簸州,但是需要在域名后增加端口號(hào)鉴竭,不符合日常需求。
4.1 公網(wǎng)服務(wù)器上岸浑,使用nginx進(jìn)行映射搏存。
sudo vim /etc/nginx/nginx.conf
增加如下server
server {
listen 80;
server_name frp.qiuluo.xin;
location / {
proxy_pass http://127.0.0.1:8889/;
}
}
4.2 修改內(nèi)網(wǎng)服務(wù)器配置
但是轉(zhuǎn)發(fā)后frp收到的域名不再是frp.qiuluo.xin
,所以需要在內(nèi)網(wǎng)frp配置文件custom_domains
后增加127.0.0.1
修改后的配置文件
[common]
server_addr = 47.95.199.112
server_port = 8989
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 7878
[web]
type = http
local_ip = 127.0.0.1
local_port = 7006
custom_domains = frp.qiuluo.xin,127.0.0.1
5 完成
重啟frp客戶端服務(wù)矢洲。
重新使用瀏覽器去掉端口后訪問(wèn)璧眠,發(fā)現(xiàn)可以拿到內(nèi)網(wǎng)服務(wù)的內(nèi)容,frp內(nèi)網(wǎng)穿透搭建完成读虏。
以后在內(nèi)網(wǎng)每新增一個(gè)服務(wù)(使用一個(gè)新的端口)责静,都需要修改frp配置進(jìn)行公網(wǎng)服務(wù)器和內(nèi)網(wǎng)服務(wù)器的端口映射。
6 參考
https://blog.csdn.net/lishanleilixin/article/details/78384848