iT邦幫忙

2025 iThome 鐵人賽

DAY 5
0
IT 管理

從零開始的網際網路隨筆系列 第 5

Day04-網路的建置討論(後篇)

  • 分享至 

  • xImage
  •  

Day03-網路的建置討論(前篇) 我討論到了用 NAT 去架設內網,可以有效避免內網的設備被外網的設備察覺到。但是又希望我在外網的設備能夠連回內網去使用內網的設備,於是就要使用到 VPN ...

PVE 端設定

網路介面

首先就是內網的設定了,先到 pve 下,選擇 System > Network,之後建立 linux bridge。設定畫面展示請參考下圖
linux bridge setting
基本上設定好名字和把 autostart 打開後就可以了,除非也打算把 pve 這個資料中心的節點也納入內網,不然 IPv4 那欄不用設定。記得如果設定要反悔的話在該介面中有個 revert 可以回復設定,最後確定設定內容沒問題後記得按 Apply Configuration(沒按就根本不會啟用該linux bridge)。

新增 router

那先設定一個充當 router 的 VM 吧,我是用 Day01-建立 ubuntu 和 docker 使用 PVE 那裏設計好的 VM 直接複製貼上去做使用。
具體步驟就是在左側許多的 VM 中選取要複製的 VM ,選擇 clone 然後設定新的 VM 的 VM ID 和 name 等即可。畫面請參考下圖
pve clone

最後到 router VM 中,新增一個 Network Device。所以應該會有兩個網路介面,一個是通往外網的(ens18),另一個則是通往內網的(ens19)。

router VM 的設定

網路介面

以下把 router vm 統稱為 router,如果你是從其他 VM 複製而來,優先設定網路(/etc/netplan/01-static.yaml)避免撞到通往外網的 IP,另外一個介面的設定請優先用 ip a 查看網路介面的名字。
然後根據網路介面的實際情況去做設定。例如以下範例

network:
  ethernets:
    ens18:
      addresses:
      - ipv4-address/24
      routes:
      - to: 0.0.0.0/0
        via: gateway4-address
      nameservers:
        addresses:
        - 1.1.1.1
        - 8.8.8.8
      dhcp4: no
    ens19:
      addresses:
      - 10.2.26.254/24

這樣就可以了,其中 ens18 是通往外網的介面,而 ens19 是內網互相通訊用的介面,且10.2.26.254為日後內網設備閘道的位址。

NAT

這裡我壓根沒打算處理 iptable 設定自啟動的問題(當然也可以用 iptable 去設定),而是直接設定 UFW(Uncomplicated Firewall,ubuntu 上預設的防火牆),如果沒有該防火牆可以用 sudo apt install ufw 去下載使用。

注意: UFW 沒設定完前,我強烈建議先到 pve 上的 console 內操作,不然有時連不到該設備真的會很難受。還有我建議下面的操作是用 root 去設定

首先在 /etc/default/ufw 修改 DEFAULT_FORWARD_POLICY 的參數成 ACCEPT,具體樣子請參考下面 (/etc/default/ufw) 的部分截圖
/etc/default/ufw screenshot

接著確認 /etc/ufw/sysctl.conf 中是否有 net/ipv4/ip_forward=1 的設定(如果被註記了記得把註記 #刪掉),部分內容請參考下圖
/etc/ufw/sysctl.conf screenshot

然後把這段貼到 /etc/ufw/before.rules 中 filter rule 前

# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]

# Forward traffic through eth0 - Change to public network interface
-A POSTROUTING -s 10.2.26.0/24 -o ens18 -j MASQUERADE

# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT

部分內容請看下面截圖
/etc/ufw/before.rules screenshot
截圖中可以看到上面NAT的區塊會用 COMMIT 結尾,然後下面 filter 也是。然後設定的地方基本上就是說,我設定的網段的網路流量會導向 ens18 這個會流向外網的介面,最後 COMMIT。

最後記得
ufw disable && ufw enable
當然如果要允許外網設備利用 router 的外網 IP 使用 ssh,則需要 ufw allow ssh

VPN

伺服器端

這裡我使用的是 wireguard,沒有 wireguard 可以用 apt install wireguard (這裡到下面的操作我一樣建議用 root 去設定,就可以不用一直輸入密碼了)去下載
首先我需要去 /etc/wireguard/ 目錄下生出兩個金鑰一個是私鑰(private.key),另一個是公鑰(public.key),需要的指令如下

cd /etc/wireguard
wg genkey | tee private.key
chmod 600 private.key
wg pubkey < private.key | tee public.key

接著在 /etc/wireguard 下設定 wg0.conf,具體如下

[Interface]
Address = 10.100.0.254/16
ListenPort = 51820
PrivateKey = <server wireguard privatekey>

PostUp   = iptables -A FORWARD -i wg0 -o ens19 -s 10.100.0.0/16 -d 10.2.26.0/24 -j ACCEPT
PostUp   = iptables -A FORWARD -i ens19 -o wg0 -s 10.2.26.0/24 -d 10.100.0.0/16 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
PostDown = iptables -D FORWARD -i wg0 -o ens19 -s 10.100.0.0/16 -d 10.2.26.0/24 -j ACCEPT
PostDown = iptables -D FORWARD -i ens19 -o wg0 -s 10.2.26.0/24 -d 10.100.0.0/16 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

其中
10.100.0.0/16 這個網段是只適用在 wireguard 裡面,當然為了給更多人使用所以我設定更多的自訂 IP。然後 ListenPort 的埠值可以隨便設定,PrivateKey 就需要剛剛設定私鑰的值,而PostUp 和 PostDown 則分別是當VPN 的服務(wg0.conf)啟動時應該要設定的東西及關閉後應該要設定的指令。

後續如果需要增加客戶端則需要在 /etc/wireguard/wg0.conf 下增加

[Peer]
PublicKey = <client wireguard publickey>
AllowedIPs = <client_wireguard_ip>/32

最後啟動 wg-quick up wg0 就可以啟動 VPN server,當然你也可以
systemctl enable wg-quick@wg0 設定開機自啟動的應用,當然如果有東西要更新可以使用 sudo systemctl start wg-quick@wg0

在最後的最後因為我們有用 ufw,所以記得用 ufw allow 51820/udp 去允許 wireguard 的網路流量進來。

客戶端

客戶端的 wireguard 可以這樣設計

[Interface]
PrivateKey = <client wireguard privatekey>
Address = <client_wireguard_ip>/32

[Peer]
PublicKey = <server wireguard publickey>
AllowedIPs = 10.2.26.0/24
Endpoint = <server public IP>:51820
PersistentKeepalive = 25

其中 endpoint 需要填設定好的伺服器外網 IP & 埠號,而persistentkeepalive是為了避免 router 閒置太久而停止用 wireguard。

PVE 中內網的裝置

之後要使用該內網,PVE 設定裡的 VM 硬體就應該要有設定好的橋接網路,並在 VM 中的 /etc/netplan/01-static.yaml 中作相對應的設定,如

network:
  ethernets:
    ens18:
      addresses:
      - ipv4-address/24
      routes:
      - to: 0.0.0.0/0
        via: 10.2.26.254
      nameservers:
        addresses:
        - 1.1.1.1
        - 8.8.8.8
      dhcp4: no

就這樣我們設定了一個新的橋接網路(linux bridge)用作內網,然後還有把這個網橋新增到 router 上,並設置了 NAT 轉發(FORWARD) 的內網設定,最後我們把 VPN 的網段和內網的網段互通,這樣就可以實現之前討論的內容了。

參考資料
NAT and FORWARD with Ubuntu's ufw firewall
NAT and Firewall Traversal Persistence


上一篇
Day03-網路的建置討論(前篇)
下一篇
Day05-準備 GNS3
系列文
從零開始的網際網路隨筆11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言