管理防火牆
IBM Cloud® Virtual Router Appliance (VRA) 能夠處理防火牆規則,以保護透過裝置遞送的 VLAN。
VRA 中的防火牆可以分成兩個步驟:
- 定義一組以上的規則。
- 將一組規則套用至介面或區域原則。 一個區域由一個以上的網路介面組成。 區域原則是針對從一個區域遍訪至另一個區域的資料流量所定義。
在建立防火牆規則之後務必要加以測試,以確保規則的運作符合預期,且新的規則不會限制對裝置的管理存取。
對 dp0bond1
介面操作規則時,建議使用 dp0bond0
連接至裝置。 也可以使用「智慧型平台管理介面 (IPMI)」連接至主控台。
無狀態與有狀態
依預設,防火牆為無狀態,但可以視需要配置為有狀態。 無狀態的防火牆將需要雙向資料流量規則,而有狀態的防火牆會追蹤連線並自動容許已接受流程的傳回資料流量。 若要配置有狀態防火牆,您必須指定要以有狀態方式運作的規則。
若要啟用 tcp
、udp
或 icmp
資料流量的「有狀態」追蹤,請執行下列指令:
set security firewall global-state-policy icmp
set security firewall global-state-policy tcp
set security firewall global-state-policy udp
請注意,global-state-policy
指令只會追蹤資料流量的狀態,而資料流量已符合明確地設定對應通訊協定的防火牆規則。 例如:
set security firewall name GLOBAL_STATELESS rule 1 action accept
因為 GLOBAL_STATELESS
未指定 protocol tcp
,所以 global-state-policy tcp
指令不會套用至此規則。
set security firewall name GLOBAL_STATEFUL_TCP rule 1 action accept
set security firewall name GLOBAL_STATEFUL_TCP rule 1 protocol tcp
在此情況下,會明確地定義 protocol tcp
。 global-state-policy tcp
指令會啟用資料流量的有狀態追蹤,而資料流量符合 GLOBAL_STATEFUL_TCP
的規則 1
若要將個別防火牆規則設為「有狀態」,請執行下列指令:
set security firewall name TEST rule 1 allow
set security firewall name TEST rule 1 state enable
這會啟用所有資料流量的有狀態追蹤,而資料流量可以進行有狀態地追蹤,並符合 TEST
規則 1,而不論 global-state-policy
指令是否存在。
協助有狀態追蹤的 ALG
有些通訊協定(例如 FTP)會利用一般有狀態防火牆作業可追蹤的更複雜階段作業。 有些預先配置的模組會啟用以有狀態方式管理這些通訊協定。
除非需要有這些 ALG 模組才能成功使用個別的通訊協定,否則建議予以停用。
set system alg ftp 'disable'
set system alg icmp 'disable'
set system alg pptp 'disable'
set system alg rpc 'disable'
set system alg rsh 'disable'
set system alg sip 'disable'
set system alg tftp 'disable'
防火牆規則集
防火牆規則會分組成具名集,以更輕鬆地將規則套用至多個介面。 每一個規則集都有與其相關聯的預設動作。 請考量下列範例:
set security firewall name ALLOW_LEGACY default-action accept
set security firewall name ALLOW_LEGACY rule 1 action drop
set security firewall name ALLOW_LEGACY rule 1 source address network-group1
set security firewall name ALLOW_LEGACY rule 2 action drop
set security firewall name ALLOW_LEGACY rule 2 destination port 23
set security firewall name ALLOW_LEGACY rule 2 log
set security firewall name ALLOW_LEGACY rule 2 protocol tcp
set security firewall name ALLOW_LEGACY rule 2 source address network-group2
在規則集 ALLOW_LEGACY
中,定義了兩個規則。 第一個規則會捨棄來自名為 network-group1
之位址群組的任何資料流量。 第二個會捨棄並記載來自位址群組 network-group2
的任何以 Telnet 埠 (tcp/23
) 為目的地的資料流量。 預設動作指出接受其他任何項目。 較好的作法是只容許必要的資料流量,然後使用規則集的預設動作來封鎖其餘部分。
容許資料中心存取
IBM Cloud 管理許多子網路 (專用服務網路),這些子網路為在其資料中心內執行的用戶端伺服器提供服務及支援。 例如,DNS 解析器服務在 10.0.80.11
和 10.0.80.12
上執行,而預設 NTP 伺服器在 10.0.77.54
上執行。 這三個都在 10.0.64.0/29
服務網路內。 佈建和支援期間會使用其他子網路。 您可以在 本主題 中找到資料中心使用的專用服務網路。
您可以將適當的 SERVICE-ALLOW
規則放在防火牆規則集開頭,並搭配 accept
的動作來容許資料中心存取。 規則集必須套用的位置,取決於要實作的遞送和防火牆設計。
建議您將防火牆規則放在導致最少重複工作的位置。 例如,容許 dp0bond0
上的後端子網路入埠,工作量會比容許對每個 VLAN 虛擬介面的後端子網路出埠要來得少。
每個介面的防火牆配置
在 VRA 上配置防火牆的一個方法是將防火牆規則集套用至每個介面。 在此情況下,介面可以是內部 VLAN 介面 (VIF) (例如 dp0bond0.1303
)、其中一個外部介面 (dp0bond0
(專用) 或 dp0bond1
(公用)),或通道介面 (例如 tun0
或 vti0
)。 每一個介面有三個可能的防火牆指派:
in
-防火牆會過濾進入介面的封包。 這些封包可以通過 VRA 或以 VRA 為目的地。
out
-防火牆會過濾離開介面的封包。 這些封包可以通過 VRA 或以 VRA 為目的地。
local
-針對以 VRA 為目的地的封包檢查防火牆。 迴圈介面 lo
可用來過濾任何介面上的本端入埠資料流量。 在將任何防火牆規則集當作 in
套用至任何介面之後,會處理套用至 local
的防火牆過濾器和規則集。
一個介面可在每一個方向套用多個規則集。 它們會依配置順序套用。 請注意,起源自 VRA 裝置的防火牆資料流量無法使用每個介面的防火牆。
例如,若要將 ALLOW_LEGACY
規則集指派給 dp0bond1
介面的 in
選項,您可以使用配置指令:
set interfaces bonding dp0bond1 firewall in ALLOW_LEGACY
Control Plane Policing (CPP)
Control Plane Policing (CPP) 提供對 IBM Cloud® Virtual Router Appliance 上之攻擊的抵禦,方法是容許您配置要指派給所需介面的防火牆原則,並且將這些原則套用至進入 VRA 的封包。
CPP 的實作時機是在 local
關鍵字用於指派給任何類型 VRA 介面的防火牆原則時,例如資料平面介面或迴圈。 與套用於遍訪 VRA 之封包的防火牆規則不同,對於進入或離開控制平面之資料流量的防火牆規則,其預設動作是 Allow
。 如果不想要預設行為,則使用者必須新增明確的捨棄規則。
VRA 提供基本 CPP 規則集作為範本。 您可以執行下列指令,將它合併至配置中:
vyatta@vrouter# merge /opt/vyatta/etc/cpp.conf
合併此規則集之後,會新增名為 CPP
的新防火牆規則集,並將它套用至迴圈介面。 建議您修改此規則集,以符合您的環境。
請注意,CPP 規則不能是有狀態的,而且只會套用至輸入資料流量。
區域型防火牆配置
在區域型防火牆配置中,會將一或多個介面指派給區域 (雖然無法將一個介面指派給多個區域),並將防火牆規則集從一個區域套用至另一個區域。 對於單一區域原則,當資料流量從第一個區域傳遞至第二個區域時,會過濾資料流量,且只會在出埠/輸出介面上進行過濾。 區域會捨棄未明確容許的任何進入資料流量。
介面可以屬於某個區域或具有每個介面的防火牆配置; 它不能同時這樣做。
請考量下列辦公室實務範例,其中有三個部門,每個部門都有自己的 VLAN:
- 部門 A-VLAN 10 及 20 (介面
dp0bond1.10
及dp0bond1.20
) - 部門 B-VLAN 30 及 40 (介面
dp0bond1.30
及dp0bond1.40
) - 部門 C-VLAN 50 (介面
dp0bond1.50
)
可以為每個部門建立一個區域,該部門的介面可以新增至該區域。 下列範例說明這一點:
set security zone-policy zone DEPARTMENTA interface dp0bond1.10
set security zone-policy zone DEPARTMENTA interface dp0bond1.20
set security zone-policy zone DEPARTMENTB interface dp0bond1.30
set security zone-policy zone DEPARTMENTB interface dp0bond1.40
set security zone-policy zone DEPARTMENTC interface dp0bond1.50
commit
指令會將每一個區域移入為介面,且預設捨棄規則會捨棄嘗試從外部進入區域的任何資料流量。 在範例中,VLAN 10 和 VLAN 20 可以傳遞資料流量,因為它們在相同的區域 (DEPARTMENTA
),但 VLAN 10 和 VLAN 30 不能傳遞資料流量,因為 VLAN 30 在不同的區域 (DEPARTMENTB
)。
每個區域內的介面可以自由傳遞資料流量,且可以針對區域之間的互動定義規則。 規則集是透過從將一個區域離開至另一個區域的觀點來配置。
下列指令顯示如何配置規則的範例:
set security zone-policy zone DEPARTMENTC to DEPARTMENTB firewall ALLOW_PING
此指令會將從 DEPARTMENTC
至 DEPARTMENTB
的轉移與名為 ALLOW_PING
的規則集相關聯。 將根據此規則集來檢查從 DEPARTMENTC
區域進入 DEPARTMENTB
區域的資料流量。
請務必瞭解,從區域 DEPARTMENTC
進入區域 DEPARTMENTB
的這項指派不會產生任何關於反向的陳述。 如果沒有任何規則容許從區域 DEPARTMENTB
到區域 DEPARTMENTC
的資料流量,則資料流量 (ICMP 回覆) 將不會回到 DEPARTMENTC
中的主機。
ALLOW_PING
將套用為 DEPARTMENTB
區域 (dp0bond1.30
和 dp0bond1.40
) 介面上的 out
防火牆。 由於這是由區域原則所安裝,因此只會針對規則集檢查源自來源區域介面 (dp0bond1.50
) 的資料流量。
區域型防火牆範例
下列範例詳述監視及除錯所有資料流量的防火牆環境,並吸收 VRA。
將 "log" 新增至規則 1 將嚴重影響效能,且應該僅用於除錯。
絕不讓您的公用介面保持開放狀態,如本範例所示。
set security zone-policy zone Public-and-VTI interface dp0bond1
set security zone-policy zone Public-and-VTI interface vti2
set security zone-policy zone Public-Inside interface dp0bond1.807
set security zone-policy zone Private-Outside interface dp0bond0
set security zone-policy zone Private-Inside interface dp0bond0.829
#ruleset to allow all statefully and log every packet
set security firewall name AllowAllLogALL rule 1 action accept
set security firewall name AllowAllLogALL rule 1 log
set security firewall name AllowAllLogALL rule 1 state enable
#security policy pair between public/IPSec and private network servers
set security zone-policy zone Public-and-VTI to Private-Inside firewall AllowAllLogALL
set security zone-policy zone Private-Inside to Public-and-VTI firewall AllowAllLogALL
#security policy pair between public/IPSec and public network servers
set security zone-policy zone Public-and-VTI to Public-Inside firewall AllowAllLogALL
set security zone-policy zone Public-Inside to Public-and-VTI firewall AllowAllLogALL
#security policy pair between service networks/private outside and private network customer servers
set security zone-policy zone Private-Outside to Private-Inside firewall AllowAllLogALL
set security zone-policy zone Private-Inside to Private-Outside firewall AllowAllLogALL
疑難排解防火牆規則
您可以對 interace 型及區域型防火牆配置進行疑難排解。
疑難排解介面型防火牆配置
下圖代表通過介面型防火牆配置的流程。
圖 1.
若要開始檢查及疑難排解,請執行下列指令以瞭解如何配置原則:
- 若要收集哪些防火牆規則集套用至每一個介面,以及在哪個方向,請執行
show configuration commands | grep firewall | grep interface
。 - 使用步驟 1 的輸出,您可以透過執行
show configuration commands | grep -iE '<name of firewall ruleset>'.
,在您嘗試檢查的流程中找到套用至介面的所有規則 - 檢查規則以確保容許適當的子網路、埠及通訊協定:
- 如果您要對服務網路至專用伺服器連線功能進行疑難排解,且規則集已套用
in
至 VIF (dp0bond0.XXX
),則必須將服務網路定義為目的地。 這是因為資料流量流入 VIF 時,即用戶端伺服器出埠傳送資料流量時。 - 如果您要對服務網路至專用伺服器連線功能進行疑難排解,且規則集已套用
out
個 VIF (dp0bond0.XXX
),則必須將服務網路定義為來源。 這是因為當資料流量從 VIF 流出時,它會流向用戶端伺服器。 - 如果您要對服務網路至專用伺服器連線功能進行疑難排解,且規則集已套用
in' to the
dp0bond0interface, then you must define the service networks as the sources. This is because traffic flowing into the
dp0bond0 ` 介面通常會以 Vyatta 後面的伺服器為目標。 - 如果您要對服務網路至專用伺服器連線功能進行疑難排解,且規則集已套用
out
dp0bond0
介面,則必須將服務網路定義為目的地。 這是因為從dp0bond0
流出的資料流量偏離 Vyatta 後面的用戶端伺服器的方向。
- 如果您要對服務網路至專用伺服器連線功能進行疑難排解,且規則集已套用
疑難排解區域型防火牆配置
下圖代表區域型防火牆配置。
圖 2.
若要開始檢查及疑難排解,請執行下列指令以瞭解如何配置原則:
- 若要顯示哪些介面位於哪些區域中,請執行
show configuration commands | grep zone | grep interface
。 - 使用步驟 1 的輸出,您可以執行
show configuration commands | grep <name of zone> | grep <name of other zone>
來尋找在每一個區域原則中套用的防火牆規則集。 - 使用步驟 2 的輸出,您可以透過執行
show configuration commands | grep -iE '<name of firewall ruleset>|<name of other firewall ruleset>'
,在您嘗試檢查的流程中找到套用至介面的所有規則。 - 檢查規則以確保容許適當的子網路、埠及通訊協定:
- 如果您要對服務網路至專用伺服器連線功能進行疑難排解,且原則是從 VIF (
dp0bond0.XXX
) 至dp0bond0
,則必須將服務網路定義為目的地。 - 對於從
dp0bond0
至 VIF (dp0bond0.XXX
) 的原則,您必須將服務網路定義為來源。
- 如果您要對服務網路至專用伺服器連線功能進行疑難排解,且原則是從 VIF (
下列範例詳細說明您可以用來取回所需資訊的指令,以判定防火牆是否應該容許服務網路。
vyatta@gateway02:~$ show configuration commands | grep zone | grep interface
set security zone-policy zone SL-Private-Servers interface 'dp0bond0.1750'
set security zone-policy zone SL-Private-Servers interface 'dp0bond0.1623'
set security zone-policy zone SL-Service interface 'dp0bond0'
vyatta@gateway02:~$ show configuration commands | grep SL-Private-Servers | grep SL-Service
set security zone-policy zone SL-Private-Servers to SL-Service firewall 'To-Private-Service-Network'
set security zone-policy zone SL-Service to SL-Private-Servers firewall 'To-Private-Servers'
vyatta@gateway02:~$ show configuration commands | grep -iE 'To-Private-Service-Network|To-Private-Servers'
set security firewall name To-Private-Servers rule 1 action 'accept'
set security firewall name To-Private-Servers rule 1 source address 'ServiceNetwork'
set security firewall name To-Private-Service-Network rule 1 action 'accept'
set security firewall name To-Private-Service-Network rule 1 destination address 'ServiceNetwork'
set security zone-policy zone SL-Private-Servers to SL-Service firewall 'To-Private-Service-Network'
set security zone-policy zone SL-Service to SL-Private-Servers firewall 'To-Private-Servers'
#Pull the actual subnets that I'm allowing via the defined ServiceNetwork addresses:
vyatta@gateway02:~$ show configuration commands | grep ServiceNetwork
set resources group address-group ServiceNetwork address '10.0.86.0/24'
set resources group address-group ServiceNetwork address '10.2.128.0/20'
set resources group address-group ServiceNetwork address '10.1.176.0/20'
set resources group address-group ServiceNetwork address '10.1.64.0/19'
set resources group address-group ServiceNetwork address '10.1.96.0/19'
set resources group address-group ServiceNetwork address '10.1.192.0/20'
set resources group address-group ServiceNetwork address '10.1.160.0/20'
set resources group address-group ServiceNetwork address '10.2.32.0/20'
set resources group address-group ServiceNetwork address '10.2.64.0/20'
set resources group address-group ServiceNetwork address '10.2.112.0/20'
set resources group address-group ServiceNetwork address '10.2.160.0/20'
set resources group address-group ServiceNetwork address '10.1.208.0/20'
set resources group address-group ServiceNetwork address '10.2.80.0/20'
set resources group address-group ServiceNetwork address '10.2.144.0/20'
set resources group address-group ServiceNetwork address '10.2.48.0/20'
set resources group address-group ServiceNetwork address '10.2.176.0/20'
set resources group address-group ServiceNetwork address '10.3.64.0/20'
set resources group address-group ServiceNetwork address '10.0.64.0/19'
set resources group address-group ServiceNetwork address '10.0.80.11'
set resources group address-group ServiceNetwork address '10.0.80.12'
set resources group address-group ServiceNetwork address '10.200.80.0/20'
set resources group address-group ServiceNetwork address '10.3.160.0/20'
set resources group address-group ServiceNetwork address '10.201.0.0/20'
set resources group address-group ServiceNetwork address '10.3.80.0/20'
set security firewall name To-Private-Servers rule 1 source address 'ServiceNetwork'
set security firewall name To-Private-Service-Network rule 1 destination address 'ServiceNetwork'
階段作業及封包記載
VRA 支援兩種類型的記載: 階段作業和每個封包。
階段作業記載
使用指令 security firewall session-log
來配置防火牆階段作業記載。
若為 UDP、ICMP 及所有非 TCP 流程,您的階段作業會隨著流程的生命週期轉移到四種狀態。 對於每一次轉移,您可以配置 VRA 來記載訊息。 TCP 有大量的狀態轉移,每一個都可以配置為記載。 下列範例詳細說明防火牆的 session-log
配置:
set security firewall session-log icmp established
set security firewall session-log tcp established
set security firewall session-log udp established
每個封包記載
對於每個封包記載,請確保在防火牆或 NAT 規則中包括關鍵字 log
。 這會記載符合規則的每個網路封包。
每個封包記載會在封包轉遞路徑中發生,並產生大量輸出。 每個封包記載可以大幅減少 VRA 的傳輸量,導致效能問題,並大幅增加用於日誌檔的磁碟空間。 建議您僅基於除錯目的使用每個封包記載。 針對所有作業目的,應該改用有狀態的階段作業記載。
使用防火牆日誌進行疑難排解
基於除錯目的,您可以設定預設日誌及每個封包記載。 每個封包記載可以新增至每個個別規則,以在捨棄或接受封包時顯示在日誌中 (視規則的動作集而定)。 發生時,預設日誌會記錄「隱含」捨棄。 對於下列區域原則型防火牆配置,每次資料流量不符合規則 1 時,就會記載預設日誌設定。 這是唯一配置的規則。
set security firewall name To-Private-Servers rule 1 action drop
set security firewall name To-Private-Servers rule 1 source address ServiceNetwork
set security firewall name To-Private-Servers rule 1 log
set security firewall name To-Private-Servers default-log
若要檢視日誌,有兩個指令,下列輸出示範特定資料流量的已記載區塊:
journalctl -u vyatta-dataplane | grep <IP Address>
show log firewall name To-Private-Servers | grep <IP Address>
vyatta@gateway02# journalctl -f -u vyatta-dataplane | grep 10.3.84.106
Feb 18 05:47:09 gateway02 vyatta-dataplane.service dataplane[4313]: fw rule To-Private-Servers:10000 block icmp(1) src=//10.3.84.106 dst=dp0bond0.1750//10.126.19.174 len=84 ttl=55 type=8 code=0
Feb 18 05:47:10 gateway02 vyatta-dataplane.service dataplane[4313]: fw rule To-Private-Servers:10000 block icmp(1) src=//10.3.84.106 dst=dp0bond0.1750//10.126.19.174 len=84 ttl=55 type=8 code=0
^C
[edit]