標籤:iptables 主機 防火牆
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 -nLiptables -E testchain mychainiptables -nLiptables -X mychainiptables -nLiptables -Liptables -L |grep policy
規則管理:
-A:append,追加;
-I:insert, 插入,要指明位置,省略時表示第一條;
-D:delete,刪除;
(1) 指明規則序號;
(2) 指明規則本身;
-R:replace,替換指定鏈上的指定規則;
-F:flush,清空指定的規則鏈;
-Z:zero,計數器置零;
iptables的每條規則都有兩個計數器:
(1) 匹配到的報文的packages;
(2) 匹配到的所有報文的Bytes;
# iptables -nL INPUTChain 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 DROPiptables -P OUTPUT DROP
其次,主機開放DNS服務
iptables -A INPUT -d 172.18.100.67 -s 0/0 -p tcp --dport 53 -j ACCEPTiptables -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 ACCEPTiptables -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 ACCEPTiptables -A OUTPUT -s 172.18.100.67 -d 0/0 -p tcp --sport 22 -j ACCEPT
篇幅關係,這裡僅僅介紹基礎的主機防火牆設定,下篇博文介紹主機防火牆進階擴充應用。
本文出自 “深海魚” 部落格,請務必保留此出處http://kingslanding.blog.51cto.com/9130940/1769431
iptables 防火牆之主機防火牆