Centos7 ipset命令介绍及使用
ipset介紹
iptables是在linux內(nèi)核里配置防火墻規(guī)則的用戶空間工具,它實(shí)際上是netfilter框架的一部分。可能因?yàn)閕ptables是netfilter框架里最常見的部分,所以這個(gè)框架通常被稱為iptables,iptables是linux從2.4版本引入的防火墻解決方案。ipset是iptables的擴(kuò)展,它允許你創(chuàng)建匹配整個(gè)地址sets(地址集合) 的規(guī)則。而不像普通的iptables鏈?zhǔn)蔷€性的存儲(chǔ)和過濾,ip集合存儲(chǔ)在帶索引的數(shù)據(jù)結(jié)構(gòu)中,這種結(jié)構(gòu)即使集合比較大也可以進(jìn)行高效的查找。除了一些常用的情況,比如阻止一些危險(xiǎn)主機(jī)訪問本機(jī),從而減少系統(tǒng)資源占用或網(wǎng)絡(luò)擁塞,ipset也具備一些新防火墻設(shè)計(jì)方法,并簡化了配置。官網(wǎng):http://ipset.netfilter.org/
1.ipset安裝(centos7.x默認(rèn)已經(jīng)安裝ipset,無需再進(jìn)行安裝)
yum install ipset
2.創(chuàng)建一個(gè)ipset
ipset create xxx hash:ip (hash:ip指的是單個(gè)ip,xxx是ipset名稱)
ipset默認(rèn)可以存儲(chǔ)65536個(gè)元素,使用maxelem指定數(shù)量
ipset create blacklist hash:ip maxelem 1000000 #黑名單
ipset create whitelist hash:ip maxelem 1000000 #白名單
查看當(dāng)前服務(wù)器已創(chuàng)建的ipset
ipset list
3.加入一個(gè)名單ip
ipset add blacklist 10.20.30.12
4.去除名單ip
ipset del blacklist 10.20.30.12
5.創(chuàng)建防火墻規(guī)則
iptables -I INPUT -m set --match-set blacklist src -p tcp -j DROP
iptables -I INPUT -m set --match-set whitelist src -p tcp -j DROP
service iptables save
6.將ipset規(guī)則保存到文件
ipset save blacklist -f blacklist.txt
ipset save whitelist -f whitelist.txt
7.刪除ipset
ipset destroy blacklist ipset destroy whitelist
8.導(dǎo)入ipset規(guī)則
ipset restore -f blacklist.txt ipset restore -f whitelist.txt
ipset的一個(gè)優(yōu)勢是集合可以動(dòng)態(tài)的修改,即使ipset的iptables規(guī)則目前已經(jīng)啟動(dòng),新加的入ipset的ip也生效。
ipset使用:使用 ipset 封大量ip
Linux使用iptables封IP,是常用的應(yīng)對網(wǎng)絡(luò)攻擊的方法,但要封禁成千上萬個(gè)IP,如果添加成千上萬條規(guī)則,對機(jī)器性能影響較大,使用ipset能解決這個(gè)問題。iptables 包含幾個(gè)表,每個(gè)表由鏈組成。默認(rèn)的是 filter 表,最常用的也是 filter 表,另一個(gè)比較常用的是nat表,封IP就是在 filter 表的 INPUT 鏈添加規(guī)則。在進(jìn)行規(guī)則匹配時(shí),是從規(guī)則列表中從頭到尾一條一條進(jìn)行匹配。這像是在鏈表中搜索指定節(jié)點(diǎn)費(fèi)力。ipset 提供了把這個(gè) O(n) 的操作變成 O(1) 的方法:就是把要處理的 IP 放進(jìn)一個(gè)集合,對這個(gè)集合設(shè)置一條 iptables 規(guī)則。像 iptable 一樣,IP sets 是 Linux 內(nèi)核中的東西,ipset 這個(gè)命令是對它進(jìn)行操作的一個(gè)工具。
簡單的流程
可以用這幾條命令概括使用 ipset 和 iptables 進(jìn)行 IP 封禁的流程
ipset create vader hash:ip iptables -I INPUT -m set --match-set vader src -j DROP ipset add vader 4.5.6.7 ipset add vader 1.2.3.4 ipset add vader ... ipset list vader # 查看 vader 集合的內(nèi)容
下面分別對各條命令進(jìn)行描述。
1、創(chuàng)建一個(gè)集合
ipset create vader hash:ip
這條命令創(chuàng)建了名為 vader 的集合,以 hash 方式存儲(chǔ),存儲(chǔ)內(nèi)容是 IP 地址。
2、添加 iptables 規(guī)則
iptables -I INPUT -m set --match-set vader src -j DROP
如果源地址(src)屬于 vader 這個(gè)集合,就進(jìn)行 DROP 操作。這條命令中,vader 是作為黑名單的,如果要把某個(gè)集合作為白名單,添加一個(gè) ‘!’ 符號就可以。
iptables -I INPUT -m set ! --match-set yoda src -j DROP
到現(xiàn)在雖然創(chuàng)建了集合,添加了過濾規(guī)則,但是現(xiàn)在集合還是空的,需要往集合里加內(nèi)容。
3、找出“壞” IP
找出要封禁的 IP,這是封禁過程中重要的步驟,不過不是這里的重點(diǎn)。簡要說明一下兩種方法思路。
netstat -ntu | tail -n +3 | awk '{print $5}' | sort | uniq -c | sort -nr
直接通過 netstat 的信息,把與本地相關(guān)的各種狀態(tài)的 IP 都計(jì)數(shù),排序列出來。
或者從 nginx 或者其他 web server 的日志里找請求數(shù)太多的 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
后半部分,排序,去重,再按次數(shù)進(jìn)行逆向排序的操作,跟上面命令是一樣的。
找出“壞” IP,往之前創(chuàng)建的集合里添加就可以了。
ipset add vader 4.5.6.7
有多少“壞” IP,就添加多少 IP,因?yàn)獒槍@些封禁的 IP 只需要一條 iptables 規(guī)則,而這些 IP 是以 hash 方式存儲(chǔ),所以封禁大量的 IP 也不會(huì)影響性能,這也是 ipset 存在的最大目的。
ipset 更多的用法
1、存儲(chǔ)類型
前面例子中的 vader 這個(gè)集合是以 hash 方式存儲(chǔ) IP 地址,也就是以 IP 地址為 hash 的鍵。除了 IP 地址,還可以是網(wǎng)絡(luò)段,端口號(支持指定 TCP/UDP 協(xié)議),mac 地址,網(wǎng)絡(luò)接口名稱,或者上述各種類型的組合。
比如指定 hash:ip,port就是 IP 地址和端口號共同作為 hash 的鍵。查看 ipset 的幫助文檔可以看到它支持的所有類型。
下面以兩個(gè)例子說明。
HASH:NET ipset create r2d2 hash:net ipset add r2d2 1.2.3.0/24 ipset add r2d2 1.2.3.0/30 nomatch ipset add r2d2 6.7.8.9 ipset test r2d2 1.2.3.2 hash:net 指定了可以往 r2d2 這個(gè)集合里添加 IP 段或 IP 地址。
第三條命令里的 nomatch 的作用簡單來說是把 1.2.3.0/30 從 1.2.3.0/24 這一范圍相對更大的段里“剝離”了出來,也就是說執(zhí)行完 ipset add r2d2 1.2.3.0/24 只后1.2.3.0/24 這一段 IP 是屬于 r2d2 集合的,執(zhí)行了 ipset add r2d2 1.2.3.0/30 nomatch 之后,1.2.3.0/24 里 1.2.3.0/30 這部分,就不屬于 r2d2 集合了。執(zhí)行 ipset test r2d2 1.2.3.2 就會(huì)得到結(jié)果 1.2.3.2 is NOT in set r2d2.
HASH:IP,PORT ipset create c-3po hash:ip,port ipset add c-3po 3.4.5.6,80 ipset add c-3po 5.6.7.8,udp:53 ipset add c-3po 1.2.3.4,80-86
第二條命令添加的是 IP 地址為 3.4.5.6,端口號是 80 的項(xiàng)。沒有注明協(xié)議,默認(rèn)就是 TCP,下面一條命令則是指明了是 UDP 的 53 端口。最后一條命令指明了一個(gè) IP 地址和一個(gè)端口號范圍,這也是合法的命令。
自動(dòng)過期,解封
ipset 支持 timeout 參數(shù),這就意味著,如果一個(gè)集合是作為黑名單使用,通過 timeout 參數(shù),就可以到期自動(dòng)從黑名單里刪除內(nèi)容。
ipset create obiwan hash:ip timeout 300 ipset add obiwan 1.2.3.4 ipset add obiwan 6.6.6.6 timeout 60
上面第一條命令創(chuàng)建了名為 obiwan 的集合,后面多加了 timeout 參數(shù),值為 300,往集合里添加條目的默認(rèn) timeout 時(shí)間就是 300。第三條命令在向集合添加 IP 時(shí)指定了一個(gè)不同于默認(rèn)值的 timeout 值 60,那么這一條就會(huì)在 60 秒后自動(dòng)刪除。
隔幾秒執(zhí)行一次 ipset list obiwan 可以看到這個(gè)集合里條目的 timeout 一直在隨著時(shí)間變化,標(biāo)志著它們在多少秒之后會(huì)被刪除。
如果要重新為某個(gè)條目指定 timeout 參數(shù),要使用 -exit 這一選項(xiàng)。
ipset -exist add obiwan 1.2.3.4 timeout 100
這樣 1.2.3.4 這一條數(shù)據(jù)的 timeout 值就變成了 100,如果這里設(shè)置 300,那么它的 timeout,也就是存活時(shí)間又重新變成 300。
如果在創(chuàng)建集合是沒有指定 timeout,那么之后添加條目也就不支持 timeout 參數(shù),執(zhí)行 add 會(huì)收到報(bào)錯(cuò)。想要默認(rèn)條目不會(huì)過期(自動(dòng)刪除),又需要添加某些條目時(shí)加上 timeout 參數(shù),可以在創(chuàng)建集合時(shí)指定 timeout 為 0。
ipset create luke hash:ip ipset add luke 5.5.5.5 timeout 100
得到報(bào)錯(cuò)信息 kernel error received: Unknown error -1
hashsize, maxelem 這兩個(gè)參數(shù)分別指定了創(chuàng)建集合時(shí)初始的 hash 大小,和最大存儲(chǔ)的條目數(shù)量。
ipset create yoda hash:ip,port hashsize 4096 maxelem 1000000 ipset add yoda 3.4.5.6,3306
這樣創(chuàng)建了名為 yoda 的集合,初始 hash 大小是 4096,如果滿了,這個(gè) hash 會(huì)自動(dòng)擴(kuò)容為之前的兩倍。最大能存儲(chǔ)的數(shù)量是 100000 個(gè)。
如果沒有指定,hashsize 的默認(rèn)值是 1024,maxelem 的默認(rèn)值是 65536。
2、另外幾條常用命令
ipset del yoda x.x.x.x # 從 yoda 集合中刪除內(nèi)容 ipset list yoda # 查看 yoda 集合內(nèi)容 ipset list # 查看所有集合的內(nèi)容 ipset flush yoda # 清空 yoda 集合 ipset flush # 清空所有集合 ipset destroy yoda # 銷毀 yoda 集合 ipset destroy # 銷毀所有集合 ipset save yoda # 輸出 yoda 集合內(nèi)容到標(biāo)準(zhǔn)輸出 ipset save # 輸出所有集合內(nèi)容到標(biāo)準(zhǔn)輸出 ipset restore # 根據(jù)輸入內(nèi)容恢復(fù)集合內(nèi)容 還有……
如果創(chuàng)建集合是指定的存儲(chǔ)內(nèi)容包含 ip, 例如 hash:ip 或 hash:ip,port ,在添加條目時(shí),可以填 IP 段,但是仍然是以單獨(dú)一個(gè)個(gè) IP 的方式來存。
上面所有的例子都是用 hash 的方式進(jìn)行存儲(chǔ),實(shí)際上 ipset 還可以以 bitmap 或者 link 方式存儲(chǔ),用這兩種方式創(chuàng)建的集合大小,是固定的。
參考:https://www.cnblogs.com/xiaofeng666/p/10952627.html
總結(jié)
以上是生活随笔為你收集整理的Centos7 ipset命令介绍及使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Excel打开csv格式文件并生成相应
- 下一篇: 市值蒸发3.7万亿元!腾讯控股股价跌回5