2017年8月29日 星期二

netfilter防火牆

Netfilter為Linux kernel的一個防火牆機制,
一般運作於L2 (Link Layer)跟L3 (Network Layer)之間
使用者利用iptablesnftables這個utility
下一些規則到底層的netfilter模組去做控制 [註一]
規則的組成主要分為chaintable這兩大項, 匹配原則主要是first match

chain1 PREROUTING
chain2 INPUT
chain3 FORWARD
chain4 OUTPUT
chain5 POSTROUTING

table1 filter (預設): limit
table2 nat: DNAT, SNAT, redirect
table3 mangle: mark, tos
table4 raw: connection tracking

下面說明當收到一個封包進來時,是如何處理的流程:
RX
當封包進來時,經由Layer1的NIC收到,根據這個封包的
4-tuple (source ip, source port, destination ip, destination port)
hash完交由cpu某一個core來處理,到了Layer2的NIC driver處理完之後
每個封包就會以skb的結構去呈現運作 [註二]。

當封包為route mode往上走到Layer3會檢查checksum validation
當checksum有問題就會丟棄這個封包,
之後開始進入netfilter的hook處理點,
經由PREROUTING處理完之後會查詢routing table
決定這封包的機會(deliver到INPUT)命運(forward到FORWARD)
如果這封包是deliver上面給這台主機去處理的話,
通常會在INPUT上面的filter去下規則來limit保護;
反之,這封包是要forward出去的話 [註三],
就會在FORWARD上面的filter去下規則來limit保護。

一般封包目的端都是本機,所以查詢routing table之後
封包會deliver往上到INPUT處理,再經由Transport Layer的socket去處理
所以一般在user space上寫應用程式
來接收複製socket裡面的封包到user space的buffer來處理 [註四]

TX
當應用程式處理完要回應封包時,會把這個message送往socket處理
然後查詢routing table決定EGRESS的介面是那一個,
然後經由OUTPUT->POSTROUTING->NIC driver送往NIC出去

[註一]
# lsmod | grep table
ip6table_filter       12815    1
ip6_tables            26902   1 ip6table_filter
iptable_filter         12810    1
ip_tables              27116    1 iptable_filter
x_tables               34802  4 ip6table_filter,ip_tables,iptable_filter,ip6_tables

[註二]
一般常用抓封包的tcpdump是運作於Layer2,所以針對INGRESS進來的封包
下符合條件封包規則drop丟棄( L3),在tcpdump還是可以看到此封包。

[註三]
啟動forward: echo 1 > /proc/sys/net/ipv4/ip_forward
經過FORWARD的封包TTL會減一,通常避免會有loop產生
例子: 無線IP分享器,大多數封包都是走forward,除非是要更改設定那台的設定,封包才會deliver到本機的網頁去做設定的動作。

[註四]
基本上一個封包進來會被複製copy兩次
NIC -> skb buffer
skb buffer -> user buffer




沒有留言:

張貼留言