iptables/netfilter——Linux系統下的防火墻
基本原理
防火墻主要功能
工作于主機或者網絡邊緣,對進出本主機或本網絡的報文進行匹配檢測,對匹配到規則的報文進行于規則相對應的處理。
防火墻主要分類
- 按功能分類
主機防火墻
網絡防火墻
- 按構成分類
軟件防火墻
硬件防火墻
Linux防火墻軟件iptables/netfilter(以后簡稱iptables)
內置五條鏈
PREROUTING INPUT FORWARD OUTPUT POSTROUTING
構成五大功能(五個表)
filter:過濾,防火墻; nat:network address translation;用于修改源IP或目標IP,也可以改端口; mangle:拆解報文,做出修改,并重新封裝起來; raw:關閉nat表上啟用的連接追蹤機制; security:未廣泛使用
各功能鏈結構
raw:PREROUTING, OUTPUT mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING nat:PREROUTING,[INPUT,]OUTPUT,POSTROUTING filter:INPUT,FORWARD,OUTPUT
包過濾流程圖
配置思路
iptables內容
主要包含兩個方面
-
匹配條件
基本匹配條件:內建
擴展匹配條件:由擴展模塊定義 -
處理動作
基本處理動作:內建
擴展處理動作:由擴展模塊定義
自定義處理機制:自定義鏈
iptables配置原則
- 要實現哪種功能:判斷添加到哪個表上
- 報文流經的路徑:判斷添加到哪個鏈上
鏈配置原則
- 同類規則(訪問同一應用),匹配范圍小的放上面
- 不同類的規則(訪問不同應用),匹配到報文頻率較大的放在上面
- 將那些可由一條規則描述的多個規則合并起來
- 設置默認策略
iptables配置指令——filter
鏈管理
-N 自定義一條新鏈
iptables [-t table] -N chain
-X 刪除自定義的規則鏈(僅能刪除引用計數為0的空的自定義鏈)
iptables [-t table] -X [chain]
-P 設置默認策略
iptables [-t table] -P chain target
-E 重命名自定義鏈(不能重命名引用計數不為0的鏈)
iptables [-t table] -E old-chain-name new-chain-name
規則管理
-A 在尾部追加新規則
iptables [-t table] -A chain rule-specification
-I 插入新規則到指定位置(不指定為插入到第一條)
iptables [-t table] -I chain [rulenum] rule-specification
-D 刪除指定規則
iptables [-t table] -D chain rulenum 指定序號刪除 iptables [-t table] -D chain rule-specification 指定規則刪除
-R 替換指定規則
iptables [-t table] -R chain rulenum rule-specification
-F 清空指定規則鏈(默認清空所有)
iptables [-t table] -F [chain [rulenum]] [options...]
-Z 歸零規則鏈
iptables的每條規則都有兩個計數器:
- 匹配到的報文的個數;
- 匹配到的所有報文的大小之和;
iptables [-t table] -Z [chain [rulenum]] [options...]
-L 查看iptables規則
- -n:numberic,以數字格式顯示地址和端口號;
- -v:verbose,詳細信息;-vv, -vvv
- -x:exactly,顯示計數器結果的精確值;
iptables [-t table] -L [chain [rulenum]] [options...]
rule-specification
包含兩方面內容
- 匹配條件
- 處理動作
匹配條件
- 基本匹配條件
[!] -s, --source address[/mask][,...]:檢查報文中的源IP地址是否符合此處指定的地址或范圍; [!] -d, --destination address[/mask][,...]:檢查報文中的目標IP地址是否符合此處指定的地址或范圍;所有地址:0.0.0.0/0 [!] -p, --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鏈;
-
拓展匹配條件
-
隱式拓展條件
不需要手動加載擴展模塊;因為它們是對協議的擴展,所以,但凡使用-p指明了協議,就表示已經指明了要擴展的模塊
-
隱式拓展條件
tcp: [!] --source-port, --sport port[:port]:匹配報文的源端口;可以是端口范圍; [!] --destination-port,--dport port[:port]:匹配報文的目標端口;可以是端口范圍; [!] --tcp-flags mask comp mask is the flags which we should examine, written as a comma-separated list,例如 SYN,ACK,FIN,RST comp is a comma-separated list of flags which must be set,例如SYN 例如:“--tcp-flags SYN,ACK,FIN,RST SYN”表示,要檢查的標志位為SYN,ACK,FIN,RST四個,其中SYN必須為1,余下的必須為0; [!] --syn:用于匹配第一次握手,相當于”--tcp-flags SYN,ACK,FIN,RST SYN“; udp [!] --source-port, --sport port[:port]:匹配報文的源端口;可以是端口范圍; [!] --destination-port,--dport port[:port]:匹配報文的目標端口;可以是端口范圍; icmp [!] --icmp-type {type[/code]|typename} echo-request:8 echo-reply:0
-
-
顯式拓展條件
必須使用-m選項指明要調用的擴展模塊的擴展機制
-
顯式拓展條件
1、multiport
This module matches a set of source or destination ports. Up to 15 ports can be specified. A port range (port:port) counts as two ports. It can only be used in conjunction with one of the following protocols: tcp, udp, udplite, dccp and sctp. 以離散或連續的 方式定義多端口匹配條件,最多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
2、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
3、time
This matches if the packet arrival time/date is within a given range. --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;
4、string
This modules matches a given string by using some pattern matching strategy. --algo {bm|kmp} [!] --string pattern [!] --hex-string pattern --from offset --to offset ~]# iptables -I OUTPUT -m string --algo bm --string "say" -j REJECT
5、connlimit
Allows you to restrict the number of parallel connections to a server per client IP address (or client address block). --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
6、limit
This module matches at a limited rate using a token bucket filter. --limit rate[/second|/minute|/hour|/day] --limit-burst number ~]# iptables -I OUTPUT -s 172.16.0.7 -p icmp --icmp-type 0 -j ACCEPT 限制本機某tcp服務接收新請求的速率:--syn, -m limit
7、state
The "state" extension is a subset of the "conntrack" module. "state" allows access to the connection tracking state for this packet. [!] --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*
處理動作
-j: ACCEPT/DROP 接受/丟棄 REJECT:--reject-with 返回錯誤 LOG:--log-level, --log-prefix 記錄日志 自定義鏈 轉入使用自定義鏈 RETURN 返回上一層鏈
iptables保存和還原
iptables-save 保存iptables配置 iptables-restore 還原iptables配置(會清空原有配置)
iptables配置指令——nat
NAT: Network Address Translation 地址轉換
- 請求報文:由管理員定義
- 響應報文:由NAT的conntrack機制自動實現
請求報文中的地址變動
- 修改源地址:SNAT,MASQUERADE
- 修改目標地址:DNAT
- 修改端口地址:REDIRECT
NAT定義在nat表:PREROUTING,INPUT,OUTPUT,POSTROUTING
- SNAT:POSTROUTING
- DNAT:PREROUTING
target:
-
SNAT
--to-source [ipaddr[-ipaddr]]
-
DNAT
--to-destination [ipaddr[-ipaddr]][:port[-port]]
- MASQUERADE
-
REDIRECT
--to-ports port[-port]
原創文章,作者:easyTang,如若轉載,請注明出處:http://www.www58058.com/78009