2017年8月31日 星期四

Linux system

一般Linux system分為user space(以下簡稱U), kernel space(以下簡稱K), hw
我們在寫應用程式就是在user space,每個程式都有獨立的virtual memory空間
裡面會有stack, heap, .bss, .data, .text等這些存放資訊與資料
透過檢查memory leak讓系統不會有OOM(out of memory)產生,
透過檢查pointer的部分讓程式不會有segmentation fault產生
程式與程式之間要透過IPC來溝通,有以下這幾種方式
(1) unix domain socket
(2) message queue
(3) shared memory
(4) semaphore
(5) signal
(6) pipe

U跟K中間會有一層system call介面,可用strace這個tool去查看
K大略可分為三大項
(1) Memory
(2) Process
(3) I/O子系統




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