Install pfSense on AWS

眾所周知Netgate 在去年的時候取消了CE版本使用家庭版許可證升級到Plus 版本的選項。所有的CE版本選擇升級到Plus版本都會需要付出129美金的年費,但是對於已經升級為Plus版本的個體,Netgate官方含糊其辭,只是建議重灌為CE版本,對於是否會取消許可並沒有說得很清楚,取消免費升級的時候,網路上一陣哀號,也有人破口大罵。

當然,大量中國製造的廉價noname box 在美國傾銷並濫用家庭許可Plus 版本是原因之一,Netgate 自有設備銷售價格非常不合理也是原因之一。

根據多方不明確的信源,pfSensePlus的許可證是綁定在網卡的mac地址上,我簡單的測試了一下,激活過許可證的實體確實可以從安裝好的CE版在升級菜單中選擇升級到Plus版本而無需再次激活,通過已經激活的實體dd clone過去的Plus版鏡像在另外一個已經激活的實體上也可以正常啟動和升級,但問題是我沒有測試更換硬碟,不能明確硬碟的serial number是否會對許可證產生影響。

Netgate的早期設備使用的是PC Engines的APU,這是由台灣生產,瑞士賣家在全球銷售的一款熱門主機板,他使用了AMD的低功耗APU,和Intel的內置顯卡多合一是一個概念,當然主要是低功耗。

後來Netgate開始在台灣尋找其他的貼牌代工,也就是現在的產品線,不得不說,這家公司的設計師審美真的很,做出來的產品外型,果粉不想買,Geek也沒有要想買。

今天要說的是如何在AWS上安裝pfSense,在AWS的Marketplace裡面有pfSensePlus版本,是需要付費的,一年799美金,還只是授權費用,沒算上instance和traffic fees。

我原本想要安裝CE版本上去,因為在2017年Netgate曾經有一篇Blog,說明從pfSense 2.4.1版本開始,Netgate發布的版本會支持AWS的ena network driver。

https://www.netgate.com/blog/aws-elastic-network-adapter-ena-now-supported

Amazon Drivers:https://github.com/amzn/amzn-drivers

但是,經過我的測試,他們已經悄悄的把這個driver拿掉並且用某種方式限制自行編譯的driver 從kldload加載,為什麼會這麼說呢?

因為每一個版本的pfSense 他們都使用了FreeBSD的current版本,目前CE2.7.2是FreeBSD 14.0-current,我使用從12.0-release,13.0-release,14.0-release,14.1-release,15.0-current 編譯出來的ena driver 都不能在CE2.7.2中正確加載,當然,也可能是因為必須要使用14.0-current,但是我找不到這個版本的source code。

在2017年的這篇Blog最後,有寫到

Complete instructions for enabling AWS ENA features are available in the Netgate AWS documentation.

但是,這篇Netgate AWS documentation 連結已經404 找不到了,我想,如果不是我的方法有問題,那就是這篇文件中有一些特別的設置

https://docs.netgate.com/pfsense/en/latest/solutions/aws-vpn-appliance/enabling-elastic-network-adapter-ena.html

Netgate 這家公司小動作很多,當然我是希望他們能賺錢$$$,不然不知道又要搞出什麼花兒來,然而,他們在許可證這件事情上做的並不嚴謹。

我想他們是出於簡化安裝過程或是多年來客人要求可以直接安裝Plus版本的目的(在此之前你不能直接安裝Plus版本,只能先安裝CE版本後從CE版本註冊升級為Plus版本),推出了一個新的installer,這個installer iso是二合一,他的模式是啟用一個具備網路環境的txt interface,然後根據選擇從網路下載相應的CE版本或Plus版本來安裝,在安裝的時候就會連線Netgate 的server 進行驗證當前實體是否具備安裝Plus的許可。

如果你在一台沒有激活過許可的物理機上使用這個installer,那麼你將無法安裝Plus版本,但是,你可以在AWS上,直接安裝Plus版本。

這有兩種可能,

第一,這個installer把AWS的mac地址範圍加入了白名單,但我觀察AWS的mac地址並沒有明顯特徵(AWS的mac地址不能修改,這是我懷疑的原因之一,因為mac地址在很多軟體中都會被設置為許可證相關的元素)。

第二,這個installer把來自於AWS source ip的安裝請求加入了白名單。

安裝的必要條件:

第一,AWS VPC中至少有兩個subnet,一個public subnet,一個private subnet,在兩個subnet中創建兩個eni,public subnet那張eni需要分配public IP。

第二:去pfSense官方網站下載iso。

第三:錢。

安裝的步驟如下:

使用本地的虛擬化平台,esxi或者proxmox 啟動一台linux,啟動後,加載pfSense官方的install iso,再添加一塊8GB 硬碟。

然後從linux 中,將iso 直接 dd 到8GB硬碟上。

dd if=/dev/sr0 of=/dev/sdb bs=1M status=progress

接下來,將8GB硬碟導出為vmdk,將這個vmdk上傳到S3,使用AWS的vmimport,將這個vmdk導入為snapshot。

aws ec2 import-snapshot –disk-container file://containers.json

—containers.json—
{
“Description”: “pfSense-installer”,
“Format”: “VMDK”,
“UserBucket”: {
“S3Bucket”: “s3-bucket”,
“S3Key”: “pfSense-installer.vmdk”
}
}
—containers.json—

aws ec2 describe-import-snapshot-tasks –import-task-id import-snap-0000000000631379

這中間你可能首先需要創建vmimport的IAM role,然後需要為vmimport的role 添加各種policy ,跟著錯誤提示走就可以,當snapshot 導入完成後,從這個snapshot創建一個ami,使用這個ami,啟動一台有serial console 的instance,例如t3.small,此時只需要有root volume和public subnet的那張eni。

啟動後,為這個instance 再添加一塊8GB的硬碟,從serial console來進行安裝,需要注意的是,你必須在剛開始的高級選項中開啟pfSense的 serial,否則安裝完成後,他不會輸出到ec2的serial console,你將會變成無頭蒼蠅,同時,在選擇硬碟的時候,請選擇第二塊。

Netgate的官方文件說明AWS Marketplace中的pfSensePlus初始化,是需要在user-data中設置password,這讓我懷疑,官方版本的ami沒有開啟serial,使得他沒有輸出到ec2的serial console,才需要從user-data去設置password,當然,這也可能是一種簡化用戶動作的辦法。

整個安裝過程很簡單,這個installer 檢測到是AWS之後,他就會自行安裝Plus版本,甚至你需要手動更改,才能變更安裝CE版本,當然,CE版本安裝上去會因為缺少ena network driver 而無法使用。

在AWS上運行的第三方防火牆軟體,需要遵循三個基本的原則,

第一,具備public IP的WAN口eni在public subnet,而LAN口eni在private subnet。

第二,關閉eni 的source/destination check。

第三,WAN和LAN均開啟為DHCP獲取IP地址。

安裝完成後,首先從serial console進行WAN口初始化,此時,只設置WAN口,不要設置LAN口,同時重置管理密碼。

當WAN口設置完成,再從AWS webconsole為ec2添加位於private subnet的那張eni,

此時我們應該可以從public IP進行連結,使用上一步重置的管理密碼登入,首先進入NAT設置,修改Outbound NAT方式為manual Outbound NAT rule generation,然後,從Interface Assignments 添加LAN口interface並設置為dhcp獲取IP地址,LAN口interface 添加完成後,再進入Outbound NAT,為需要進行nat 轉換的地址範圍手動添加nat rule。

不可以使用自動喔,否則你會連不上去。

最後,為我們的private subnet添加一條默認路由,指向LAN口的那張eni。

這樣所有在private subnet 裡面的instances 都可以把pfSense 作為nat gateway 來上網了。

安裝完成的pfSensePlus在註冊頁面並不能顯示為已註冊版本,和有正常許可證的顯示不太一樣,但這並不影響他升級,升級到新版本完全沒有任何問題。

而在物理機上通過dd clone的pfSensePlus 版本安裝在未激活許可證的實體上,不但顯示為未註冊,而且是不能升級的。

所以,我相信Netgate對於運行在AWS上的pfSensePlus 升級應該是採用了針對AWS source IP的白名單。

這也許是Netgate 故意要讓CE版本無法運行在AWS上的原因,因為,如果許可證檢測方式簡化為針對AWS source IP的白名單,在AWS上成功安裝的CE版本將會可以直接升級到Plus版本,這可不妙。

參考文件:https://yhf8377.medium.com/replace-aws-nat-gateway-with-pfsense-vm-5454066585c2