iptables命令的使用格式:nginx
iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]] [-j targetname [per-target-options]]算法
匹配條件:shell
基本匹配條件安全
擴展匹配條件bash
隱式擴展服務器
顯式擴展網絡
注意:多重條件之間的隱含邏輯爲「與」操做;併發
基本匹配條件:負載均衡
條件以前的!表示能夠對條件進行取反ssh
(1)[!] -s, --source address[/mask][,...]:檢查報文中的源IP地址是否符合此處指定的地址或地址範圍;
iptables -I INPUT -s 10.1.0.71 -j REJECT //拒絕來自10.1.0.71的訪問 iptables -I INPUT -s 10.1.0.0/16 -j ACCEPT //放行10.1.0.0/16網絡中的主機訪問 iptables -R INPUT 1 -s 10.1.0.71 -j DROP //來自10.1.0.71的訪問的包丟掉 iptables -D INPUT 1 //刪除INPUT鏈中的第一條規則 iptables -D INPUT -s 10.1.0.71 -j DROP //刪除明確給出規則的INPUT鏈規則
(2)[!] -d, --destination address[/mask][,...]:檢查報文中的目標IP地址是否符合此處指定的地址或地址範圍;
(3)[!] -p, --protocol protocol:檢查報文中傳輸層的協議類型,支持tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh,或者 "all";
iptables -A INPUT -s 10.1.0.0/16 -d 10.1.0.6 -p tcp -j ACCEPT //開放來自10.1.0.0/16網絡中的主機訪問10.1.0.6網卡的tcp協議報文
(4)[!] -i, --in-interface name:檢查報文進入本機時的接口是否符合本處指定的接口;INPUT, FORWARD and PREROUTING ;
(5)[!] -o, --out-interface name:檢查報文即將離開本機時經由的接口是否符合本處指定的接口;FORWARD, OUTPUT and POSTROUTING;
-m, --match match:顯式指明要使用的擴展模塊;
-j, --jump target:跳轉目標;
擴展匹配條件:
(1)隱式擴展:不用-m選項明確給出要使用的擴展機制的擴展;此處主要指使用-p {tcp|udp|icmp}給定協議後可直接對給定的協議所進行的擴展;
也能夠在給定協議以後使用 -m tcp , -m udp ...顯式擴展必須給定-m指定
-p tcp:可直接使用tcp協議對應的擴展選項;
(1)[!] --source-port,--sport port[:port]:匹配報文中的傳輸層的源端口;可給出多個鏈接的端口;
iptables -A INPUT -s 10.1.0.0/16 -d 10.1.0.67 -p tcp --dport 22 -j ACCEPT //進站
iptables -A OUTPUT -d 10.1.0.0/16 -s 10.1.0.67 -p tcp --sport 22 -j ACCEPT
//開放本網段的進入本機22端口的請求報文
(2)[!] --destination-port,--dport port[:port]:匹配報文中的傳輸層的目標端口;可給出多個鏈接的端口;
(3)[!] --tcp-flags mask comp
SYN,ACK,FIN,RST,URG,PSH;
mask:要檢查的標誌位列表,以逗號分隔,例如SYN,ACK,FIN,RST
comp:mask給定的衆標誌位中,其值必須爲1的標誌位列表,餘下的必須爲0;
--tcp-flags SYN,ACK,FIN,RST SYN
(4)[!] --syn:至關於--tcp-flags SYN,ACK,FIN,RST SYN
-p udp:可直接使用udp協議對應的擴展選項;
(1)[!] --source-port,--sport port[:port]:匹配報文中的傳輸層的源端口;可給出多個鏈接的端口;
(2)[!] --destination-port,--dport port[:port]:匹配報文中的傳輸層的目標端口;可給出多個鏈接的端口;
-p icmp:可直接使用icmp協議對應的擴展選項;
[!] --icmp-type {type[/code]|typename}
--icmp-type 0/0:匹配對ping請求的響應報文
--icmp-type 8/0:匹配ping請求報文
(2)顯式擴展:必須使用-m選項給出matchname的擴展,並且有些擴展都還存在專用選項;
一、multiport
以離散或連續的方式定義的多端口匹配條件; Up to 15 ports can be specified.
[!] --source-ports,--sports port[,port|,port:port]...:指定多個源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指定多個目標端口;
[!] --ports port[,port|,port:port]...:匹配此處指定的源或目標端口;
iptables -A INPUT -d 10.1.0.6 -p tcp -m multiport --dport 22,23,80 -j ACCEPT //開放本地的22,23,80端口進站請求
iptables -A INPUT -s 10.1.0.6 -p tcp -m multiport --sport 22,23,80 -j ACCEPT //容許22,23,80端口迴應客戶請求
二、iprange
以連續的ip地址範圍指明多地址匹配條件;
[!] --src-range from[-to]
-m iprange --src-range from 10.1.68.1 to 10.1.68.10
[!] --dst-range from[-to]
三、string
對報文中的應用層數據作字符串匹配檢測;
[!] --string pattern
[!] --hex-string pattern
--algo {bm|kmp}:字符串匹配檢查算法;
--from offset
--to offset
過濾過過程當中遇到的問題:當使用httpd啓動80端口時迴應報文中的敏感詞彙能夠過濾
可是當使用nginx啓動80端口迴應報文時對字符過濾時沒有效果
四、time
根據報文到達的時間與指定的時間範圍進行匹配度檢測;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
時間沒法取反
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
iptables -I INPUT -d 10.1.68.15 -p tcp --dport 23 -m time --timestart 16:00:01 --timestop 09:59:59 --weekdays wed -j REJECT //限制telnet服務在週三的下午四點到早上九點五十九不提供訪問
使用能夠起始時間大於開始時間
-A INPUT -d 10.1.68.9/32 -p tcp -m tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays Mon,Tue,Wed,Thu,Fri --datestop 2038-01-19T11:14:07 -j ACCEPT //telnet服務只在工做時間提供服務
[!] --monthdays day[,day...]
[!] --weekdays day[,day...]
五、connlimit
根據每客戶端IP作併發鏈接數限制,即限制單IP可同時發起鏈接請求;
--connlimit-upto n:鏈接數小於等於閾值;
--connlimit-above n:鏈接數超出閾值;
--connlimit-mask 24 :prefix_length
~]# iptables -I INPUT -d 10.1.0.6 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
六、limit
基於收發報文的速率進行匹配;
--limit rate[/second|/minute|/hour|/day] 默認是每小時三個,
--limit-burst number//默認有令牌桶中有五個令牌。
若是是使用iptables -I INPUT -p icmp --icmp-type 8 -m limit -j ACCEPT
//不指定速率則會第一次由令牌桶中的五個令牌響應請求,以後每小時放行三個請求
~]# iptables -A INPUT -d 10.1.0.6 -p icmp --icmp-type 8 -m limit --limit-burst 3 --limit 20/minute -j ACCEPT
七、state
狀態檢測:鏈接追蹤機制(conntrack)
至關於有一個連接追蹤的表,有新請求過來,看錶中有沒有,沒有就加進去。若是表滿了,會使一些訪問被拒絕
NEW:表中沒不存在的條目,新鏈接
ESTABLISHED:已創建的鏈接,即表中已經存在此條目
RELATED:相關聯的鏈接
INVALID:沒法識別的鏈接 //不像新的也不是已經鏈接的表中沒條目可是又有相關信息
UNTRACKED:未被追蹤鏈接;
相關的內核模塊:
nf_conntrack
nf_conntrack_ipv4
nf_conntrack_ftp//想追蹤相關連的連接,須要開啓此模塊
追蹤到的鏈接:/proc/net/nf_conntrack文件中;
能追蹤的最大鏈接數量定義在:/proc/sys/net/nf_conntrack_max
建議調整至足夠大;若是鏈接請求超過此值,訪問會被拒絕。若是服務器是調度器負載均衡器 ,最好不要開啓此功能
不一樣的協議的鏈接追蹤時長:
/proc/sys/net/netfilter/
如:咱們的服務器由80端口鏈接別人,正常狀況下這種狀態是不存在的,若是服務器中***,控制咱們的80端口發出鏈接出去;咱們設置80端口只容許進來爲new的請求,出去ESTABLISEHD。;若是OUTPUT規則設置爲DROP,咱們可讓出去的是ESTABLISEHD狀態的放行,能夠安全的放行全部鏈接進入的服務。若是設置ftp能出去,設置RELATED狀態的服務准許出去。就能基於狀態放行ftp服務
INPUT鏈默認規則爲爲DROP
iptables -A INPUT -d 10.1.68.15 -p tcp -m multiport --dports 22,80,23 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -d 10.1.68.15 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
OUTPUT鏈默認規則爲DROP
iptables -A OUTPUT -s 10.1.68.15 -m state --state ESTABLISHED -j ACCEPT
[!] --state state
如何開放被動模式的ftp服務:
(1) 裝載追蹤ftp協議的模塊;
# modprobe nf_conntrack_ftp
(2) 放行入站命令鏈接
# iptables -A INPUT -d SERVER_IP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
(3) 放行入站數據鏈接
# iptables -A INPUT -d SERVER_IP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
(4) 放行出站的ESTABLISHED鏈接
# iptabls -A OUTPUT -s SERVER_IP -m state --state ESTABLISHED -j ACCEPT
處理動做(跳轉目標):
-j tagetname [per-target-options]
簡單target:
ACCEPT,DROP
擴展target:
REJECT:
--reject-with type
icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreach‐able, icmp-net-prohibited, icmp-host-prohibited, or icmp-admin-prohibited,默認爲icmp-port-unreachable;
LOG:
Turn on kernel logging of matching packets.
--log-level level
--log-prefix prefix:日誌信息的前導信息;即給定日誌記錄的描述字符串。
保存和載入規則:
保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重載:iptables-restore < /PATH/FROM/SOME_RULE_FILE
-n, --noflush:不清除原有規則
-t, --test:僅分析生成規則集,但不予提交;
注意:重載文件中的規則,會清除已有規則;
CentOS 6:
保存規則:service iptables save
保存規則於/etc/sysconfig/iptables,保存操做會清除文件中原有的內容;
重載規則:server iptables restart
默認重載/etc/sysconfig/iptables文件中的規則
腳本配置文件:/etc/sysconfig/iptables-config
用於指明要裝載的模塊;
CentOS 7開機自動生效規則:
(1) firewalld服務;
(2) shell腳本,直接記錄iptables命令;
(3) 自定義unit file或init script;
規則優化的思路:
(1) 優先放行雙方向狀態爲ESTABLISHED的報文;
(2) 服務於不一樣類別的功能的規則,匹配到報文可能性更大的放前面;//相對服務來講就是服務被訪問的比較多的放前面
(3) 服務於同一類別的功能的規則,匹配條件較爲嚴格的放前面;
(4) 設置默認策略:白名單機制
(a) 可以使用iptables -P設定默認策略;
(b) 建議在規則鏈的最後定義規則作爲默認策略;//使用這種方式相對於a方案的好處是不須要針對本機訪問再作額外定義
練習:基於狀態放行telnet, ftp, ssh, http, samba, icmp等服務;
(1) 對本機的ping請求每分鐘不得超出20個;
(2) 每客戶端對本機的ssh的併發鏈接數不得超過3個;
(3) 本機的telnet服務僅容許工做時間內訪問;
# Generated by iptables-save v1.4.7 on Thu Oct 20 09:32:28 2016 *filter :INPUT ACCEPT [28:2389] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -d 10.1.68.9/32 -p tcp -m tcp --dport 22 -m connlimit --connlimit-above 3 --connlimit-mask 32 -m limit --limit 3/hour --limit-burst 1 -j DROP -A INPUT -d 10.1.68.9/32 -p tcp -m tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays Mon,Tue,Wed,Thu,Fri --datestop 2038-01-19T11:14:07 -j ACCEPT -A INPUT -d 10.1.68.9/32 -p tcp -m state --state NEW,ESTABLISHED -m multiport --dports 22,80,21,3306,139,445 -j ACCEPT -A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 3 -j ACCEPT -A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 0 -j ACCEPT -A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 3 -j ACCEPT -A INPUT -d 10.1.68.9/32 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT //這一條能夠放到最前面,能夠去掉上邊規則中的ESTABLISEHD狀態,加快匹配規則 -A INPUT -d 10.1.68.9/32 -j DROP -A OUTPUT -s 10.1.68.9/32 -p tcp -m tcp --dport 80 -j ACCEPT -A OUTPUT -s 10.1.68.9/32 -p tcp -m tcp --dport 2049 -j ACCEPT -A OUTPUT -s 10.1.68.9/32 -p tcp -m tcp --dport 22 -j ACCEPT -A OUTPUT -s 10.1.68.9/32 -p icmp -j ACCEPT -A OUTPUT -s 10.1.68.9/32 -m state --state ESTABLISHED -j ACCEPT -A OUTPUT -s 10.1.68.9/32 -j DROP COMMIT # Completed on Thu Oct 20 09:32:28 2016
對OUTPUT作必定調整後:
*filter :INPUT ACCEPT [87:7149] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -d 10.1.68.9/32 -p tcp -m tcp --dport 22 -m connlimit --connlimit-above 3 --connlimit-mask 32 -m limit --limit 3/hour --limit-burst 1 -j DROP -A INPUT -d 10.1.68.9/32 -p tcp -m tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays Mon,Tue,Wed,Thu,Fri --datestop 2038-01-19T11:14:07 -j ACCEPT -A INPUT -d 10.1.68.9/32 -p tcp -m state --state NEW,ESTABLISHED -m multiport --dports 22,80,21,3306,139,445 -j ACCEPT -A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 3 -j ACCEPT -A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 0 -j ACCEPT -A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 3 -j ACCEPT -A INPUT -d 10.1.68.9/32 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -d 10.1.68.9/32 -j DROP -A OUTPUT -s 10.1.68.9/32 -m state --state NEW,ESTABLISHED -j ACCEPT -A OUTPUT -s 10.1.68.9/32 -j DROP COMMIT # Completed on Thu Oct 20 22:44:31 2016