前言
用了將近一兩年的 Openwrt 後,個人覺得 Openwrt 還是有不少令人遺憾的點,正因為這些原因我才遷移到 pfSense。
首先是 Openwrt 對於防火牆規則設置的侷限性,優先級有點混亂,讓我又愛又恨,不能說多糟糕,但一旦網路規則一多後,實在沒有 pfSense 那麼好用,pfSense 對於規則的優先級比較簡單明瞭。
第二點,也是我遷移的最主因,對於雙層路由器的網路結構來說,在 Openwrt 設置 VPN 路由會很麻煩很麻煩。
所以我就搬到 pfSense 了,剛開始會有一天的陣痛期,因為要熟悉新的設定,而且 pfSense 太多太多設置可以調了,非常非常的細,很多非常專業的功能。設置沒有像 Openwrt 那樣容易上手。但熟悉後,就會覺得很舒服了。
雖然 pfSense 太過專業複雜,但我最終還是選用了 pfSense。
網路配置
首先介紹帶有 VPN 的基礎網路配置:(如下圖)
希望實現的目標
- 在 LAN1 下,所有設備能夠通過路由器上設置的 VPN 上網。
- 在 LAN1 下,限制特定的 PC 才有權限訪問一級路由所在的網段 (192.168.0.0/24)。
- 在 LAN2 下,所有設備走正常的 WAN 路由上網,不經過 VPN。
Openwrt 的行為
在這種狀況下,一旦設置完 wg0 (VPN)介面,會路由 0.0.0.0/0 的流量,導致,PC (192.168.10.100) 將會失去能夠連線 192.168.0.0/24 的能力,Openwrt 會根據路由規則把目的地為 192.168.0.1 的封包送到遠端伺服器(VPN伺服器)。那自然而然會無法訪問 192.168.0.1。
如果要允許 192.168.10.100 前往 192.168.0.1 該怎麼辦?在開啟 kill-switch 時,防火牆規則是禁止 LAN1 轉發到 WAN 的,所以需要再新增規則允許 192.168.10.100 轉發到 192.168.0.1。不過,即使這麼設置仍然也不能訪問 192.168.0.1。
新增好防火牆規則,只是理論上能轉發封包到 192.168.0.1,實際上要不要轉發封包到 WAN 並不是單單依靠防火牆規則。因為路由規則不是這樣寫的,所以實際上不會轉發封包到 WAN。所以還要再裝其他東西,例如 Policy Base Routing,非常的繁瑣,安裝好後,還要再一個一個輸入 IP 和目的地,很麻煩。
不然就是要建立一個新的路由表,指定 192.168.0.0/24 要走 WAN 介面,然後把這個路由規則套用在 LAN1 下,並且優先級要高於預設的路由表,如此一來才會生效。
但這些設置非常靠北,最終讓我棄坑 Openwrt。而 pfSense 呢?非常簡單,也無需再安裝第三方路由規則的套件。
pfSense 的行為
首先介紹一下 pfSense 的優勢。
pfSense 的防火牆規則可以使用別名將 IP 段綁成一起,並且也能再把多個別名綁定成一組別名,所以要設置防火牆非常輕鬆。
第二點,pfSense 可以在防火牆 NAT 轉換那邊直接設置轉發 LAN1 的流量到 wg0。這個設定並不會影響 LAN1 能不能前往 192.168.0.0/24 的能力,如果有設置允許的規則的話,仍然是可以正常訪問到 192.168.0.0/24,我覺得光是這一點就已經贏了 Openwrt。
完全不需要再去考慮的路由的問題,畢竟底層已經不是 iptables,而是 FreeBSD 的 Packet Filter (PF)。
因此,我只要在 NAT 設定 LAN1 轉發到 WG0,然後允許 LAN1 前往 * (任意地址),這樣 LAN1 也能訪問一級路由器的網段,可以自由的到 Server-1、Server-2,而且訪問網際網路時,遠端伺服器看到 LAN1 PC 的 IP 會是 VPN 伺服器的 IP。
可以完美實現我想要的功能,並且幾乎不需要什麼太難的設定,也不用燒腦的思考路由規則。在 pfSense 的防火牆規則中,最上面先寫的,優先級最高,逐一往下執行,如果規則匹配該流量,就直接執行該規則,進行放行或阻止。
下面介紹怎麼配置。
設置 Wireguard
新增 Tunnel
如下圖範例,我已經先創建了,基礎的 Tunnel,並填入 Private Key。
建立 Peer
將伺服端 IP (EndPoint) 和公鑰填入。Allowed IP 可以放心的填 0.0.0.0/0,不用像 Openwrt 會需要搞一堆麻煩的路由規則。
建立 WG0 介面
將 tun_wg0 加入到自己建立的介面 WG0 中。
建立 Gateway
需要在 Gateway 新增新的 wg0 介面,作為 WAN 端的可選路由,之後可以在 NAT 中選擇。
需要注意的一點是:必須打勾 Disable Gateway Monitoring Action,No action will be taken on gateway events. The gateway is always considered up.,打勾這個選項才能避免當 VPN 連線中斷時,被切換到 WAN 的流量,導致 IP 洩漏。
基本上 Wireguard VPN 到這步就差不多準備就緒。
設置 NAT
在我這裡,我將 LAN 用 VLAN 分割成五個網段,其中 OPT1 就是 LAN1,直接在 NAT address 那設定成 WG0 address,其餘其他內網維持 WAN address 就相當於沒有走 VPN 的通道。
設置防火牆規則
這裡我的設定非常簡單。
- 第一條,允許 LAN1 到 LAN1。
- 第二條,允許管理員的 IP 可以訪問到上級網段。
- 第三條,禁止 LAN1 訪問所有內部網路 (例如 LAN1、LAN2、LAN3 等等)。
- 第四條,允許 LAN1 到任何地方。
稍微介紹一下為何這麼設定。
首先 PF 默認是全部拒絕,所以如果沒有設定允許訪問外網的規則的話,會不能上網。因此規則裡面必須要有一條是允許前往任何地方,這條規則就是第四條,被我擺在最後面。
再來就是,因為 PF 沒有【網路隔離】的概念,如果設置了允許前往任何地方,那麼 LAN1 也能訪問 LAN2 也能訪問 LAN3 等等,而我需要隔離所有內網,所以我設定了第三條規則,禁止訪問內部網路。
最後,因為禁止訪問內部網路,所以 LAN1 也無法訪問 LAN1,因此需要再加一條 LAN1 可以訪問 LAN1 的規則,我放在第一條,所以會被最優先執行。
至於第二條允許管理員 IP 訪問上游網路,則是用來指定特定的 IP 可以訪問 192.168.0.0/24 網段,避免下面的裝置有能力對我其他網路設備展開攻擊或滲透。
測試
下圖中,vm301 是一台虛擬機器,位於 192.168.10.100 (LAN1),如果我給它加入到管理員 IP 白名單中的話,它就能夠 ping 通上級網路 (192.168.0.0/24)。
並且在外網來看,它的真實 IP 為 185.xxx.xxx.xxx (是 VPN 的 IP)。我自己的公網 IP 是 220 開頭。
如果我將 vm301 的內網 IP 從管理員白名單中移除,它就沒辦法訪問 192.168.0.0/24 的網段,而且從外網看,它的真實 IP 仍然是 185.xxx.xxx.xxx (是 VPN 的 IP)。
總結
經過幾個月的使用體驗後,pfSense 的防火牆規則給我的感覺是非常的非常的舒服,不像 Openwrt 那樣太簡陋,pfSense 防火牆非常多設定可以設置,既強大又簡單明瞭。