iptables: 包過濾型防火牆
Firewall: 防火牆,隔離工具;工做於主機或網絡的邊緣,對於進出本主機或網絡的報文根據事先定義好的檢查規則做匹配檢測,對於可以被規則所匹配到的報文作出相應處理的組件;可分爲主機防火牆和網絡防火牆,centos6中的配置文件爲/etc/sysconfig/iptables
一. 基礎介紹之4表5鏈
1. 4表
filter: 過濾,當防火牆;
nat: 網絡地址轉換,包括地址和端口;
mangle:拆解報文,作出修改,封裝報文;
raw:關閉nat表上啓用的鏈接追蹤機制;有追蹤機制(其實就是記憶功能),才能完成NAT轉換
2. 5鏈(內置):
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
流入報文經由路徑:PREROUTING --> INPUT
流出報文經由路徑:OUTPUT --> POSTROUTING
轉發報文經由路徑:PREROUTING --> FORWARD --> POSTROUTING
3. 各功能能夠實現的位置:
filter:INPUT, FORWARD, OUTPUT
nat: PREROUTING(DNAT), OUTPUT, POSTROUTING(SNAT)
mangle:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
raw:PREROUTING, OUTPUT
4. 路由發生的時刻:
報文進入本機後,用於判斷目標主機;
報文發出以前,判斷經由哪一個接口送往下一跳;
5. 小結
iptables:主要是四表五鏈
1) 添加規則時的考量點:
(1) 要實現哪一種功能,用來判斷添加在哪張表上;
(2) 報文流經的路徑,用來判斷添加在哪一個鏈上;
2) 鏈:鏈上規則的次序,即爲檢查的次序;依據從上到下的順序
(1) 訪問同一應用(好比都訪問22端口),匹配範圍小的放上面;
(2) 訪問不一樣應用,匹配到報文頻率較大的放上面;
(3) 儘可能將多個規則合併爲一個,進行優化;
(4) 設置默認策略;
功能的優先級次序:raw --> mangle --> nat --> filter
6. 規則說明:
組成部分:報文的匹配條件,匹配到以後處理動做
1) 匹配條件:根據協議報文特徵指定,好比tcp, ip,udp等報文特徵
基本匹配條件
擴展匹配條件
2) 處理動做:
內建處理機制,好比drop, reject
自定義處理機制, 用於跳轉到自定義鏈
注意:報文不會通過自定義鏈,只能在內置鏈上經過規則進行引用後生效;
二. iptables命令:
它是一個規則生成器,相關操做有添加、修改、刪除、顯示等;
規則和鏈有計數器:
pkts:由規則或鏈所匹配到的報文的個數;
bytes:由規則或鏈匹配到的全部報文大小之和;
iptables命令:
iptables [-t table] {-A|-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
-t table包括:filter, nat, mangle, raw
1. 鏈管理:
-F:flush,清空規則鏈;省略鏈,表示清空指定表上的全部的鏈;
-N:new, 建立新的自定義規則鏈;
-X:drop, 刪除用戶自定義的空的規則鏈;
-Z:zero,清零,置零規則計數器;
-P:Policy,爲指定鏈設置默認策略;對filter表中的鏈而言,默認策略一般有ACCEPT, DROP, REJECT;
例如:iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD ACCEPT
設定INPUT、OUTPUT的默認策略爲DROP,FORWARD爲ACCEPT。
-E: rEname,重命令自定義鏈;引用計數不爲0的自定義鏈,沒法更名,也沒法刪除;
2. 規則管理:
-A:append,將新規則追加於指定鏈的尾部;
-I:insert,將新規則插入至指定鏈的指定位置;
-D:delete,刪除指定鏈上的指定規則;
有以下兩種指定方式:
(1) 指定匹配條件;
(2) 指定規則編號;
-R:replace,替換指定鏈上的指定規則;
3. 查看:
-L:list,列出指定鏈上的全部規則,後面還能夠跟以下的子參數來顯示更詳細的內容;
-n: numberic,以數字格式顯示地址和端口號;
-v: verbose,顯示詳細信息;
-vv, -vvv
--line-numbers:顯示規則編號;
-x: exactly, 顯示計數器計數結果的精確值;
4. 匹配條件:
1)基本匹配:
[!] -s, --src, --source IP|Netaddr:檢查報文中源IP地址是否符合此處指定的地址範圍,!表示取反;
[!] -d, --dst, --destination IP|Netaddr:檢查報文中目的IP地址是否符合此處指定的地址範圍;
-p, --protocol {tcp|udp|icmp}:檢查報文中的協議,即ip首部中的protocols所標識的協議;
-i, --in-interface IFACE:數據報文的流入接口;僅能用於PREROUTING, INPUT及FORWARD鏈上;
-o, --out-interface IFACE:數據報文的流出接口;僅能用於FORWARD, OUTPUT及POSTROUTING鏈上;
例1:容許別人ping我(本機地址:172.16.100.9)
iptables -A INPUT -d 172.16.100.9 -p icmp -j ACCEPT
iptables -A OUTPUT -s 172.16.100.9 -p icmp -j ACCEPT
例2:對流入流出接口進行限制,只容許eth0進行流入流出
iptables -A INPUT -d 172.16.100.9 -i eth0 -j ACCEPT
iptables -A OUTPUT -s 172.16.100.9 -o eth0 -j ACCEPT
5. 目標:
-j TARGET:jump至指定的TARGET,目標以下
ACCEPT: 接受
DROP: 丟棄
REJECT: 拒絕
RETURN: 返回調用鏈
REDIRECT:端口重定向
LOG: 記錄日誌
MARK:作防火牆標記
DNAT:目標地址轉換
SNAT:源地址轉換
MASQUERADE:地址假裝
...
自定義鏈:由自定義鏈上的規則進行匹配檢查
三. 匹配條件之擴展匹配
擴展匹配:包括隱式擴展,顯示擴展,基本格式爲-m macth_name --spec_options,例如 -m tcp --dport 22
1. 隱式擴展:對-p protocol指明的協議進行的擴展,可省略-m選項,按協議分類以下;html
1) -p tcp
--dport PORT[-PORT]:目標端口,能夠是單個端口或連續多個端口;
--sport PORT[-PORT]
--tcp-flags LIST1 LIST2:檢查LIST1所指明的全部標誌位,且這其中,LIST2所表示出的全部標記位必須爲1,而餘下的必須爲0;沒有LIST1中指明的,不做檢查
好比: --tcp-flags SYN,ACK,FIN,RST SYN 能夠簡寫爲--syn,表示檢查tcp鏈接的第一次請求
6個標誌位: SYN, ACK, FIN, RST, PSH, URG(請求同步,確認號有效,斷開請求,重置鏈接,推送,緊急指令)
例1:打開22端口,容許遠程管理。(設定了不少的附加條件:管理機器IP必須是250,而且必須從eth0網卡進入)
iptables -A INPUT -i eth0 -s 192.168.100.250 -d 192.168.100.1 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.100.250 -s 192.168.100.1 -p tcp --sport 22 -j ACCEPT
2) -p udp
--dport
--sport
例子:對於基於udp的dns服務,使用如下命令開啓端口服務
iptables -A OUTPUT -o eth2 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth2 -p udp --sport 53 -j ACCEPT
3) -p icmp
--icmp-type
可用數字表示其類型:
0:echo-reply
8: echo-request
例1:容許ping別人,不容許別人ping我(本機地址:172.16.100.9)
iptables -A OUTPUT -d 172.16.100.9 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -d 172.16.100.9 -p icmp --icmp-type 0 -j ACCEPT
例2:在全部網卡上打開ping功能,便於維護和檢測
iptables -A INPUT -i eth+ -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -o eth+ -p icmp --icmp-type 0 -j ACCEPT
2. 顯式擴展: 必須顯式指明使用的擴展模塊(rpm -ql iptables | grep "\.so")
CentOS 6: man iptables
CentOS 7: man iptables-extensions
1) multiport擴展
以離散方式定義多端口匹配;最多指定15個端口;
[!] --source-ports,--sports port[,port|,port:port]...:指明多個離散的源端口,22:25表示連續的端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指明多個離散的目標端口;
[!] --ports port[,port|,port:port]... :源和目標都行,不多用
~]# iptables -I INPUT -s 172.16.0.0/16 -d 172.16.100.9 -p tcp -m multiport --dports 22,80 -j ACCEPT
~]# iptables -I OUTPUT -d 172.16.0.0/16 -s 172.16.100.9 -p tcp -m multiport --sports 22,80 -j ACCEPT
2) iprange擴展
指明連續的(但通常是不能擴展爲整個網絡)ip地址範圍時使用;
[!] --src-range from[-to]:指明連續的源IP地址範圍;
[!] --dst-range from[-to]:指明連續的目標IP地址範圍;
~]# iptables -I INPUT -d 172.16.100.9 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 172.16.100.1-172.16.100.120 -j ACCEPT
~]# iptables -I OUTPUT -s 172.16.100.9 -p tcp -m multiport --sports 22:23,80 -m iprange --dst-range 172.16.100.1-172.16.100.120 -j ACCEPT
3)string擴展
檢查報文中出現的字符串;
--algo {bm|kmp},2種比對算法
bm = Boyer-Moore
kmp = Knuth-Pratt-Morris
[!] --string pattern,從頭至尾進行檢查
~]# iptables -I OUTPUT -m string --algo bm --string 'movie' -j REJECT (對網頁中有'movie‘字符的禁止訪問---容許請求此網頁,可是迴應不能到達本機)
4)time擴展
根據報文到達的時間與指定的時間範圍進行匹配;
--datestart
--datestop
--timestart
--timestop
--monthdays
--weekdays
iptables -I INPUT -d 172.16.100.9 -p tcp --dport 80 -m time --timestart 14:00 --timestop 16:00 -j REJECT (UTC格式時間)
5)connlimit擴展
根據每客戶端IP(也能夠是地址塊)作併發鏈接數數量匹配;
--connlimit-above n:鏈接的數量大於n,後面通常跟REJECT
iptables -I INPUT -p tcp --dport 22 -m connlimit --conlimit-above 3 -j REJECT
--connlimit-upto n: 鏈接的數量小於等於n,後面通常跟ACCEPT
6)limit擴展
基於收發報文的速率作檢查;
基於令牌桶過濾器來實現速率匹配,理解爲發令牌給人去辦事,只有辦完事還了令牌,才能發給下一我的去辦事
--limit rate[/second|/minute|/hour|/day]
--limit-burst number(峯值,不是必須的,就是空閒的時候不限速率,先最多給幾個)
例1:
iptables -A INPUT -d 172.16.100.9 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT
iptables -A OUTPUT -s 172.16.100.9 -p icmp --icmp-type 0 -j ACCEPT
例2:Dos攻擊防範
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
--limit 25/minute表示每分鐘限制最大鏈接數爲25
--limit-burst 100指定當總鏈接數超過100時,啓動limit/minute限制
7)state擴展--重要
根據鏈接追蹤機制檢查鏈接的狀態;(在指定時間內,好比6秒,記憶鏈接記錄,須要用內核內存空間)
調整鏈接追蹤功能所可以容納的最大鏈接數量:/proc/sys/net/nf_conntrack_max
已經追蹤到並記錄下的鏈接:/proc/net/nf_conntrack
不一樣協議或鏈接類型追的時長:/proc/sys/net/netfilter/
可追蹤的鏈接狀態:
NEW:新發出的請求;鏈接追蹤模板中不存此鏈接相關的信息條目,所以,將其識別爲第一次發出的請求;
ESTABLISHED:NEW狀態以後,鏈接追蹤模板中爲其創建的條目失效以前期間內所進行的通訊的狀態;
RELATED:相關的鏈接;如ftp協議的命令鏈接與數據鏈接之間的關係;
INVALIED:沒法識別的鏈接;
例子1
iptables -I INPUT -d 172.16.100.9 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -s 172.16.100.9 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
例子2: PING只響應別人
iptables -A INPUT -d 172.16.100.9 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.100.9 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
例子3: 配置web流量均衡
把一臺服務器做爲前段服務器,利用iptables進行流量分發,配置方法以下
iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:80
iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.102:80
iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.103:80
問題:如何開放被動模式的ftp服務?
(1) 裝載ftp追蹤時的專用的模塊:
# modprobe nf_conntrack_ftp
(2) 放行請求報文:
命令鏈接:NEW, ESTABLISHED,經過21端口
數據鏈接:RELATED, ESTABLISHED,隨機端口
# iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A INPUT -d LocalIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
(3) 放行響應報文:
ESTABLISEHD
# iptables -A OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT
四. 如何保存及重載規則:
保存規則至指定文件:iptables-save > /PATH/TO/SOMEFILE
從指定文件重載規則:iptables-restore < /PATH/FROM/SOMEFILE
CentOS 6:
service iptables save 至關於iptables-save > /etc/sysconfig/iptables
service iptables restart 至關於iptables-restore < /etc/sysconfig/iptables
CentOS 7:
引入了新的iptables前端管理服務工具:firewalld
firewalld-cmd
firewalld-config
其實centos7中也可使用iptables,那麼須要先禁用firewalld,方法以下
禁止firewall開機啓動:systemctl disable firewalld.service
關閉firewall: systemctl stop firewalld.service
啓動iptables: service iptables start
五. 回顧和練習:
iptables/netfilter
netfilter: kernel framework,
iptables
四表:filter, nat, mangle, raw
五鏈:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
子命令:
鏈:-F, -X, -N, -E, -Z, -P, -L
規則:-A, -I, -D, -R
-j TARGET:
ACCEPT, DROP, REJECT, RETURN, LOG, MARK, DNAT, SNAT, MASQUEARDE, ...
匹配標準:
通用匹配:-s, -d, -p, -i, -o
擴展匹配
隱含擴展:
-p tcp: --dport, --sport, --tcp-flags, --syn (--tcp-flags SYN,ACK,FIN,RST SYN)
-p udp: --dport, --sport
-p icmp: --icmp-type
顯式擴展: -m
練習:
主機防火牆:
放行telnet, ftp, web服務;
放行samba服務;
放行dns服務(查詢和區域傳送);
網絡防火牆:
放行telnet, ftp, web服務;
放行samba服務;
放行dns服務(查詢和區域傳送)