1、iptables的相關概念:前端
一、Firewall:防火牆,隔離工具;工做於主機或網絡邊緣,對於進出本主機或本網絡的報文根據事先定義的檢查規則做匹配檢測,對於可以被規則匹配到的報文做出相應處理的組件web
二、在Linux的內核中使用netfilter構架實現防火牆功能算法
三、iptables是Linux系統中爲用戶提供的netfilter管理工具,用於實現對Linux內核中防火牆的管理bash
四、netfilter/iptables的典型應用:服務器
做爲主機防火牆實現外部網絡與主機之間的訪問控制
網絡
做爲網絡防火牆提供外部網絡與內部網絡的訪問控制併發
2、iptables服務管理:app
CentOS 6:負載均衡
service iptables {start|stop|restart|status}dom
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
3、iptables規則管理:
規則的有效期限:
使用iptables命令定義的規則,手動刪除以前,其生效期限爲kernel存活期限;
保存規則:保存規則至指定的文件:
CentOS 6:
~]# service iptables save
將規則保存至/etc/sysconfig/iptables文件中;下次開機時會自動讀取此文件的規則
~]# iptables-save > /PATH/TO/SOME_RULES_FILE
CentOS 7:
~]# iptables-save > /PATH/TO/SOME_RULES_FILE
從新載入預存規則文件中規則:
通用方法:
~]# iptables-restore < /PATH/FROM/SOME_RULES_FILE
CentOS 6:
~]# service iptables restart
自動生效規則文件中的規則:
(1) 用腳本保存各iptables命令;讓此腳本開機後自動運行;
/etc/rc.d/rc.local文件中添加腳本路徑;
/PATH/TO/SOME_SCRIPT_FILE
(2) 用規則文件保存各規則,開機時自動載入此規則文件中的規則;
/etc/rc.d/rc.local文件中添加:
iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
3、iptables的功能結構:
功能<--鏈(四表五鏈):
raw:PREROUTING, OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,[INPUT],]OUTPUT,POSTROUTING
filter:INPUT,FORWARD,OUTPUT
4、iptables的匹配規則:
組成部分:根據規則匹配條件來嘗試匹配報文,一旦匹配成功,就由規則定義的處理動做做出處理;
匹配條件:
基本匹配條件
擴展匹配條件
處理動做:
基本處理動做
擴展處理動做
自定義處理機制
iptables的鏈:內置鏈和自定義鏈
內置鏈:對應於hook function(五個鏈)
自定義鏈:用於內置鏈的擴展和補充,可實現更靈活的規則管理機制
5、iptables的語法格式:
iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
使用幫助:
CentOS 6: man iptables
CentOS 7: man iptables-extensions
-t table:
raw, mangle, nat, [filter]默認
COMMAND:
鏈管理:
-N:new, 自定義一條新的規則鏈;
-X:delete,刪除自定義的規則鏈;
-P:Policy,設置默認策略;對filter表中的鏈而言,其默認策略有:
ACCEPT:接受
DROP:丟棄
REJECT:拒絕
-E:重命名自定義鏈;引用計數不爲0的自定義鏈不可以被重命名,也不能被刪除;
規則管理:
-A:append,追加;
-I:insert, 插入,要指明位置,省略時表示插入爲第一條;
-D:delete,刪除;
(1) 指明規則序號;
(2) 指明規則自己;
-R:replace,替換指定鏈上的指定規則;
-F:flush,清空指定的規則鏈;
-Z:zero,置零;
iptables的每條規則都有兩個計數器:
(1) 匹配到的報文的個數;
(2) 匹配到的全部報文的大小之和;
查看規則:
-L:list, 列出指定鏈上的全部規則;
-n:numberic,以數字格式顯示地址和端口號;
-v:verbose,詳細信息;
--line-numbers:顯示規則的序號;
chain:
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
匹配條件:
基本匹配條件:無需加載任何模塊,由iptables/netfilter自行提供;
-s:檢查報文中的源IP地址是否符合此處指定的地址或範圍;
-d:檢查報文中的目標IP地址是否符合此處指定的地址或範圍;
-p: {tcp|udp|icmp}
-i:數據報文流入的接口;只能應用於數據報文流入的環節,只能應用於PREROUTING,INPUT和FORWARD鏈;
-o:數據報文流出的接口;只能應用於數據報文流出的環節,只能應用於FORWARD、OUTPUT和POSTROUTING鏈;
擴展匹配條件: 須要加載擴展模塊,方可生效;
隱式擴展:不須要手動加載擴展模塊;由於它們是對協議的擴展,因此,但凡使用-p指明瞭協議,就表示已經指明瞭要擴展的模塊;
tcp:
--source-port[:port]:匹配報文的源端口;能夠是端口範圍;
--destination-port[:port]:匹配報文的目標端口;能夠是端口範圍;
--tcp-flags mask comp
例如 SYN,ACK,FIN,RST
例如:「--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[:port]:匹配報文的源端口;能夠是端口範圍;
--destination-port[:port]:匹配報文的目標端口;能夠是端口範圍;
icmp
--icmp-type {type[/code]|typename}
echo-request:8
echo-reply:0
顯式擴展:必需要手動加載擴展模塊, [-m matchname [per-match-options]];
處理動做:
-j targetname [per-target-options]
ACCEPT
DROP
REJECT
RETURN:返回調用鏈;
LOG:記錄日誌;
DNAT:目標地址轉換;
SNAT:源地址轉換;
MASQUERADE:地址假裝;
...
自定義鏈:
示例:
一、開放本機web服務器給非192.168.0.0/24網絡中的主機訪問;
~]# iptables -t filter -A INPUT ! -s 192.168.0.0/24 -d 172.16.17.71 -p tcp --dport 80 -j ACCEPT
二、禁止本機被非172.16.0.0/16網絡中的主機進行ping請求;
~]# iptables -I INPUT ! -s 172.16.0.0/16 -p icmp --icmp-type 8 -j DROP
三、開放本機的dns服務給全部主機;
~]# iptables -I INPUT -d 172.16.17.71 -p udp --dport 53 -j ACCEPT
顯式擴展:必須顯式地指明使用的擴展模塊進行的擴展;
一、multiport擴展
以離散方式定義多端口匹配;最多指定15個端口;
[!] --source-ports[,port|,port:port]...:指定多個源端口;
[!] --destination-ports[,port|,port:port]...:指定多個目標端口;
[!] --ports port[,port|,port:port]...:指明多個端口;
~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -j ACCEPT
二、iprange擴展
指明連續的(但通常不包括整個網絡)ip地址範圍;
[!] --src-range [-to]:源IP地址;
[!] --dst-range [-to]:目標IP地址;
~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP
三、string擴展
對報文中的應用層數據作字符串模式匹配檢測;
--algo {bm|kmp}:字符串匹配檢測算法;
[!] --string pattern:要檢測的字符串模式;
[!] --hex-string pattern:要檢測的字符串模式,16進制格式;
~]# iptables -A OUTPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp --sport 80 -m string --algo bm --string "gay" -j REJECT
四、time擴展
根據將報文到達的時間與指定的時間範圍進行匹配;
Possible values are Mon, Tue, Wed, Thu, Fri, Sat, Sun, or values from 1 to 7
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]
[!] --weekdays day[,day...]
--kerneltz:使用內核上的時區,而非默認的UTC;
~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
五、connlimit擴展
根據每客戶端IP作併發鏈接數數量匹配;
--connlimit-upto n:鏈接的數量小於等於n時匹配;
--connlimit-above n:鏈接的數量大於n時匹配;
~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJECT
六、limit擴展
基於收發報文的速率作匹配(令牌桶過濾器);
--limit rate[/second|/minute|/hour|/day] 平均速率 rate爲具體的速率
--limit-burst number 峯值速率
~]# iptables -I INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT ~]# iptables -I INPUT 2 -p icmp -j REJECT
七、state擴展
根據「鏈接追蹤機制」去檢查鏈接的狀態;
[!] --state state
conntrack機制:追蹤本機上的請求和響應之間的關係;狀態有以下幾種:
NEW:新發出請求;鏈接追蹤模板中不存在此鏈接的相關信息條目,所以,將其識別爲第一次發出的請求;
ESTABLISHED:NEW狀態以後,鏈接追蹤模板中爲其創建的條目失效以前期間內所進行的通訊狀態;
RELATED:相關聯的鏈接;如ftp協議中的數據鏈接與命令鏈接之間的關係;
INVALID:無效的鏈接;
UNTRACKED:未進行追蹤的鏈接;
調整鏈接追蹤功能所可以容納的最大鏈接數量:
/proc/sys/net/nf_contrack_max
已經追蹤到到的並記錄下來的鏈接:
/proc/net/nf_conntrack
不一樣的協議的鏈接追蹤時長:
/proc/sys/net/netfilter/
iptables的連接跟蹤表最大容量爲/proc/sys/net/ipv4/ip_conntrack_max,連接碰到各類狀態的超時後就會從表中刪除;當模板滿載時,後續的鏈接可能會超時
鏈接追蹤的反作用:
鏈接追蹤功能有最大鏈接數量限制,雖然能夠經過調整參數增長其記錄的追蹤記錄,可是當有大量的鏈接發往服務器時,會致使有大量的內存空間須要用來保存鏈接追蹤記錄,且容易形成內存碎片,長此以往會致使服務器性能降低
注意:前端的負載均衡器不要啓用鏈接追蹤機制
~]# iptables -A INPUT -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT ~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
如何使用自定義鏈:
自定義鏈:須要被調用才能生效;自定義鏈最後須要定義返回規則;
引用計數不爲0的自定義鏈不可以被重命名,也不能被刪除;只能清空其內的規則並解除調用狀態,方可重命名或刪除
返回規則使用的target叫作RETURN;
~]# iptables -N icmp ~]# iptables -E icmp in-icmp ~]# iptables -A in-icmp -d 172.16.17.71 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT ~]# iptables -A INPUT -d 172.16.17.71 -p icmp -j in-icmp ~]# iptables -A in-icmp -j RETURN //若是in-icmp中的規則匹配不到,則返回由調用鏈的規則匹配
netfilter: nat table
nat: network address translation
snat: source nat
dnat: destination nat
pnat: port nat
snat:POSTROUTING, OUTPUT
讓本地網絡中的主機經過某一特定地址訪問外部網絡時;
dnat:PREROUTING
把本地網絡中的某一主機上的某服務開放給外部網絡中的用戶訪問時;
nat表的target:
SNAT:
--to-source [ipaddr[-ipaddr]][:port[-port]]
--random
~]# iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j SNAT --to-source 172.16.100.67
DNAT:
--to-destination [ipaddr[-ipaddr]][:port[-port]]
~]# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77 ~]# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77:8080 ~]# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 22012 -j DNAT --to-destination 192.168.12.78:22
MASQUERADE:
源地址轉換:當源地址爲動態獲取的地址時,MASQUERADE可自行判斷要轉換爲的地址;
--to-ports port[-port]
--random
~]# iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j MASQUERADE
練習:INPUT和OUTPUT默認策略爲DROP;
一、限制本地主機的web服務器在週一不容許訪問;新請求的速率不能超過100個每秒;web服務器包含了admin字符串的頁面不容許訪問;web服務器僅容許響應報文離開本機;
~]# iptables -t filter -A INPUT -d 172.16.17.71 -p tcp --dport 80 -m state --state NEW -m limit --limit 100/second -m time ! --weekdays Mon -j ACCEPT ~]# iptables -t filter -A INPUT -d 172.16.17.71 -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT ~]# iptables -t filter -A OUTPUT-s 172.16.17.71 -p tcp --sport 80 -m state --state ESTABLISHED -m string --algo kmp ! --string "admin" -j ACCEPT
二、在工做時間,即週一到週五的8:30-18:00,開放本機的ftp服務給172.16.0.0網絡中的主機訪問;數據下載請求的次數每分鐘不得超過5個;
~]# iptables -t filter -R INPUT 2 -d 172.16.17.71 -s 172.16.0.0/16 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT ~]# iptables -t filter -R INPUT 3 -d 172.16.17.71 -s 172.16.0.0/16 -p tcp -m state --state RELATED -m limit --limit 5/min -j ACCEPT ~]# iptables -t filter -A INPUT -d 172.16.17.71 -s 172.16.0.0/16 -p tcp -m state --state ESTABLISHED -j ACCEPT ~]# iptables -t filter -A OUTPUT -d 172.16.0.0/16 -s 172.16.17.71 -p tcp -m state --state ESTABLISHED -j ACCEPT
三、開放本機的ssh服務給172.16.x.1-172.16.x.100中的主機,x爲你的學號,新請求創建的速率一分鐘不得超過2個;僅容許響應報文經過其服務端口離開本機;
~]# iptables -t filter -A INPUT -d 172.16.17.71 -p tcp --dport 22 -m state --state NEW -m iprange --src-range 172.16.17.1-172.16.17.100 -m limit --limit 2/min -j ACCEPT ~]# iptables -t filter -A INPUT -d 172.16.17.71 -p tcp --dport 22 -m state --state ESTABLISHED -m iprange --src-range 172.16.17.1-172.16.17.100 -j ACCEPT ~]# iptables -t filter -A OUTPUT -s 172.16.17.71 -p tcp --sport 22 -m iprange --dst-range 172.16.17.1-172.16.17.100 -m state --state ESTABLISHED -j ACCEPT
四、拒絕TCP標誌位所有爲1及所有爲0的報文訪問本機;
~]# iptables -t filter -A INPUT -d 172.16.17.71 -p --tcp-flags ALL ALL -j DROP
五、容許本機ping別的主機;但不開放別的主機ping本機;
~]# iptables -A INPUT ! -d 172.16.17.71 -p icmp --icmp-type 8 -j ACCEPT