搜尋此網誌

2025年10月7日 星期二

Ubuntu 分享 Wifi 網路

緣起:


    為了建立我的 Gigabit 區網,我禮拜六時買了一個 switch hub,說來好笑,那天第一次是趁著中午媽媽要我去買午餐時跑去的,我沒先去買午餐,反而先跑去比較遠的燦坤 (輔仁中學那邊的)。結果,還沒到營業時間.... 後來跑回同仁那邊看,便當店沒有營業,所以打電話回去跟媽媽回報,那時原本以為她會罵我說,我前面那麼久是跑去哪了,結果,沒有ㄟ,真奇秒,他就要我先回家,她煮水餃給我們吃就好。

    再次出門是下午,原本我朋友邀我去他家烤肉,但我姐要我先去十字路買燒烤回來,為了省那些機油的錢,我就取消跟我朋友的邀約,就出門買燒烤,回家後就不再出門了。出門買好燒烤後,再跑去燦坤一次,這次就有開了,我最後是買了 DLink 的 5 port Gigabit switch,原本昨天還一直在想說要不要買 poe 功能的,但去了那邊後都沒看到有 poe 的 switch,也好,多佔用個插座孔不是什麼太大的問題。

    我回去後,把我的裝置跟那台 switch 接起來,我 cat6 的網路線剛好夠用,有兩條是不久前買的,有兩條是買分享器時附贈的,有一條很短的是之前工作練習做網路線時得到的。現在,我書房的網路結構長這樣


    虛線代表用 wifi 連接,平常會一直開著的只有 N100 跟 Raspberry Pi,那個 Dlink 就之前文章提過的,只給監視器用 (那個 eth1 是使用 USB To RJ45)。


Steam Link 的問題:


    這樣,我平常在使用 N100 時,還能連到 Switch Hub (網域我一開始是設成 192.168) 下的其它裝置,在 Pi 的 Samba 傳資料、用 Steam Link 連到 Rog Ally 或 MSI 筆電玩遊戲。看起來還不錯吧 ? 

    但當我試著在 N100 上用 Steam Link 連 MSI 筆電或 Rog Ally 時,發現畫面的傳輸似乎不會走 Switch Hub 的區網 (那畫面有時還是會突然小卡)。有些遊戲需要連線,所以我會讓遊戲裝置用 wifi 連上 4G LTE Router,不知怎麼的,Steam Link 的畫面分享就直接走那台 4G LTE Router,佔用 Wifi 的頻寬。

    我有在 N100 上用 iftop 測試過,開著兩個 terminal,一個監測 wl4s0,另一個監測 enp2s0,發現,當串流開始時,enp2s0 沒什麼太大的動靜, 倒是 wl4s0 RX 一直持保持在 10MBs 以上,我這才很肯定畫面沒有走有線網路。

    雖然把遊戲裝置的 wifi 切斷,然後讓 Steam Link 重連,重連後畫面就會走有線的區網,但總不能每次都這樣搞吧,也太麻煩,為啥它不肯優先走有線網路 ? 我後來想到的解決方法是,遊戲主機乾脆不要用 wifi 連網了,直接走 Switch Hub,然後靠 N100 分享 wlp4s0 連到的網際網路。


Ubuntu 分享網路:


    策略就這樣,實作上蠻簡單的,可以直接去 Setting 那邊改


    把 enp2s0 的 IPv4 那邊設定成 "Shared to other computers"


    Apply 後,用 ip addr 指令去看,會看到  enp2s0 的 ip 變成 10.42.0.1


    再來修改連接 Switch Hub 的那些裝置的 ipv4,Address -> 10.42.0.{2~254},不要重覆即可,Netmask -> 255.255.255.0,Getway -> 10.42.0.1,DNS 的話好像填 10.42.0.1或 Google 的 8.8.8.8 都行,啟用設定後,裝置就能連到 N100 分享的 Wifi 網路了。

    我這時再用 Steam Link 連線,它就一定會走有線區網,因為也沒別條路可以走了 XD。其實到這邊就差不多了,但我後來還有其它想試其它的東西,所以這並不是最終的設定。


手動設定 iptables:


    我想試試,假如把 Raspberry Pi 的 wifi 停掉,其它連著 4G TLE Router 的裝置,能不能透過 N100 連到 10.42.0.0 的網域。

像這樣

    首先試了修改 4G TLE Router 的設定,保留 ip 位置,讓 192.168.1.101 固定給 N100


    然後再設定 Static Routing,告訴 Router 說,10.42.0 開頭的封包,要往 192.168.1.101 送 


    然後測試,我手機連上 Wifi 後,輸入 10.42.0.3:8080,Raspberry pi 的 ip,8080 port 是 Piwigo 的服務。看起來是能連上啦,但網頁回傳是給我個 connection refuse 的結果,啊勒?後來去查,發現那個 "Shared to other computers" 的設定,似乎會把外頭來的請求擋掉,哇,就不能分享網際網路的同時還能讓其它網段的網路訪問嗎?後來去請教 gpt 大神,是可以的。

    首先,修改 N100 enp2s0 的 ipv4,從 Share to other computers 改回 Manual


    再來用 sysctl

sudo sysctl -w net.ipv4.ip_forward=1

    啟用系統的 ip forwarding 功能,這設定重開機後會失效,想永久生效的話,可以把編輯/etc/sysctl.conf 檔,在最後面加上 net.ipv4.ip_forward=1。

    再來修改 iptables 的設定,允許 enp2s0 跟 wl4s0 間的轉發

sudo iptables -A FORWARD -i wl4s0 -o enp2s0 -j ACCEPT
sudo iptables -A FORWARD -i enp2s0 -o wl4s0 -m state --state ESTABLISHED,RELATED -j ACCEPT

    第一個指令很直觀就能理解,但它第二個怎麼就變這麼長,原來是要放行 “回應的封包”,因為預設是不允許轉送。加上 -m state 啟用狀態追踨,讓 iptables 能根據連線狀態判斷封包屬性,然後用 --state ESTABLISHED,RELATED 指定只匹配已建立的連線或與已建立的連線有關的封包。

    最後加上 NAT

sudo iptables -t nat -A POSTROUTING -o enp2s0 -j MASQUERADE

    -t nat 指定操作 nat 表,-A POSTROUTING 新增規則,是封包離開本機前的最後階段,我們要修改封包的來源 ip。-o enp2s0 只匹配要從 enp2s0 發出去的封包,-j MASQUERADE 將封包的來源 ip 偽裝成本機 enp2s0 的 ip。

    這些 iptables 的設定也是重開機後就沒了,想要保留的話,可以用 iptables-persistent 功具 (感謝 gpt 老師的教學)

sudo apt install iptables-persistent
sudo netfilter-persistent save

    這樣,N100 就能分享網際網路給同個 Switch Hub 下的裝置  (DNS Server 不能用 10.42.0.1 了,要用 8.8.8.8),連到 4G TLE Router 的裝置也能透過 N100 存取連到 Switch Hub 的裝置提供的服務。再次用手機試著連到 10.42.0.3:8080,這次就 OK 了



沒有留言:

張貼留言