← Back to list

家裡沒有對外IP如何讓自己架的網站挂到網路上

使用Cloudflare tunnel讓服務挂在網路上

Meepo · 2024-05-09 15:21 · 0 claps · 6.6 min read
#cloudflare #reverse-proxy #public-network #private-network #zero-trust
Open on Medium ↗

[筆記]家裡沒有對外IP如何讓自己架的網站挂到網路上

介紹

之前就一直在想家裡網絡的ISP(Internet service provider)沒有提供固定的IP(Static IP)給我,我是不是就沒辦法把自己的服務挂在網路上了,做了點研究後發現浮動的IP(Dynamic IP)可以透過DDNS(Dynamic DNS)服務像是noip之類的來解決,但是我遇到的是家裡網路是房東提供的,所以我連ISP用的router密碼都沒有,只能上網的我要怎麽把服務挂在網路上。

之前在玩CTF的時候有用過一款叫ngrok的服務,能夠讓自己的内網對外,像是使用下面的指令

ngrok http --domain=sunny-beetle-mutual.ngrok-free.app 80

就能夠把我機器上localhost:80投射到http://sunny-beetle-mutual.ngrok-free.app上面,這時我的服務就能在網路上被大家看到了,可喜可賀。欸?這真的是我想要的嗎?ngrok的缺點不少,第一個就是免費版的ngrok是有流量和http點擊次數限制的、第二個是沒辦法用自己的domain,雖然能夠透過付費解決,但是如果有現成免費又好用的方式,誰還要付錢啊(つд⊂)。

今天爲了達成把内外挂到網路上的目的,從研究VPN專用IP(Dedicated IP)上找到了一個叫Cloudflare Tunnel的關鍵字,這東西就能達到我要的目的還是免費的,原來答案在我身邊,但是我卻不知道🥹

正文

在開始設定前,需要有自己的Domain且讓Cloudflare托管(不是説話免費的嗎🥹),以下以我自己的domain: kekmeepo.com為例子。

  1. 首先Cloudflare Tunnel的dashboard: https://one.dash.cloudflare.com/?to=/:account/access/tunnels
  2. 登入以後會要你注冊和填信用卡資料,新增後選擇0元方案就可以進到下面的頁面

Image taken by Meepo

Image taken by Meepo

  1. 在Networks下選擇Tunnels,再點 + Create a tunnel

Image taken by Meepo

Image taken by Meepo

  1. 選擇Cloudflared後點Next可以輸入Tunnel name,這邊以test-tunnel為例子,建完以後會出現下面的畫面

Image taken by Meepo

Image taken by Meepo

  1. 可以依照自己的系統來選擇要怎麽執行cloudflared,我這邊使用的是Docker(一鍵完成不香嗎),複製指令貼到要挂在網路上的設備上就行了,我自己是使用VM(Virtual Machine),參考下面指令
sudo docker run -d cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <HIDDEN>
  1. 官方預設給的是沒有 -d (detach,背景執行)的,我在指令新增了-d,也把Token藏起來了,所以複製上面的指令是無效的。

  2. 指令執行結束後可以在Tunnel頁面看到下面多了一個test-tunnel,狀態是Healthy的

Image taken by Meepo

Image taken by Meepo

  1. 先不要急著往下做,這邊docker會噴一個錯誤,參考下方

Image taken by Meepo

Image taken by Meepo

https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes後有解釋原因,解決方式參考下方

sudo sysctl -w net.core.rmem_max=2000000 #2 MB
sudo sysctl -w net.core.wmem_max=2000000 #2 MB

因爲錯誤顯示只需要2MB,不需要用範例的7.5MB。但要注意這個設定方式是暫時的,重開機(reboot)後就會消失,爲了讓這個設定能夠在開機後自動執行,可以在 /etc/sysctl.d/local.conf下新增

net.core.rmem_max=2000000
net.core.wmem_max=2000000

這樣重啓以後系統就會自動把上面的值設定為2MB。設定完後重啓container就沒問題啦。

  1. 這時我先在VM裡面執行一個暫時的服務,在/tmp/test下面新增了一個叫hello-world的檔案,並用python server暫時跑在port 8000上,參考下圖

Image taken by Meepo

Image taken by Meepo

  1. 這時回到Cloudflare Dashboard的tunnel,點擊剛建立的test-tunnel最右邊的三個點點後面選擇Configure,在上方的Navigation tab選擇Public Hostname,並點+ Add a public hostname,設定參考下方

Image Taken by Meepo

Image Taken by Meepo

  1. URL内的10.11.9.101是我VM上的IP,之所以要使用IP是因爲我們的Cloudflared服務跑在Container内,而我們的python http server跑在Host上,使用localhost:8000的話是找不到python http server的。如果還是堅持要使用localhost:8000的話,最快的方式是在執行docker的時候新增--network host(注意有兩個-,只適用於linux系統)就行了。

  2. 完成新增以後打開https://test-web.kekmeepo.com後,就能看到我們剛新增的服務啦!!

Image taken by Meepo

Image taken by Meepo

感想

知道了使用方法以後,能做到的事就非常多了!像是在VM上設定reverse proxy後在Cloudflare tunnel上新增我們服務的subdomain,這樣不需要在很多台設備新增Cloudflared就能輕易完成reverse proxy了。

當然除了網頁以外也有ssh功能,能夠在家裡以外的地方ssh回家了!!

方便的當下也要注意網絡安全,網絡上到處都是尋找漏洞的機器人,但是Cloudflare DNS托管後有免費的firewall能夠使用,多少都能做到一些保護的作用。

文件參考

  1. https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/

(以上内容會持續做細部的更新和調整)

Cloudflare tunnel alternative

  1. https://tailscale.com/: 沒辦法使用自己的Domain

Cloudflare’s Image

Cloudflare’s Image


메타데이터
post_id
a73a0c6ea65c
slug
家裡沒有對外ip如何讓自己架的網站挂到網路上-a73a0c6ea65c
url
https://medium.com/@kekmeepo3/%E5%AE%B6%E8%A3%A1%E6%B2%92%E6%9C%89%E5%B0%8D%E5%A4%96ip%E5%A6%82%E4%BD%95%E8%AE%93%E8%87%AA%E5%B7%B1%E6%9E%B6%E7%9A%84%E7%B6%B2%E7%AB%99%E6%8C%82%E5%88%B0%E7%B6%B2%E8%B7%AF%E4%B8%8A-a73a0c6ea65c
canonical_url
https://medium.com/@kekmeepo3/%E5%AE%B6%E8%A3%A1%E6%B2%92%E6%9C%89%E5%B0%8D%E5%A4%96ip%E5%A6%82%E4%BD%95%E8%AE%93%E8%87%AA%E5%B7%B1%E6%9E%B6%E7%9A%84%E7%B6%B2%E7%AB%99%E6%8C%82%E5%88%B0%E7%B6%B2%E8%B7%AF%E4%B8%8A-a73a0c6ea65c
author_url
https://medium.com/@kekmeepo3
status
ok
fetched_at
2026-08-31 20:56:41