Project Link:
起源
2023年因緣際會,時常跟一位我很尊敬的前輩混在一起 :P 那時候三不五時就會聽他提到pfSense這套軟體防火牆和他家「機房」的各種大小事,非常酷!我也想玩玩看!其實我一直以來都很想要有個Lab,可長期用來測試或跑些有的沒的,雖然透過IaC再加上一系列的自動化也能輕鬆一鍵在雲端佈署想要的實驗環境,但我就是很怕會忘了刪掉。
一開始想省錢,只靠一台小PC插滿USB網卡跑VM,其實這樣窮酸的作法絕對可行,前提是那台機器要夠穩。有段時間我每隔一到兩天就會遇到kernel噴網卡相關的錯誤,然後就是全家沒網路可用、電視不能看、掃地機器人叫不動,幾次下來我真的不敢了…
後來我把pfSense安裝在專門用來當作路由器的特製小PC(Protectli Vault FW4B),到目前為止跑了兩年多,pfSense也升了好幾個版本,完全沒出過事。原本的小PC(Intel NUC)變成主要Lab繼續用KVM Libvirt跑K8S。
人沒事就是會找事做。不曉得為什麼,有段時間我就很想把樹莓派疊在一起跑K8S。然後就買了一台樹莓派5(8G),有了一台覺得該買第二台,有了兩台又覺得至少要四台,有了四台又覺得其實六台才是最完美的…最後理智勝出,我只有四台。再來就是規劃新的Lab,也需要把原本跑在amd64架構上的容器遷移到arm64架構,聽起來感覺沒什麼,但其實過程中遇到不少坑,之後看有沒有機會再聊這部份!
我知道目前Lab還有很多地方可以再調整到更好,但我現在真的只有在閒暇之餘或心血來潮時才有動力…偶爾也會有念頭想把它們通通都關掉,覺得好像沒什麼價值多浪費電而已(每月20~25kWh)。那我就趁還沒關掉前分享一下目前Lab的架構,也算是替自己紀錄,希望未來能有動力分享更多。
對外服務
--- config: theme: 'base' themeVariables: fontSize: 20px --- flowchart TD INTERNET[🌐 Internet] ==> HINET_ROUTER["📞 HiNet Router (Bridge Mode)"] HINET_ROUTER ==> PF_ROUTER[🧱 pfSense Firewall] PF_ROUTER --- LAN[🏠 LAN 192.168.X.0/24] PF_ROUTER == NAT ==> LAB1[🧪 LAB 1 192.168.Y.0/24] PF_ROUTER --- LAB2[🧪 LAB 2 192.168.Z.0/24] LAN --- WIFI[🛜 WIFI] LAN --- TV[📺 TV] LAN --- PC[🖥️ PC] LAB1 --- PI_CP[🍓 Raspberry Pi<br/> Control Plane] LAB1 ==> PI_NO[🍓 Raspberry Pi<br/> Nodes] LAB2 --- PLAYGROUND[🖥️ Mini PC<br/> KVM - Libvirt</br> Playground] subgraph "☸️ K8S" PI_CP PI_NO ==> EIGW["🚪 External Ingress Gateway"] EIGW ==> Willyhutw["🔒 Personal Blog</br>(https://willyhu.tw)"] end
Hightlights:
- 防火牆對外只開 TCP: 80, 443.
- 防火牆 (Public IP) 與 exteral-ingress-gateway (Private IP) NAT.
- PersonalBlog’s Gateway 指向(label selector) exteral-ingress-gateway.
- Cert-manager + Let’s encrypt certificate + https redirect to PersonalBlog’s Gateway.
- Cloudflare DNS託管 + CDN, 避免對外IP暴露.
內部服務
--- config: theme: 'base' themeVariables: fontSize: 20px --- flowchart TD PF_ROUTER[🧱 pfSense Firewall] PC[🖥️ PC - Willy Hu] ==> LAN LAN[🏠 LAN 192.168.X.0/24] ==> PF_ROUTER PF_ROUTER ==> LAB1[🧪 LAB 1 192.168.Y.0/24] LAB1 --- PI_CP[🍓 Raspberry Pi<br/> Control Plane] LAB1 ==> PI_NO[🍓 Raspberry Pi<br/> Nodes] subgraph "☸️ K8S" PI_CP PI_NO ==> IIGW[🚪 Internal Ingress Gateway] IIGW ==> Argocd[🔒 ArgoCD</br>argocd.willyhu.tw] IIGW ==> Grafana[🔒 Grafana</br>grafana.willyhu.tw] IIGW ==> Prometheus[🔒 Prometheus</br>prometheus.willyhu.tw] IIGW ==> Loki[🔒 Loki</br>loki.willyhu.tw] IIGW ==> Kiali[🔒 Kiali</br>kiali.willyhu.tw] end
Hightlights:
- 防火牆規則:
- LAN與所有LABs皆隔離不能互相訪問.
- 除了我之外 (DHCP Static Mappings).
- InternalServices Gateway 指向(label selector) internal-ingress-gateway.
- Cert-manager + Let’s encrypt certificate + https redirect to InternalServices Gateway.
- Proper Gateway/VirtualService allowing host for InternalServices.
- 防火牆內部DNS(resolver) host override.
- argocd.willyhu.tw => internal-ingress-gateway’s privete ip (192.168.12.X)
- grafana.willyhu.tw => internal-ingress-gateway’s privete ip (192.168.12.X)
- …
Data ETL Pipeline
--- config: theme: 'base' themeVariables: fontSize: 20px --- flowchart PF_ROUTER[🧱 pfSense Firewall] PF_ROUTER ==> DataEntry SnmpExporter ==> PF_ROUTER Prometheus ==> SnmpExporter %% K8S Cluster subgraph "☸️ K8S" SnmpExporter[SNMP Exporter] Prometheus[Prometheus] DataEntry[FLB Input - </br> UDP Server] DataFilterPfsense[FLB Filter - </br> pfsense_log_parser] DataTail["FLB Input - </br> Tail (DaemonSet)"] DataFilterWillyhutw[FLB Filter - </br> willyhutw_log_parser] DataOutputLoki[FLB Output - </br> Loki] Loki[Loki] DataEntry ==> DataFilterPfsense DataFilterPfsense ==> DataOutputLoki DataTail ==> DataFilterWillyhutw DataFilterWillyhutw ==> DataOutputLoki DataOutputLoki ==> Loki end
Hightlights:
- 防火牆Metric:
- 開啟SNMP服務並且只允許LAB network存取.
- SNMP Exporter fetch metrics from firewall.
- Prometheus scrape from SNMP Exporter.
- 參考: https://www.willyhu.tw/posts/snmp-exporter-for-pfsense/
- 防火牆Log: FluentBit
- PersonalBlog’s Log: FluentBit