close
最近入手一台新 NAS,因為內建 docker,自架了不少服務在上面。可惜家裡的使用社區網路,沒有對外的實體 IP;通常需要透過業者設定 Port Forwarding,才能從外部連回家裡的機器。致電客服要求申請,他們卻回覆目前已經沒有提供這個服務了;想換一家業者,但合約到期還要 3 個多月...萬念俱灰的情況下,突然想到 ngrok 這個第三方服務,提供 SSH Tunnel 技術,實現本機也可以對外的目的。既然有這種服務,那應該也會有開源的解決方法吧?找了一下果然有,而且還不少;我試用了其中的 antoniomika/sish, beyondcode/expose 不過自架的過程不太順利,server 端感覺有架起來,但 client 端連不過去~後來發現 frp,用 Go 撰寫提供執行檔馬上可用,而且還有中文文件可以查閱。利用 GCP 免費帳號建立的 Compute Engine 做為跳板,終於建立成功了!
 
下面紀錄一下建立的步驟:
1. 在有實際 IP 的 Compute Engine,防火牆要開 server 監聽的 port(9000) 與管理介面的 port(9999)
2. server 端以 ubuntu 為例
 
-- 下載最新版的執行檔
wget https://github.com/fatedier/frp/releases/download/v0.34.3/frp_0.34.3_linux_amd64.tar.gz
 
-- 解壓縮並移動目錄,建立連結
tar -xvf frp_0.34.3_linux_amd64.tar.gz
rm frp_0.34.3_linux_amd64.tar.gz
sudo mv ./frp_0.34.3_linux_amd64/ /etc/frp/
sudo ln -s /etc/frp/frps /usr/bin
 
-- 設定開機時自動啟動的服務
sudo ln -s /etc/frp/systemd/frps.service /etc/systemd/system
sudo systemctl enable frps.service
 
-- 設定 frps.ini
sudo vi /etc/frp/frps.ini
 
[common]
; server 監聽的 port
bind_port = 9000

; 本機 vhost 的 port
vhost_http_port = 9090

; 一級域名,建議申請 Freenom,提供 5 個免費一年的域名
subdomain_host = tester999.cf

; client 溝通時要帶的 token
token = i3ch97k4mpdwsa5s

; 管理介面的 port, 帳號與密碼
dashboard_port = 9999
dashboard_user = admin
dashboard_pwd = admin

3. 安裝 cerbot 請參考官方網站

-- wildcard 設定
sudo certbot certonly --preferred-challenges dns --manual  -d "tester999.cf" -d "*.tester999.cf" --server https://acme-v02.api.letsencrypt.org/directory

4. 依照提示到域名管理設定 TXT

-- 檢查 TXT 是否生效
nslookup -type=txt _acme-challenge.tester999.cf

5. 安裝 nginx

-- 設定 SSL
sudo vi /etc/nginx/sites-available/tester999.cf
 
server {
  server_name *.tester999.cf;
  listen 80;
  location / {
    proxy_pass http://127.0.0.1:9090;
    proxy_set_header    Host            $host:80;
    proxy_set_header    X-Real-IP       $remote_addr;      
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_hide_header   X-Powered-By;
  }

  listen 443 ssl;
  ssl_certificate /etc/letsencrypt/live/tester999.cf/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/tester999.cf/privkey.pem;
}

server {
  if ($host = .tester999.cf) {
    return 301 https://$host$request_uri;
  }
  listen 80;
  return 404;
}
 
-- 建立連結
sudo ln -s /etc/nginx/sites-available/tester999.cf /etc/nginx/sites-enabled/

6. client 端以 ubuntu 為例

-- 下載最新版的執行檔
wget https://github.com/fatedier/frp/releases/download/v0.34.3/frp_0.34.3_linux_amd64.tar.gz
 
-- 解壓縮並移動目錄,建立連結
tar -xvf frp_0.34.3_linux_amd64.tar.gz
rm frp_0.34.3_linux_amd64.tar.gz
sudo mv ./frp_0.34.3_linux_amd64/ /etc/frp/
sudo ln -s /etc/frp/frpc /usr/bin
 
-- 設定 frpc.ini
sudo vi /etc/frp/frpc.ini
 
[common]
; server 位置
server_addr = tester999.cf

; server port
server_port = 9000

; token
token = i3ch97k4mpdwsa5s

; 以 web 的設定,https://web.tester999.cf 就會對應到 http://127.0.0.1:8080
[web]
; 有多種選項可選,http 對應 port 80
type = http

; 啟用加密與壓縮
use_encryption = true
use_compression = true

; 對應到本機的位置
local_ip = 127.0.0.1

; 本機的 port
local_port = 8080

; 子網域名
subdomain = web
 

參考資料:

 
 
arrow
arrow
    創作者介紹
    創作者 danielhuang030 的頭像
    danielhuang030

    danielhuang030 的研究日誌

    danielhuang030 發表在 痞客邦 留言(0) 人氣()