Linux基礎(chǔ)教程之iptables/netfilter入門到進(jìn)階
隨著互聯(lián)網(wǎng)技術(shù)的方興未艾,各種網(wǎng)絡(luò)應(yīng)用層出不窮,網(wǎng)絡(luò)攻擊、黑客入侵也成了網(wǎng)民暢游互聯(lián)網(wǎng)的心頭大患,互聯(lián)網(wǎng)安全也愈加受到了人們的重視。網(wǎng)絡(luò)防火墻,作為一種簡(jiǎn)單高效的互聯(lián)網(wǎng)防御手段,逐漸成為了網(wǎng)民暢游網(wǎng)絡(luò)世界的保護(hù)傘。下面筆者介紹下Linux系統(tǒng)的守衛(wèi)者——iptables/netfilter。
?一 兄弟齊心,其利斷金
?iptables/netfilter就像一對(duì)兄弟,netfilter是大哥,善使長(zhǎng)鉤;iptables是小弟,擅長(zhǎng)書記。這兩兄弟一武一文,掌握著守城重任。
?netfilter大哥師承名門,身負(fù)五把長(zhǎng)鉤,每一個(gè)流經(jīng)他的數(shù)據(jù)流都逃不過他的法眼,只見得五把長(zhǎng)鉤上下翻飛舞得水泄不通,將那不符合規(guī)則的數(shù)據(jù)包挑落馬下。這五把長(zhǎng)鉤埋伏在城門的五個(gè)位置,分別是:NF_IP_PRE_ROUTING、NF_IP_LOCAL_IN、NF_IP_FORWARD、NF_IP_POST_ROUTING、NF_IP_LOCAL_OUT。他們分別對(duì)應(yīng)了下圖的五個(gè)位置。
iptables小弟學(xué)富五車,手拿生死簿,記載了亂臣賊子的具體情況,netfilter大哥就是按照生死簿的記載檢查每個(gè)數(shù)據(jù)包,以辨忠奸。
二 四章生死簿
生死簿內(nèi)所載內(nèi)容分為四個(gè)章節(jié):raw、mangle、nat、filter
raw、mangle記載了極高深的內(nèi)容,正所謂曲高和寡,平常極少用到。filter里記錄了過濾規(guī)則;nat表記錄了地址轉(zhuǎn)換和端口映射相關(guān)規(guī)則。
三 iptables命令
iptables [-t tablename] {-A|-D|-I|-F|-L|-Z|-P} 鏈名 rule-specification
-t 指定表名,默認(rèn)為filter表
-A 追加防火墻規(guī)則
-D 刪除規(guī)則
-I 插入規(guī)則
-F 清空規(guī)則
-L 列出規(guī)則
-R 替換規(guī)則
-Z 清空計(jì)數(shù)
-P 設(shè)置鏈默認(rèn)規(guī)則
鏈管理:
-N 創(chuàng)建新鏈
-X 刪除用戶自定義引用計(jì)數(shù)為0的空鏈
-E 自定義鏈重命名
-S 列出選定鏈的規(guī)則
[!] -p 匹配協(xié)議
[!] -s 匹配源地址
[!] -d 匹配目標(biāo)地址
[!] -i 匹配入站網(wǎng)卡地址
[!] -o 匹配出站網(wǎng)卡地址
[!] –sport 匹配源端口
[!] –dport 匹配目的端口
[!] –src-range 匹配源地址范圍
[!] –dst-range 匹配目的地址范圍
[!] –limit 匹配數(shù)據(jù)表速率
[!] –mac-source 匹配mac地址
[!] –state 匹配狀態(tài)(INVALID ESTABLISHED NEW RELATED)
[!] –string 匹配應(yīng)用層字串
觸發(fā)動(dòng)作:
ACCEPT 允許數(shù)據(jù)包通過
DROP 丟棄數(shù)據(jù)包
REJECT 拒絕數(shù)據(jù)包通過
LOG 將數(shù)據(jù)包信息記錄syslog日志
DNAT 目標(biāo)地址轉(zhuǎn)換
SNAT 源地址轉(zhuǎn)換
MASQUERADE 地址欺騙
REDIRRECT 重定向
?四 filter表規(guī)則
filter表是最常被使用的表,是iptables命令默認(rèn)修改的表。它包含了3條鏈,分別是input、forward和output,分別用來制定進(jìn)入本機(jī)、轉(zhuǎn)發(fā)和離開本機(jī)的數(shù)據(jù)包規(guī)則。
1? 修改默認(rèn)規(guī)則
使用iptables -P命令修改默認(rèn)規(guī)則,例如:
iptables -P INPUT ACCEPT
建議在input鏈最后添加DROP規(guī)則,例如:
iptables -A INPUT -p tcp -d 172.18.55.7 -j
DROP
這樣即使清空規(guī)則后也不會(huì)斷網(wǎng)。
2 增、刪、改規(guī)則
使用-A在鏈尾增加規(guī)則;使用-I可以指定添加規(guī)則的位置,如不指定位置序號(hào),則在開頭增加,例如除了22端口以外,禁止連接本機(jī)的端口:
iptables -A INPUT -p tcp -d 172.18.55.7 -j
DROP
iptables -I INPUT -d 172.18.55.7 -p tcp
–dport 22 ACCEPT
使用-D可以刪除某條規(guī)則,例如刪除某一條規(guī)則
iptabels -D INPUT 1
3 擴(kuò)展規(guī)則
擴(kuò)展規(guī)則分為顯式擴(kuò)展和隱式擴(kuò)展,顯式擴(kuò)展是指使用-m參數(shù);隱式擴(kuò)展是指在-p參數(shù)后可以省略-m參數(shù)。
隱式擴(kuò)展包括的參數(shù)有:
-p tcp
[!] –source-port,–sport port[:port]
[!] –destination-port,–dport port[:port]
[!] –tcp-flags mask comp
[!] –syn
-p udp
[!] –source-port,–sport port[:port]
[!] –destination-port,–dport port[:port]
-p icmp
[!] –icmp-type {type[/code]|typename}
0/0: echo reply
8/0:echo request
顯式擴(kuò)展包括的參數(shù)有:
-m multiport
以離散或連續(xù)的
方式定義多端口匹配條件,最多15個(gè);
[!] –source-ports,–sports port[,port|,port:port]…:指定多個(gè)源端口;
[!] –destination-ports,–dports
port[,port|,port:port]…:指定多個(gè)目標(biāo)端口;
例:# iptables -I INPUT? -d
172.16.0.7 -p tcp -m multiport –dports 22,80,139,445,3306 -j ACCEPT
-m iprange
以連續(xù)地址塊的方式來指明多IP地址匹配條件;
[!] –src-range from[-to]
[!] –dst-range from[-to]
例:# iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport –dports
22,80,139,445,3306 -m iprange –src-range 172.16.0.61-172.16.0.70 -j REJECT
-m time
以時(shí)間或日期作為包過濾條件
–timestart hh:mm[:ss]
–timestop hh:mm[:ss]
[!] –weekdays day[,day…]
[!] –monthdays day[,day…]
–datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–kerneltz:使用內(nèi)核配置的時(shí)區(qū)而非默認(rèn)的UTC;
-m string
以字符串為條件過濾數(shù)據(jù)包
–algo {bm|kmp}
[!] –string pattern
[!] –hex-string pattern
–from offset
–to offset
~]# iptables -I OUTPUT -m string –algo bm
–string “gay” -j REJECT
-m connlimit
限制每個(gè)IP連接服務(wù)器的連接數(shù)
–connlimit-upto n
–connlimit-above n
~]# iptables -I INPUT -d 172.16.0.7 -p tcp
–syn –dport 22 -m connlimit –connlimit-above 2 -j REJECT
-m limit
限制連接速率
–limit rate[/second|/minute|/hour|/day]
–limit-burst number
~]# iptables -I OUTPUT -s 172.16.0.7 -p
icmp –icmp-type 0 -j ACCEPT
-m state
“state”擴(kuò)展是對(duì)”conntrack”子模塊的擴(kuò)展。? “state”擴(kuò)展可以依照連接的狀態(tài)過濾數(shù)據(jù)包。
[!] –state state
INVALID, ESTABLISHED, NEW, RELATED or
UNTRACKED.
NEW: 新連接請(qǐng)求;
ESTABLISHED:已建立的連接;
INVALID:無(wú)法識(shí)別的連接;
RELATED:相關(guān)聯(lián)的連接,當(dāng)前連接是一個(gè)新請(qǐng)求,但附屬于某個(gè)已存在的連接;
UNTRACKED:未追蹤的連接;
state擴(kuò)展:
內(nèi)核模塊裝載:
nf_conntrack
nf_conntrack_ipv4
手動(dòng)裝載:
nf_conntrack_ftp
追蹤到的連接:
/proc/net/nf_conntrack
調(diào)整可記錄的連接數(shù)量最大值:
/proc/sys/net/nf_conntrack_max
調(diào)整超時(shí)時(shí)長(zhǎng):
/proc/sys/net/netfilter/*timeout*
4 處理動(dòng)作(跳轉(zhuǎn)目標(biāo))
-j targetname [per-target-options]
簡(jiǎn)單target:
ACCEPT, DROP
擴(kuò)展target:
REJECT
–reject-with type
LOG
–log-level
–log-prefix
5保存和載入規(guī)則:
保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重載:iptabls-restore < /PATH/FROM/SOME_RULE_FILE
-n, –noflush:不清除原有規(guī)則
-t, –test:僅分析生成規(guī)則集,但不提交
五 nat表規(guī)則
iptables不僅可以實(shí)現(xiàn)數(shù)據(jù)包過濾,還可以實(shí)現(xiàn)網(wǎng)絡(luò)地址轉(zhuǎn)換,這項(xiàng)功能是通過修改nat表實(shí)現(xiàn)的。nat表一般作用在PREROUTING和POSTRONTING鏈上,然后通過FORWARD鏈過濾流經(jīng)的數(shù)據(jù)包。
示例:將流經(jīng)網(wǎng)關(guān)的數(shù)據(jù)包的源地址改為192.168.10.254
iptables -t nat -A POSTROUTING -s 172.18.0.0/16 -j SNAT –to-source
192.168.10.254
如果是撥號(hào)地址,那么可以用MASQUERADE參數(shù)
示例:將流入網(wǎng)關(guān)80端口的數(shù)據(jù)包轉(zhuǎn)發(fā)給192.168.10.2
iptables -t nat -A PREROUTING -d 172.18.55.7 -p tcp –dport 80 -j DNAT
–to-destination 192.168.10.2