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