當你將一些web服務發布在內網時,在外網工作的人(例如家裡)就無法訪問這些web服務,而內網穿透的作用就是在內網沒有公網IP時可以被外網訪問,從而實現不同區域網內主機間的通信,以及外網ssh連接內網的伺服器。這篇文章就介紹一下如何使用frp實現免費內網穿透,無需公網IP,包括內容穿透伺服器端與客戶端的搭建。

什麼是內網穿透

簡單來說內網穿透就是實現不同區域網內的主機間的通信,通俗點講,當你在宿舍寫代碼,想訪問機房裡的服務,但是機房沒有外網IP,所有的web服務都是通過內網發布的(192.168.xx.xx等),那你在宿舍就無法訪問到這些服務,可你又不想去機房,那麼應該怎麼辦呢?內網穿透就可以幫你解決這個困境。通過內網穿透,你用宿舍的網路就可以訪問到機房的web服務。

或者是你用宿舍的網路,可以SSH訪問機房的伺服器(伺服器沒有公網IP)。

內網穿透工具-frp

內網穿透的工具有很多,常用的例如ngrok和frp。ngrok的2.x版本不再開源,1.x版本最近一次更新是在2年前,而frp卻依然在維護,更新頻繁,並且frp的配置相對於ngrok來說更加簡單易上手。

frp 是一個可用於內網穿透的高性能的反向代理應用,支持 tcp, udp, http, https 協議。

動手實現內網穿透

有公網IP的伺服器1臺

實現內網穿透,首先需要一臺有公網IP的伺服器。

VPS推薦:

flyzy小站:2018年新手實惠/高性價比/穩定/速度快VPS選購指南?

zhuanlan.zhihu.com
圖標

frp伺服器端搭建與配置

去官網下載最新的release版本

wget https://github.com/fatedier/frp/releases/download/v0.20.0/frp_0.20.0_linux_amd64.tar.gz

解壓壓縮包並命重命名文件夾:

tar xzvf frp_0.20.0_linux_amd64.tar.gz
mv frp_0.20.0_linux_amd64 frp

進入frp文件夾下:cd frp,修改frps.ini文件,例如設置http訪問埠是8080(以下示例為 http 服務,https 服務配置方法相同, 伺服器端的vhost_http_port 替換為vhost_https_port,客戶端的type 設置為https 即可):

# frps.ini
[common]
bind_port = 7000
vhost_http_port = 8080

之後啟動frps:

# 控制檯式啟動,按ctrl+C停止
./frps -c ./frps.ini
# 後臺啟動,日誌保存在nohup.out
nohup ./frps -c ./frps.ini &

frp客戶端搭建與配置

去官網下載最新的release版本(注意要與伺服器端的版本對應),這裡以64位Windows版本為例,下載好後包括如下文件:

修改文件frpc.ini,添加對應的web服務:

[common]
server_addr = x.x.x.x
server_port = 7000

[web]
type = http
local_port = 8089
custom_domains = www.your_domain.com

其中,x.x.x.x是你VPS的IP,埠是你伺服器配置文件中配置bind_port,local_port則是你內網發布的web服務對應的埠,例如我內網服務是localhost:8089,最後的custom_domains則是你的域名,添加A記錄解析到你的VPS的IP x.x.x.x上即可(域名購買可參考:Namesilo優惠券與解析)。

如果你想用frp運行多個web服務,那麼可以結合nginx實現(github.com/fatedier/frp

首先是nginx的配置:

server {
listen 80;
server_name app1.* app2.* app3.*;
## send request back to apache ##
location / {
client_max_body_size 1000m;
# 假設frps埠8080
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
}
}

之後是frps的配置:

[common]
bind_addr = 0.0.0.0
bind_port = 7000
vhost_http_port = 8080
auth_token = openittoken
subdomain_host = testapp.com

[app1]
type = http
auth_token = openittoken
subdomain = app1
[app2]
type = http
auth_token = openittoken
subdomain = app2
[app3]
type = http
auth_token = openittoken
subdomain = app3

最後是frpc的配置:

[common]
server_addr = *.23.72.*
server_port = 7000
auth_token =openittoken

[app1]
type = http
local_port = 8081

[app2]
type = http
local_port = 8082

[app3]
type = http
local_port = 8083

將*.testapp.com解析到你的伺服器ip,這樣就實現了:

app1.testapp.com => client:8081
app2.testapp.com => client:8082
app3.testapp.com => client:8083

修改完畢後啟動frpc即可,需要在控制檯(cmd)中運行:

frpc -c frpc.ini

如上圖所示,這樣就是啟動成功了。

內網穿透效果

以我的配置為例,在8089埠用Nginx配置了一個web服務:

此時,你打開你在客戶端配置文件裏配置的域名加上你在伺服器端配置文件裏配置的埠,就可以訪問這個內網裡的web服務了:

內網穿透安全性

按照上面的配置方法,只要別人知道你的域名和埠就能訪問你的web服務,如果你不想別人訪問,frp也支持設置密碼,只需要在客戶端配置文件里加上用戶名和密碼就可以:

[common]
server_addr = x.x.x.x
server_port = 7000

[web]
type = http
local_port = 8089
custom_domains = www.your_domain.com
# 設置認證的用戶名
http_user = flyzy2005
# 設置認證的密碼
http_pwd = flyzy2005

之後重啟客戶端服務,再通過內網穿透的方式來訪問區域網裏的web服務就會發現需要驗證了:

利用SSH訪問內網伺服器

前幾個部分介紹的是web服務如何通過frp實現內網穿透,從而達到在外網訪問內網服務的目的,接下來介紹下如何使用frp實現外網ssh連接內網伺服器。

伺服器的配置(frps)不需要改,跟上一部分一致即可,只需要在客戶端配置(frpc)中加上如下配置:

[common]
server_addr = x.x.x.x
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

其中,local_iplocal_port是你本機(內網伺服器)的ip和ssh埠,remote_port則是伺服器的埠,如果是例子中的配置,則你可以通過ssh [email protected] -p 6000來ssh你的內網伺服器。

如果你有多臺內網伺服器,而只有一個外網IP,那麼只需要在多個內網伺服器上同時運行frpc,指定不通的remote_port即可。

原文鏈接:使用frp實現內網穿透,訪問內網web服務以及ssh內網伺服器 - Flyzys Blog


推薦閱讀:
相關文章