Linux因爲其強大的防火牆功能而聞名,它主要依靠於iptables,一個運行在用戶空間的應用軟件,它可以通過控制Linux內核netfilter模塊,來管理網絡數據包的流動與轉送。它解決了網絡中很多***,比如網絡中常見的端口掃描、用戶密碼暴力破解等。
一、防火牆模型
主機通信基本模型:報文進入主機後進入接受緩衝區緩衝,內核從中取報文處理,拆開數據幀檢測是否是目標地址時本機地址,如果是則再拆TCP或UDP報文找到對應目的端口,發送給註冊在內核的用戶端進程;如果目標地址不是本機地址那麼就查看是否轉發,能轉發的情況下檢查路由,從那個端口發出去,再次封裝IP數據包,封裝數據幀,轉化爲物理層信號發到對應網卡;另外還有流出的數據包,從應用層程序封裝應用層報文到內核,內核通過路由轉發到對應端口。
netfilter模塊中在數量包流經各個關鍵處添加鉤子(hook),對數據包進行控制。netfilter主要內置了五個hook:
1.input
2.output
3.forward
4.prerouting
5.postrouting
三種報文流向:
流入本機:PREROUTING --> INPUT==>用戶空間進程
由本機流出:用戶空間進程==>OUTPUT --> POSTROUTING
轉發:PREROUTING --> FORWARD --> POSTROUTING
iptables(netfilter):四張表、五鏈
功能:對應四張表(tables),其中主要功能基礎是filter完成的防火牆功能
filter:過濾,防火牆功能;
nat:network address translation;用於修改源IP或目標IP,也可以改源端口或目的端口;
mangle:拆解報文,做出修改,並重新封裝起來;
raw:關閉nat表上啓用的連接追蹤機制;
iptables 鏈:iptables中的稱呼
鏈(內置):
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
自定義鏈:手動添加關聯關係,用於內置鏈的擴展和補充,可實現更靈活的規則管理機制;
功能和鏈對應實現(表<-->鏈):
raw:PREROUTING, OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,INPUT,]OUTPUT,POSTROUTING
filter:INPUT,FORWARD,OUTPUT
各個功能是有優先級的,逐類生效,如OUTPUT可定義5個功能:按次序實現;功能中規則有次序,同一個鏈上的不同表規則的應用優先級(由高到低)
路由功能發生的時刻:
報文進入本機後:
判斷目標主機是不是本機?
是:INPUT
否:FORWARD
報文離開本機之前:
判斷經由哪個接口送往下一站?
iptables服務就是:將iptables定義的腳本開機執行。規則寫入後立即在內核生效。
二、iptables/netfilter 規則
規則:
組成部分:匹配條件和處理動作---根據規則匹配條件來嘗試匹配報文,一旦匹配成功,就由規則定義的處理動作作出處理,不再匹配;
匹配條件:match,多個條件默認邏輯爲--與
基本匹配條件
擴展匹配條件:由於netfilter是模塊化的
處理動作:target,
基本處理動作
擴展處理動作
自定義處理機制
鏈上的規則次序,即爲檢查的次序;因此,隱含一定的應用法則:
(1) 同類規則(訪問同一應用),匹配範圍小的放上面;
(2) 不同類的規則(訪問不同應用),匹配到報文頻率較大的放在上面;
(3) 將那些可由一條規則描述的多個規則合併起來;
(4) 設置默認策略;
相互包含的以最先匹配爲準
添加規則時的考量點:
(1) 要實現哪種功能:判斷添加到哪個表上;
(2) 報文流經的路徑:判斷添加到哪個鏈上;
三、iptables命令:
iptables — administration tool for IPv4 packet filtering and NAT
iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
選項:
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options
主要格式:iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
-t table:
raw, mangle, nat, [filter]
COMMAND:
鏈管理:
-N:new, 定義一條自定義鏈;
-X: delete,刪除自定義的空鏈;
-P:Policy,設置默認策略;對filter表中的鏈而言,其默認策略有:
ACCEPT:接受
DROP:丟棄 不會返回結果
REJECT:拒絕 會返回結果
-E:重命名自定義,未被引用的鏈;引用計數不爲0的自定義鏈不能夠被重命名,也不能被刪除;
iptables -N testchain iptables -nL iptables -E testchain mychain iptables -nLiptables -X mychain iptables -nL iptables -L iptables -L |grep policy
規則管理:
-A:append,追加;
-I:insert, 插入,要指明位置,省略時表示第一條;
-D:delete,刪除;
(1) 指明規則序號;
(2) 指明規則本身;
-R:replace,替換指定鏈上的指定規則;
-F:flush,清空指定的規則鏈;
-Z:zero,計數器置零;
iptables的每條規則都有兩個計數器:
(1) 匹配到的報文的packages;
(2) 匹配到的所有報文的Bytes;
# iptables -nL INPUT Chain INPUT (policy ACCEPT)target prot opt source destination
-S:selected,以iptables-save 命令的格式顯示鏈上的規則;
所有命令的命令格式,可以用來保存規則保存到某個文件,以備恢復.
查看:
-L:list, 列出指定鏈上的所有規則;
-n:numberic,以數字格式顯示地址和端口號;
-v:verbose,詳細信息;
-vv, -vvv
-x:exactly,顯示計數器結果的精確值;
--line-numbers:顯示規則的序號;
組合: -nvL ,組合情況下只能將L放在最右側,-nL -nvL
chain:
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
匹配條件:
基本匹配條件
無需加載任何模塊,由iptables/netfilter自行提供;
[!] -s, --source address[/mask][,...]:檢查報文中的源IP地址是否符合此處指定的地址或範圍;
[!] -d, --destination address[/mask][,...]:檢查報文中的目標IP地址是否符合此處指定的地址或範圍;
[!] -p, --protocol protocol,限制協議
protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or "all"
{tcp|udp|icmp}
[!] -i, --in-interface name:數據報文流入的接口;只能應用於數據報文流入的環節,只能應用於PREROUTING,INPUT和FORWARD鏈;
[!] -o, --out-interface name:數據報文流出的接口;只能應用於數據報文流出的環節,只能應用於FORWARD、OUTPUT和POSTROUTING鏈。
擴展匹配條件
需要加載擴展模塊,方可生效;經由擴展模塊引入的匹配機制,-m matchname
隱式擴展
可以不用-m選項加載專門加載擴展模塊;因爲它們是對協議的擴展,所以,但凡使用-p指明瞭協議,就表示已經指明瞭要擴展的模塊;
[!] -p, --protocol protocol
協議:tcp, udp, udplite, icmp, esp, ah, sctp or all
tcp:隱含指明瞭 “-m tcp”,有專門選項:
[!] --source-port, --sport port[:port]:匹配tcp報文的源端口;可以是端口範圍(起始,結尾);
[!] --destination-port,--dport port[:port]:匹配報文的目標端口;可以是端口範圍;
[!] --tcp-flags mask comp:檢查報文中mask標誌的TCP標誌位,而要這些標誌位中comp中必須爲1
mask is the flags which we should examine, written as a comma-separated list,
例如:“--tcp-flags SYN,ACK,FIN,RST SYN”表示,要檢查的標誌位爲SYN,ACK,FIN,RST四個,其中SYN必須爲1,餘下的必須爲0;
“--tcp-flags SYN,ACK,FIN,RST ACK,FIN”表示,要檢查的標誌位爲SYN,ACK,FIN,RST四個,其中ACK,FIN必須爲1,餘下的必須爲0;
“--tcp-flags SYN,ACK,FIN,RST ALL NONE” 表示,要檢查的標誌位爲SYN,ACK,FIN,RST四個,必須全部爲0;
“--tcp-flags SYN,ACK,FIN,RSTSYN,ACK,FIN,RST ALL” 表示,要檢查的標誌位爲SYN,ACK,FIN,RST四個,必須全部爲1;
[!] --syn:用於匹配第一次握手,相當於“--tcp-flags SYN,ACK,FIN,RST SYN”;
udp 隱含指明瞭 “-m tcp”,有專門選項:
[!] --source-port, --sport port[:port]:匹配報文的源端口;可以是端口範圍;
[!] --destination-port,--dport port[:port]:匹配報文的目標端口;可以是端口範圍;
icmp
[!] --icmp-type {type[/code]|typename} :使用時可以只指定type就可以了。type0,8也僅僅只有一個code
echo-request:8/0 ping請求
echo-reply:0/0 對方應答
說明:DNS服務器,爲客戶端提供服務:開放自己53號端口;爲客戶端遞歸,開放對端端口53;
ping別人是icmp8出去,0回來
別人ping自己是icmp8進來,0出去
顯式擴展
必須要手動加載擴展模塊, [-m matchname [per-match-options]];
處理動作:
-j targetname [per-target-options]
ACCEPT
DROP
REJECT
RETURN:返回調用鏈;
REDIRECT:端口重定向;
LOG:記錄日誌;
MARK:做防火牆標記;
DNAT:目標地址轉換;
SNAT:源地址轉換;
MASQUERADE:地址僞裝;
...
自定義鏈:
四、防火牆服務
CentOS 6:
service iptables {start|stop|restart|status}
start:讀取事先保存的規則,並應用到netfilter上;
stop:清空netfilter上的規則,以及還原默認策略等;
status:顯示生效的規則;
restart:清空netfilter上的規則,再讀取事先保存的規則,並應用到netfilter上;
默認的規則文件:/etc/sysconfig/iptables
CentOS 7:
systemctl start|stop|restart|status firewalld.service
systemctl disable firewalld.service
systemctl stop firewalld.service
五、簡單實例
開放DNS服務的防火牆,要求能夠正常提供DNS服務,但其他任何端口都不開放。
首先,修改默認策略,將INUT、OUTPUT默認策略修改爲DROP,丟棄所有報文;
iptables -P INPUT DROP iptables -P OUTPUT DROP
其次,主機開放DNS服務
iptables -A INPUT -d 172.18.100.67 -s 0/0 -p tcp --dport 53 -j ACCEPT iptables -A OUTPUT -s 172.18.100.67 -d 0/0 -p tcp --sport 53 -j ACCEPT
再次,考慮到DNS服務器可能爲主機遞歸查詢DNS,所以也要開放DNS服務器作爲DNS客戶端訪問根DNS服務器的端口;
iptables -A INPUT -s 0/0 -d 172.18.100.67 -p tcp --sport 53 -j ACCEPT iptables -A OUTPUT -s 172.18.100.67 -p tcp --dport 53 -j ACCEPT
默認可能還需要開啓sshd服務,可以添加
iptables -A INPUT -d 172.18.100.67 -s 0/0 -p tcp --dport 22 -j ACCEPT iptables -A OUTPUT -s 172.18.100.67 -d 0/0 -p tcp --sport 22 -j ACCEPT
篇幅關係,這裏僅僅介紹基礎的主機防火牆設置,下篇博文介紹主機防火牆高級擴展應用。