軟件防火墻
Linux提供的軟件防火墻,名為iptables,它可以理解為是一個(gè)客戶端代理,通過iptables的代理,將用戶配置的安全策略執(zhí)行到對(duì)應(yīng)的安全框架中,這個(gè)安全框架稱之為netfilter。
iptables是一個(gè)命令行的工具,位于用戶空間,我們用這個(gè)工具操作真正的框架,也就是netfilter
真正實(shí)現(xiàn)流量過濾的防火墻框架是netfilter,位于內(nèi)核空間,它倆共同組成了Linux的軟件防火墻,一般用來代替昂貴的硬件防火墻,實(shí)現(xiàn)數(shù)據(jù)包過濾,網(wǎng)絡(luò)地址轉(zhuǎn)換等。
在Centos7發(fā)行版本下,firewalld防火墻又取代了iptables防火墻
iptables是將配置好的規(guī)則交給內(nèi)核層的netfilter網(wǎng)絡(luò)過濾器來處理 filrewalld服務(wù)是將配置好的防火墻規(guī)則交給內(nèi)核層的nftables網(wǎng)絡(luò)過濾器處理 這倆工具二選一即可,都只是命令行工具,
iptables是什么
iptables是開源的基于數(shù)據(jù)包過濾的防火墻工具。
Iptables使用場(chǎng)景
1、主機(jī)防火墻(filter表的INPUT鏈)。 2、局域網(wǎng)共享上網(wǎng)(nat表的POSTROUTING鏈)。半個(gè)路由器,NAT功能。 3、端口及IP映射(nat表的PREROUTING鏈),硬防的NAT功能。 4、IP一對(duì)一映射。
netfilter 中五個(gè)勾子函數(shù)和報(bào)文流向
Netfilter在內(nèi)核中選取五個(gè)位置放了五個(gè)hook(勾子) function(INPUT、OUTPUT、FORWARD、 PREROUTING、POSTROUTING),而這五個(gè)hook function向用戶開放,用戶可以通過一個(gè)命令工具 (iptables)向其寫入規(guī)則 由信息過濾表(table)組成,包含控制IP包處理的規(guī)則集(rules),規(guī)則被分組放在鏈(chain)上
三種報(bào)文流向
1)流入本機(jī):PREROUTING--> INPUT --> 用戶空間進(jìn)程 2)流出本機(jī):用戶空間進(jìn)程--> OUTPUT --> POSTROUTING 3)轉(zhuǎn)發(fā):PREROUTING -->FORWARD -->POSTROUTING
iptables組成
五表五鏈以及一些規(guī)則組成
鏈chain: 1)內(nèi)置鏈:每個(gè)內(nèi)置鏈對(duì)應(yīng)于一個(gè)鉤子函數(shù) 2)自定義鏈:用于對(duì)內(nèi)置鏈進(jìn)行擴(kuò)展或補(bǔ)充,可實(shí)現(xiàn)更靈活的規(guī)則組織管理機(jī)制;只有HOOK鉤子調(diào)用自定義鏈時(shí),才生效 五個(gè)內(nèi)置鏈chain INPUT,OUTPUT,F(xiàn)ORWARD,PREROUTING,POSTROUTING 五個(gè)表 table:filter,nat,mangle,raw,security 1)filter:過濾規(guī)則表,根據(jù)預(yù)定義的規(guī)則過濾符號(hào)條件的數(shù)據(jù)包,默認(rèn)表 2)nat:network address translation地址轉(zhuǎn)換規(guī)則表 3)mangle:修改數(shù)據(jù)標(biāo)記位規(guī)則表 4)raw:關(guān)閉啟用的連接跟蹤機(jī)制,加快封包穿越防火墻速度 5)security:用于強(qiáng)制訪問控制(MAC)網(wǎng)絡(luò)規(guī)則,由Linux安全模塊(如SELINUX)實(shí)現(xiàn)
它們的優(yōu)先級(jí)由高到低的順序?yàn)椋?/p>
security---> raw---> mangle---> nat---> filter
內(nèi)核中數(shù)據(jù)包的傳輸過程
1)當(dāng)一個(gè)數(shù)據(jù)包進(jìn)入網(wǎng)卡時(shí),數(shù)據(jù)包首先進(jìn)入PREROUTING鏈,內(nèi)核根據(jù)數(shù)據(jù)包目的IP判斷是否需要轉(zhuǎn)送出去 2)如果數(shù)據(jù)包是進(jìn)入本機(jī)的,數(shù)據(jù)包就會(huì)沿著圖向下移動(dòng),到達(dá)INPUT鏈。數(shù)據(jù)包到達(dá)INPUT鏈后,任何進(jìn)程都會(huì)收到它。本機(jī)上運(yùn)行的程序可以發(fā)送數(shù)據(jù)包,這些數(shù)據(jù)包經(jīng)過OUTPUT鏈,然后到達(dá)POSTROUTING鏈輸出 3)如果數(shù)據(jù)包是要轉(zhuǎn)發(fā)出去的,且內(nèi)核允許轉(zhuǎn)發(fā),數(shù)據(jù)包就會(huì)向右移動(dòng),經(jīng)過FORWARD鏈,然后到達(dá)POSTROUTING鏈輸出
范例,查看默認(rèn)的表
[root@localhost ~]# iptables -vnL Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination [root@localhost ~]# iptables -vnL -t filter Chain INPUT (policy ACCEPT 24 packets, 1600 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 14 packets, 1784 bytes) pkts bytes target prot opt in out source destination
iptables規(guī)則添加時(shí)考量點(diǎn)
1)要實(shí)現(xiàn)哪種功能:判斷添加在哪張表上 2)報(bào)文流經(jīng)的路徑:判斷添加在哪個(gè)鏈上 3)報(bào)文的流向:判斷源和目的 4)匹配規(guī)則:業(yè)務(wù)需要
iptables常見的處理動(dòng)作:
1)內(nèi)建處理動(dòng)作:ACCEPT,DROP,REJECT,SNAT,DNAT,MASQUERADE,MARK,LOG...;其中最常用的只有,允許:ACCEPT,拋棄:DROP,拒絕:REJECT 2)自定義處理動(dòng)作:自定義chain,利用分類管理復(fù)雜情形;規(guī)則要添加在鏈上,才生效;添加在自定義鏈上不會(huì)自動(dòng)生效。 3)白名單:只有指定的特定主機(jī)可以訪問,其它全拒絕 4)黑名單:只有指定的特定主機(jī)拒絕訪問,其它全允許,默認(rèn)方式
因?yàn)镃entOS7,8都是Firewalls防火墻,所以需要關(guān)閉才能更好的使用iptables我們定義的防火墻規(guī)則
[root@localhost ~]# systemctl disable --now firewalld
iptables 用法說明
幫助:man 8 iptables
格式:
iptables [-t table] {-A|-C|-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 rule-specification = [matches...] [target] match = -m matchname [per-match-options] target = -j targetname [per-target-options]
iptables命令格式詳解:
iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
1、-t table:指定表
raw, mangle, nat, [filter]默認(rèn)
2、SUBCOMMAND:子命令
鏈管理類:
-N:new, 自定義一條新的規(guī)則鏈 -E:重命名自定義鏈;引用計(jì)數(shù)不為0的自定義鏈不能夠被重命名,也不能被刪除 -X:delete,刪除自定義的空的規(guī)則鏈 -P:Policy,設(shè)置默認(rèn)策略;對(duì)filter表中的鏈而言,其默認(rèn)策略有:ACCEPT:接受, DROP:丟棄
查看類:
-L:list,列出指定鏈上的所有規(guī)則,本選項(xiàng)需置后 -n:numberic,以數(shù)字格式顯示地址和端口號(hào) -v:verbose,詳細(xì)信息 -vv:更詳細(xì) -x:exactly,顯示計(jì)數(shù)器結(jié)果的精確值,而非單位轉(zhuǎn)換后的易讀值 --line-numbers:顯示規(guī)則的序號(hào) -S selected,以iptables-save命令格式顯示鏈上規(guī)則
規(guī)則管理類:
-A:append,追加 -I:insert,插入,要指明插入至的規(guī)則編號(hào),默認(rèn)為第一條 -D:delete,刪除 1)指明規(guī)則序號(hào) 2)指明規(guī)則本身 -R:replace,替換指定鏈上的指定規(guī)則編號(hào) -F:flush,清空指定的規(guī)則鏈 -Z:zero,置零 iptables的每條規(guī)則都有兩個(gè)計(jì)數(shù)器 1)匹配到的報(bào)文的個(gè)數(shù) 2)匹配到的所有報(bào)文的大小之和
范例:
[root@localhost ~]# iptables -F OUTPUT
常用組合
-vnL -vvnxL --line-numbers
范例
[root@localhost ~]# iptables -vnL Chain INPUT (policy ACCEPT 177 packets, 12622 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 106 packets, 9596 bytes) pkts bytes target prot opt in out source destination [root@localhost ~]# iptables -vnL --line-numbers Chain INPUT (policy ACCEPT 1606 packets, 3268K bytes) num pkts bytes target prot opt in out source destination 1 22 1824 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 2 2 120 REJECT all -- * * 172.31.0.18 0.0.0.0/0 reject-with icmp-port-unreachable 3 1 60 REJECT all -- * * 172.31.0.7 0.0.0.0/0 reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 1338 packets, 98490 bytes) num pkts bytes target prot opt in out source destination
匹配條件
1)基本:通用的,PARAMETERS 2)擴(kuò)展:需加載模塊,MATCH EXTENTIONS
擴(kuò)展動(dòng)作:
REJECT:--reject-with:icmp-port-unreachable默認(rèn) RETURN:返回調(diào)用鏈 REDIRECT:端口重定向 LOG:記錄日志,dmesg MARK:做防火墻標(biāo)記 DNAT:目標(biāo)地址轉(zhuǎn)換 SNAT:源地址轉(zhuǎn)換 MASQUERADE:地址偽裝 自定義鏈
iptables基本匹配條件
基本匹配條件:無需加載模塊,由iptables/netfilter自行提供
[!] -s, --source address[/mask][,...]:源IP地址或者不連續(xù)的IP地址 [!] -d, --destination address[/mask][,...]:目標(biāo)IP地址或者不連續(xù)的IP地址 [!] -p, --protocol protocol:指定協(xié)議,可使用數(shù)字如0(all) protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh or“all“ 參看:/etc/protocols [!] -i, --in-interface name:報(bào)文流入的接口;只能應(yīng)用于數(shù)據(jù)報(bào)文流入環(huán)節(jié),只應(yīng)用于INPUT、 FORWARD、PREROUTING鏈 [!] -o, --out-interface name:報(bào)文流出的接口;只能應(yīng)用于數(shù)據(jù)報(bào)文流出的環(huán)節(jié),只應(yīng)用于 FORWARD、OUTPUT、POSTROUTING鏈
范例:
準(zhǔn)備好一個(gè)可以訪問的網(wǎng)站頁(yè)面 [root@localhost ~]# yum install -y httpd;echo 172.31.0.17 > /var/www/html/index.html;systemctl start httpd 沒有添加iptables規(guī)則時(shí)其他機(jī)器可以訪問 [root@localhost ~]# curl 172.31.0.17 172.31.0.17 iptables設(shè)置 [root@localhost ~]# iptables -vnL Chain INPUT (policy ACCEPT 365 packets, 25579 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 215 packets, 23508 bytes) pkts bytes target prot opt in out source destination [root@localhost ~]# iptables -A INPUT -s 172.31.0.18,172.31.0.7 -j REJECT [root@localhost ~]# iptables -I INPUT -i lo -j ACCEPT 添加完iptables規(guī)則后,只有本機(jī)可以訪問,被規(guī)則限制的ip不能訪問 [root@localhost ~]# curl 127.0.0.1 172.31.0.17 [root@localhost ~]# curl 172.31.0.17 curl: (7) Failed connect to 172.31.0.17:80; Connection refused [root@sz-kx-centos8 ~]# curl 172.31.0.17 curl: (7) Failed to connect to 172.31.0.17 port 80: Connection refused
范例:添加某個(gè)固定ip并允許
[root@localhost ~]# iptables -A INPUT -s 172.31.0.1 -j ACCEPT
范例:添加某個(gè)固定ip并丟棄
[root@localhost ~]# iptables -A INPUT 1 -s 172.31.0.18 -j DROP
范例:添加整個(gè)網(wǎng)段并拒絕連接(謹(jǐn)慎使用)
[root@localhost ~]# iptables -A INPUT -s 172.31.0.0/16 -j REJECT
范例:在序號(hào)3插入
[root@localhost ~]# iptables -I INPUT 3 -s 172.31.0.100 -j ACCEPT [root@localhost ~]# iptables -vnL --line-numbers Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 22 1824 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 2 405 32145 ACCEPT all -- * * 172.31.0.1 0.0.0.0/0 3 0 0 ACCEPT all -- * * 172.31.0.100 0.0.0.0/0 4 2 120 REJECT all -- * * 172.31.0.18 0.0.0.0/0 reject-with icmp-port-unreachable 5 1 60 REJECT all -- * * 172.31.0.7 0.0.0.0/0 reject-with icmp-port-unreachable 6 40 2473 REJECT all -- * * 172.31.0.0/16 0.0.0.0/0 reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 51 packets, 5936 bytes) num pkts bytes target prot opt in out source destination
范例:刪除序號(hào)3這條規(guī)則
[root@localhost ~]# iptables -D INPUT 3
范例:替換序號(hào)4的規(guī)則把拒絕替換成允許
[root@localhost ~]# iptables -R INPUT 4 -s 172.31.0.7 -j ACCEPT
范例:清空所有規(guī)則
[root@localhost ~]# iptables -F
范例:iptables默認(rèn)是黑名單,改成白名單
[root@localhost ~]# iptables -P INPUT DROP # 實(shí)現(xiàn)效果如下: [root@localhost ~]# iptables -vnL Chain INPUT (policy ACCEPT 48 packets, 4965 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 40 packets, 5824 bytes) pkts bytes target prot opt in out source destination [root@localhost ~]# iptables -A INPUT -i lo -j ACCEPT [root@localhost ~]# iptables -A INPUT -s 172.31.0.17 -j ACCEPT [root@localhost ~]# iptables -A INPUT -s 172.31.0.1 -j ACCEPT [root@localhost ~]# iptables -A INPUT -s 172.31.0.1 -j REJECT [root@localhost ~]# iptables -P INPUT DROP [root@localhost ~]# iptables -vnL Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- * * 172.31.0.17 0.0.0.0/0 103 6840 ACCEPT all -- * * 172.31.0.1 0.0.0.0/0 0 0 REJECT all -- * * 172.31.0.1 0.0.0.0/0 reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 21 packets, 2152 bytes) pkts bytes target prot opt in out source destination
規(guī)則優(yōu)化最佳實(shí)踐
1. 安全放行所有入站和出站的狀態(tài)為ESTABLISHED狀態(tài)連接,建議放在第一條,效率更高 2. 謹(jǐn)慎放行入站的新請(qǐng)求 3. 有特殊目的限制訪問功能,要在放行規(guī)則之前加以拒絕 4. 同類規(guī)則(訪問同一應(yīng)用,比如:http ),匹配范圍小的放在前面,用于特殊處理 5. 不同類的規(guī)則(訪問不同應(yīng)用,一個(gè)是http,另一個(gè)是mysql ),匹配范圍大的放在前面,效率更 高 6. 應(yīng)該將那些可由一條規(guī)則能夠描述的多個(gè)規(guī)則合并為一條,減少規(guī)則數(shù)量,提高檢查效率 7. 設(shè)置默認(rèn)策略,建議白名單(只放行特定連接) iptables -P,不建議,容易出現(xiàn)“自殺現(xiàn)象” 規(guī)則的最后定義規(guī)則做為默認(rèn)策略,推薦使用,放在最后一條
iptables保存規(guī)則
以上命令都是臨時(shí)生效,持久保存規(guī)則需要如下操作:
方法一:
# 保存規(guī)則 [root@localhost ~]# iptables-save > /home/iptables.ruls # 執(zhí)行導(dǎo)入保存的規(guī)則 [root@localhost ~]# iptables-restore < /home/iptables.ruls 寫入開機(jī)啟動(dòng)配置 [root@localhost ~]# vim /etc/rc.d/rc.local iptables-restore < /home/iptables.ruls # 加執(zhí)行權(quán)限 [root@localhost ~]# chmod +x /etc/rc.d/rc.local
方法二:(CentOS7,8)
# 安裝 [root@localhost ~]# yum install iptables-services 添加到配置文件里面 [root@localhost ~]# iptables-save > /etc/sysconfig/iptables 啟動(dòng) [root@localhost ~]# systemctl start iptables 設(shè)置開機(jī)啟動(dòng) [root@localhost ~]# systemctl enable --now iptables
擴(kuò)展模塊的使用幫助:
CentOS 7,8: man iptables-extensions CentOS 6: man iptables
iptables 在使用-p選項(xiàng)指明了特定的協(xié)議時(shí),無需再用-m選項(xiàng)指明擴(kuò)展模塊的擴(kuò)展機(jī)制,不需要手動(dòng)加
載擴(kuò)展模塊
tcp 協(xié)議的擴(kuò)展選項(xiàng)
[!] --source-port, --sport port[:port]:匹配報(bào)文源端口,可為端口連續(xù)范圍 [!] --destination-port,--dport port[:port]:匹配報(bào)文目標(biāo)端口,可為連續(xù)范圍 [!] --tcp-flags mask comp mask 需檢查的標(biāo)志位列表,用,分隔 , 例如 SYN,ACK,FIN,RST comp 在mask列表中必須為1的標(biāo)志位列表,無指定則必須為0,用,分隔tcp協(xié)議的擴(kuò)展選項(xiàng)
范例:
--tcp-flags SYN,ACK,FIN,RST SYN 表示要檢查的標(biāo)志位為SYN,ACK,FIN,RST四個(gè),其中SYN必 須為1,余下的必須為0,第一次握手 --tcp-flags SYN,ACK,FIN,RST SYN,ACK 第二次握手 #錯(cuò)誤包 --tcp-flags ALL ALL --tcp_flags ALL NONE
[!] --syn:用于匹配第一次握手, 相當(dāng)于:--tcp-flags SYN,ACK,FIN,RST SYN
udp 協(xié)議的擴(kuò)展選項(xiàng)
[!] --source-port, --sport port[:port]:匹配報(bào)文的源端口或端口范圍 [!] --destination-port,--dport port[:port]:匹配報(bào)文的目標(biāo)端口或端口范圍
icmp 協(xié)議的擴(kuò)展選項(xiàng)
[!] --icmp-type {type[/code]|typename} type/code 0/0 echo-reply icmp應(yīng)答 8/0 echo-request icmp請(qǐng)求
范例:限制某個(gè)固定IP不能ssh端口遠(yuǎn)程連接,21:23是區(qū)間
[root@localhost ~]# iptables -A INPUT -s 172.31.0.7 -p tcp --dport 21:23 -j REJECT
范例:限制某個(gè)固定IP,icmp請(qǐng)求就拒絕
[root@localhost ~]# iptables -A INPUT -s 172.31.0.7 -p icmp --icmp-type 8 -j REJECT
隱式擴(kuò)展
# 在序號(hào)3插入一條允許固定ip訪問80端口 [root@localhost ~]# iptables -I INPUT 3 -s 172.31.0.7 -p tcp --dport 80 -j ACCEPT
范例:實(shí)現(xiàn)了本機(jī)能ping通某個(gè)ip,但是對(duì)方不能ping通本機(jī)
[root@localhost ~]# iptables -A INPUT -s 172.31.0.18 -p icmp --icmp-type 8 -j REJECT
multiport擴(kuò)展
以離散方式定義多端口匹配,最多指定15個(gè)端口
#指定多個(gè)源端口 [!] --source-ports,--sports port[,port|,port:port]... # 指定多個(gè)目標(biāo)端口 [!] --destination-ports,--dports port[,port|,port:port]... #多個(gè)源或目標(biāo)端 [!] --ports port[,port|,port:port]...
范例:使用multiport模塊拒絕訪問多個(gè)不連續(xù)的端口號(hào)
[root@localhost ~]# iptables -A INPUT -s 172.31.0.18 -p tcp -m multiport --dports 80,22,21 -j REJECT
iprange擴(kuò)展
指明連續(xù)的(但一般不是整個(gè)網(wǎng)絡(luò))ip地址范圍
[!] --src-range from[-to] 源IP地址范圍 [!] --dst-range from[-to] 目標(biāo)IP地址范圍
范例:拒絕某個(gè)網(wǎng)段的IP地址范圍
[root@localhost ~]# iptables -A INPUT -m iprange --src-range 172.31.0.1-172.31.0.7 -j REJECT
mac擴(kuò)展
mac 模塊可以指明源MAC地址,,適用于:PREROUTING, FORWARD,INPUT chains
[!] --mac-source XXXXXX:XX
范例:通過某臺(tái)機(jī)器的mac拒絕
[root@localhost ~]# iptables -A INPUT -m mac --mac-source 00:0c:29:43:04:9b -j REJECT
string擴(kuò)展
對(duì)報(bào)文中的應(yīng)用層數(shù)據(jù)做字符串模式匹配檢測(cè)
--algo {bm|kmp} 字符串匹配檢測(cè)算法 bm:Boyer-Moore kmp:Knuth-Pratt-Morris --from offset 開始偏移 --to offset 結(jié)束偏移 [!] --string pattern 要檢測(cè)的字符串模式 [!] --hex-string pattern要檢測(cè)字符串模式,16進(jìn)制格式
范例:規(guī)則遇到相對(duì)應(yīng)的字符串就拒絕
[root@localhost ~]# iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62 --string "google" -j REJECT
time擴(kuò)展
注意:CentOS 8 此模塊有問題
根據(jù)將報(bào)文到達(dá)的時(shí)間與指定的時(shí)間范圍進(jìn)行匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期 --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] --timestart hh:mm[:ss] 時(shí)間 --timestop hh:mm[:ss] [!] --monthdays day[,day...] 每個(gè)月的幾號(hào) [!] --weekdays day[,day...] 星期幾,1 – 7 分別表示星期一到星期日 --kerneltz:內(nèi)核時(shí)區(qū)(當(dāng)?shù)貢r(shí)間),不建議使用,CentOS 7版本以上系統(tǒng)默認(rèn)為 UTC 注意: centos6 不支持kerneltz ,--localtz指定本地時(shí)區(qū)(默認(rèn))
范例:某個(gè)網(wǎng)段IP不能在某個(gè)時(shí)間拒絕訪問主機(jī)80端口
[root@localhost ~]# iptables -A INPUT -s 172.31.0.0/16 -d 172.31.0.17 -p tcp --dport 80 -m time --timestart 16:00 --timestop 16:10 -j REJECT
connlimit擴(kuò)展
根據(jù)每客戶端IP做并發(fā)連接數(shù)數(shù)量匹配
可防止Dos(Denial of Service,拒絕服務(wù))攻擊
--connlimit-upto N #連接的數(shù)量小于等于N時(shí)匹配 --connlimit-above N #連接的數(shù)量大于N時(shí)匹配
范例:連接數(shù)超過2個(gè)就拒絕
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 2 -j REJECT
limit擴(kuò)展
基于收發(fā)報(bào)文的速率做匹配 , 令牌桶過濾器
--limit-burst number #前多少個(gè)包不限制 --limit #[/second|/minute|/hour|/day]
范例:前5個(gè)請(qǐng)求包不限制,后續(xù)每1分鐘10個(gè),其他不符合規(guī)則執(zhí)行下面的
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT [root@localhost ~]# iptables -A INPUT -p icmp -j REJECT
state擴(kuò)展
state 擴(kuò)展模塊,可以根據(jù)”連接追蹤機(jī)制“去檢查連接的狀態(tài),較耗資源
conntrack機(jī)制:追蹤本機(jī)上的請(qǐng)求和響應(yīng)之間的關(guān)系
狀態(tài)類型:
NEW:新發(fā)出請(qǐng)求;連接追蹤信息庫(kù)中不存在此連接的相關(guān)信息條目,因此,將其識(shí)別為第一次發(fā) 出的請(qǐng)求 ESTABLISHED:NEW狀態(tài)之后,連接追蹤信息庫(kù)中為其建立的條目失效之前期間內(nèi)所進(jìn)行的通信 狀態(tài) RELATED:新發(fā)起的但與已有連接相關(guān)聯(lián)的連接,如:ftp協(xié)議中的數(shù)據(jù)連接與命令連接之間的關(guān) 系 INVALID:無效的連接,如flag標(biāo)記不正確 UNTRACKED:未進(jìn)行追蹤的連接,如:raw表中關(guān)閉追蹤
記錄舊信息路徑
[root@localhost ~]# cat /proc/net/nf_conntrack
范例:老用戶允許連接,新用戶拒絕連接
[root@localhost ~]# iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT [root@localhost ~]# iptables -A INPUT -m state --state NEW -j REJECT
范例:本機(jī)可以訪問172.31.0.18,但是172.31.0.18不能訪問本機(jī)
[root@localhost ~]# iptables -A INPUT -s 172.31.0.18 -m state --state NEW -j REJECT
連接數(shù)測(cè)試案例:
# 連接數(shù)給一個(gè)最少的數(shù)值 [root@localhost ~]# echo 1 > /proc/sys/net/netfilter/nf_conntrack_max # 查看日志 [root@localhost ~]# tail -f /var/log/messages May 8 16:34:27 localhost kernel: nf_conntrack: table full, dropping packet May 8 16:34:28 localhost kernel: nf_conntrack: table full, dropping packet ... # 建議修改適當(dāng)加大連接數(shù) [root@localhost ~]# echo 655350 > /proc/sys/net/netfilter/nf_conntrack_max
Target
target 包括以下類型
自定義鏈, ACCEPT, DROP, REJECT,RETURN,LOG,SNAT,DNAT,REDIRECT,MASQUERADE LOG:非中斷target,本身不拒絕和允許,放在拒絕和允許規(guī)則前,并將日志記錄在/var/log/messages系 統(tǒng)日志中 --log-level level 級(jí)別: debug,info,notice, warning, error, crit, alert,emerg --log-prefix prefix 日志前綴,用于區(qū)別不同的日志,最多29個(gè)字符
范例:某個(gè)網(wǎng)段訪問80,21:23端口的在日志重新生成日志并打印出來到系統(tǒng)日志,提示語句開頭new connections:
[root@localhost ~]# iptables -A INPUT -s 172.31.0.0/16 -p tcp -m multiport --dports 80,21:23 -m state --state NEW -j LOG --log-prefix "new connections: " 查看日志 [root@localhost ~]# tail -f /var/log/messages May 8 15:34:30 localhost systemd: Started Vsftpd ftp daemon. May 8 16:01:01 localhost systemd: Started Session 470 of user root. full, dropping packet May 8 16:55:20 localhost kernel: new connections: IN=eth0 OUT= MAC=00:0c:29:51:7200:0c:29:43:04:9b:08:00 SRC=172.31.0.18 DST=172.31.0.17 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=60599 DF PROTO=TCP SPT=35722 DPT=80 WINDOW=29200 RES=0x00 SYN URGP=0
規(guī)則優(yōu)化最佳實(shí)踐
1. 安全放行所有入站和出站的狀態(tài)為ESTABLISHED狀態(tài)連接,建議放在第一條,效率更高 2. 謹(jǐn)慎放行入站的新請(qǐng)求 3. 有特殊目的限制訪問功能,要在放行規(guī)則之前加以拒絕 4. 同類規(guī)則(訪問同一應(yīng)用,比如:http ),匹配范圍小的放在前面,用于特殊處理 5. 不同類的規(guī)則(訪問不同應(yīng)用,一個(gè)是http,另一個(gè)是mysql ),匹配范圍大的放在前面,效率更 高 6. 應(yīng)該將那些可由一條規(guī)則能夠描述的多個(gè)規(guī)則合并為一條,減少規(guī)則數(shù)量,提高檢查效率 7. 設(shè)置默認(rèn)策略,建議白名單(只放行特定連接) iptables -P,不建議,容易出現(xiàn)“自殺現(xiàn)象” 規(guī)則的最后定義規(guī)則做為默認(rèn)策略,推薦使用,放在最后一條
iptables保存規(guī)則
以上命令都是臨時(shí)生效,持久保存規(guī)則需要如下操作:
方法一:
# 保存規(guī)則 [root@localhost ~]# iptables-save > /home/iptables.ruls # 執(zhí)行導(dǎo)入保存的規(guī)則 [root@localhost ~]# iptables-restore < /home/iptables.ruls 寫入開機(jī)啟動(dòng)配置 [root@localhost ~]# vim /etc/rc.d/rc.local iptables-restore < /home/iptables.ruls # 加執(zhí)行權(quán)限 [root@localhost ~]# chmod +x /etc/rc.d/rc.local
方法二:(CentOS7,8)
# 安裝 [root@localhost ~]# yum install iptables-services 添加到配置文件里面 [root@localhost ~]# iptables-save > /etc/sysconfig/iptables 啟動(dòng) [root@localhost ~]# systemctl start iptables 設(shè)置開機(jī)啟動(dòng) [root@localhost ~]# systemctl enable --now iptables
鏈接:https://www.cnblogs.com/xuanlv-0413/p/14748275.html
-
Linux
+關(guān)注
關(guān)注
87文章
11378瀏覽量
211339 -
軟件
+關(guān)注
關(guān)注
69文章
5065瀏覽量
88458 -
防火墻
+關(guān)注
關(guān)注
0文章
422瀏覽量
35829
原文標(biāo)題:網(wǎng)絡(luò)工程師必備:拆解iptables四表五鏈底層架構(gòu)與防御實(shí)戰(zhàn)
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Linux系統(tǒng)iptables和firewall防火墻的配置方法

Linux中使用Iptables實(shí)現(xiàn)簡(jiǎn)單的網(wǎng)站防火墻

評(píng)論