使用內網穿透工具frp

techstay發表於2017-05-09

前幾天寫了篇文章用本機電腦搭建網站(域名、DNS解析),寫完第二天發現我的網站訪問不上去了。仔細研究了一下,發現我想的太簡單了。很早一些時候,運營商會給我們分配一個公網IP地址,使用動態域名解析可以非常方便的搭建網站。但是現在一般運營商都是用NAT方式,我們只能得到一個大區域網的IP,所以這種方法就失效了。

因此,如果需要用自己電腦做伺服器的話,我們只能使用花生殼這樣的內網穿透工具了。花生殼的缺點就是隻能使用人家給你分配的三級域名,而且免費套餐每個月只有1G流量,有時候還不太穩定。

後來,我又發現了一個工具——ngrok。這個東西倒是挺好用,速度、穩定性方面都不錯。但是2.0版本開始和花生殼一樣受限了。免費許可下只能使用隨機分配的三級域名,臨時用一下倒是還可以。如果想獲取固定的子域名的話還得付費。

正在這時,我發現了一個工具——frp,完美解決了我的需求。所以就有了這篇文章,向大家介紹一下這個功能強大的工具。當然需要說一點,這個工具功能強大,沒有限制,但是和shadowsocks一樣需要有一個伺服器來執行服務端。這個工具作者是自己人,所以有正宗的中文文件,大家可以看看。

下載

首先到下載頁面下載對應版本的服務端和客戶端。我的伺服器是搬瓦工Ubuntu 16.04 64位,客戶端是Windows 10 64位,所以下面都以我自己的為準。大家根據自己情況配置。

在搬瓦工上,執行下面的命令,下載frp伺服器端。

cd /opt
sudo mkdir frp
cd frp
sudo wget https://github.com/fatedier/frp/releases/download/v0.9.3/frp_0.9.3_linux_amd64.tar.gz

然後解壓,得到一個目錄。

sudo tar xvf frp_0.9.3_linux_amd64.tar.gz

進入該目錄,可以看到列出了一系列檔案。

$ ls
LICENSE  frpc  frpc.ini  frpc_min.ini  frps  frps.ini  frps_min.ini

配置服務端

開啟frps.ini檔案,配置為類似下面這樣的。custom_domains是自定義域名,如果有自己的域名就寫到這裡。auth_token是驗證憑據,服務端和客戶端的憑據必須一樣才能連線,當然為了安全還是設定長一點。·dashborad`的三個配置是儀表盤功能的埠以及使用者名稱和密碼,為了安全也要設定的長一點。

[common]
bind_addr = 0.0.0.0
bind_port = 7000
vhost_http_port = 80
vhost_https_port = 443
dashboard_port = 7500
dashboard_user = XXX
dashboard_pwd = XXX

privilege_mode = true
privilege_token = 12345678

[http]
type = http
auth_token = 12345678
custom_domains = www.lionan.me

[https]
type = https
auth_token = 12345678
custom_domains = www.lionan.me

啟動服務端

使用./frps -c ./frps.ini即可啟動伺服器端。然後應該會顯示類似下面的文字,說明服務端啟動成功。


2017/05/09 19:56:19 [main.go:194] [I] Start frps success
2017/05/09 19:56:19 [main.go:196] [I] PrivilegeMode is enabled, you should pay more attention to security issues

然後訪問伺服器的7500埠(前面服務端設定的儀表盤埠),輸入使用者名稱和密碼之後應當可以看到frp的儀表盤。

設定自啟

服務端雖然啟動了,但是不能就這麼算了。這個程式最好可以向Windows服務那樣擁有一個狀態,可以開機自啟。我們使用Linux下常用的程式管理器supervisor來管理該服務。

首先需要安裝supervisor。

sudo apt install supervisor

然後在/etc/supervisor/conf.d下新建一個配置檔案frp.conf,輸入以下內容。command應該是你放置frp軟體的位置。

[program:frp]
command = /opt/frp/frp_0.9.3_linux_amd64/frps -c /opt/frp/frp_0.9.3_linux_amd64/frps.ini
autostart = true

然後啟動supervisor,如果事先已經安裝好了supervisor那麼就重新啟動。之後檢視一下supervisor的執行狀態,看看frp是否已在執行。

# 重啟supervisor
sudo systemctl restart supervisor
# 檢視supervisor執行狀態
sudo supervisorctl status

配置客戶端

開啟Powershell,然後輸入下面的命令下載客戶端。

 wget https://github.com/fatedier/frp/releases/download/v0.9.3/frp_0.9.3_windows_amd64.zip -OutFile frp.zip

下載完成後,雙擊解壓,得到一系列檔案。然後雙擊開啟frpc.ini,進行配置。server_addr為伺服器的IP地址。server_port為伺服器埠號,需要和伺服器端配置相同。auth_token為憑據,需要和伺服器端配置相同。local_iplocal_port用於設定本地Web伺服器的IP和埠號。所以你也可以想到,不僅這裡可以填寫執行frp客戶端的主機,還可以填寫在本區域網中可以訪問到的其他主機的IP地址。

[common]
server_addr = XXXX
server_port = 7000
auth_token = XXXX
privilege_token = 12345678

[http]
type = http
local_ip = 127.0.0.1
local_port = 80

[https]
type = https
local_ip = 127.0.0.1
local_port = 443

然後使用 ./frpc -c .frpc.ini執行客戶端。如果客戶端顯示類似這樣的訊息,說明和服務端連線成功。然後用自定義域名訪問試試,看看能不能解析到你的本地網站。

2017/05/09 19:35:31 [control.go:206] [I] ProxyName [http], connect to server [XXX:7000] success!
2017/05/09 20:17:54 [control.go:220] [I] Start to send heartbeat to frps

設定自啟

每次執行客戶端都需要開啟一個命令提示符視窗,很麻煩也不方便。有沒有什麼辦法能夠讓客戶端以Windows服務的方式在後臺默默執行呢?答案當然是有的。正好我前段時間寫了一篇用winsw讓任何Windows程式都能執行為服務,完美解決了這個問題。

下載就不說了,直接看我的那篇文章即可。下面只說說配置。我這裡是將winsw.exefrpc.exe放到了一起,這樣只需要直接填寫程式名稱。然後在和winsw.exe同級的目錄下,新建winsw.xml檔案,輸入以下內容。

<service>
    <id>frp</id>
    <name>frp</name>
    <description>用frp釋出本地電腦網站到外網</description>
    <executable>frpc</executable>
    <arguments>-c frpc.ini</arguments>
    <logmode>reset</logmode>
</service>

然後開啟管理員許可權命令提示符,使用下面的命令安裝並啟動服務。

winsw install
winsw start

這樣,一個自定義內網穿透的網站就搭建完成了。當然,frp的功能還不僅於此。如果看看官方文件的話,就會發現它不僅可以將本地網站對映到外網,還可以用作反向代理、自定義DNS伺服器等等,功能非常強大。怪不得在Github上這個專案有高達4000的星星數。

相關文章