文章目錄
- 一、firewalld中ipset的用途
- 1.1 用途
- 1.2 注意與iptables所用的ipset命令的不同,
- 1.3 配置詳解
- 二、firewalld中ipset的操作例子
- 2.1 新建一個set
- 2.2 在set中添加ip
- 2.3 從set中刪除ip
- 2.4 刪除一個set
- 2.5 打印一個set的文件路徑
- 2.6 打印一個set的內容
- 2.8 判斷一個ip是否存在于set中?
- 2.9 列出所有的ipsets
- 2.10 得到所有的默認ipset類型
- 三、firewalld中使用ipset
- 3.1 把一個ipset加入到禁止的規則
- 3.2 把ip地址中ipset中刪除
- 四、添加到ipset中的ip地址數據是否會重復
- 五、使用腳本抓取有問題的ip加入到拒絕訪問的ipset
- 六、如何防止自己被誤關在防火墻外?使用ip白名單
- 七、查看firewalld的版本
- 八、查看linux的版本
一、firewalld中ipset的用途
1.1 用途
ipset是ip地址的集合,firewalld使用ipset可以在一條規則中處理多個ip地址,執行效果更高對ip地址集合的管理也更方便
1.2 注意與iptables所用的ipset命令的不同,
不要混合使用firewall-cmd的ipset參數與linux平臺上的ipset命令,避免引起沖突,firewalld的ipset會記錄到/etc/firewalld/ipsets/目錄下
1.3 配置詳解
IPSet Options--get-ipset-types 打印支持的ipset類型--new-ipset=<ipset> --類型= < ipset類型>[——選項= <關鍵>[= < >價值]]. .添加一個新的ipset--new-ipset-from-file=<filename> [--name=<ipset>] 從文件中添加一個新的ipset[可選名稱]--delete-ipset=<ipset> 刪除已存在的ipset [可選名稱]--load-ipset-defaults=<ipset> 加載ipset默認設置[可選名稱]--info-ipset=<ipset>打印關于ipset的信息[可選名稱]--path-ipset=<ipset>打印ipset的文件路徑[可選名稱]--get-ipsets 打印預定義ipsets--ipset=<ipset> --set-description=<description>設置新的描述為ipset[可選名稱]--ipset=<ipset> --get-description打印ipset的描述[可選名稱]--ipset=<ipset> --set-short=<description>設置新的短描述為ipset[可選名稱]--ipset=<ipset> --get-short打印ipset的簡短描述[可選名稱]--ipset=<ipset> --add-entry=<entry>向ipset中添加一個新條目[可選名稱]--ipset=<ipset> --remove-entry=<entry>從ipset中刪除一個條目[可選名稱]--ipset=<ipset> --query-entry=<entry>返回ipset是否有條目--ipset=<ipset> --get-entries列出ipset的表項[可選名稱]--ipset=<ipset> --add-entries-from-file=<entry>向ipset中添加新條目[可選名稱]--ipset=<ipset> --remove-entries-from-file=<entry>從ipset中刪除條目[可選名稱]
二、firewalld中ipset的操作例子
2.1 新建一個set
–new-ipset=sshblock: 指定新ipset的名字為:sshblock
–type=hash:ip 指定類型為 hash:ip,這種形式不允許重復而且只有一個ip
[root@blog ipsets]# firewall-cmd --permanent --new-ipset=sshblock --type=hash:ip
success查看ipset文件是否已生成?
說明:默認的目錄是:/etc/firewalld/ipsets
[root@blog ipsets]# more /etc/firewalld/ipsets/sshblock.xml
<?xml version="1.0" encoding="utf-8"?>
<ipset type="hash:ip">
</ipset>
2.2 在set中添加ip
[root@blog ipsets]# firewall-cmd --permanent --ipset=sshblock --add-entry=111.111.111.111
success查看添加ip的效果
[root@blog ipsets]# more /etc/firewalld/ipsets/sshblock.xml
<?xml version="1.0" encoding="utf-8"?>
<ipset type="hash:ip"><entry>111.111.111.111</entry>
</ipset>
2.3 從set中刪除ip
[root@blog ipsets]# firewall-cmd --permanent --ipset=sshblock --remove-entry=111.111.111.111
success查看刪除ip的效果
[root@blog ipsets]# more /etc/firewalld/ipsets/sshblock.xml
<?xml version="1.0" encoding="utf-8"?>
<ipset type="hash:ip">
</ipset>
2.4 刪除一個set
[root@blog ipsets]# firewall-cmd --permanent --delete-ipset=sshblock
success查看sshblock這個set的配置文件是否還存在?
[root@blog ipsets]# more /etc/firewalld/ipsets/sshblock.xml
more: stat of /etc/firewalld/ipsets/sshblock.xml failed: No such file or directory
2.5 打印一個set的文件路徑
[root@blog ipsets]# firewall-cmd --permanent --path-ipset=sshblock
/etc/firewalld/ipsets/sshblock.xml
2.6 打印一個set的內容
[root@blog ipsets]# firewall-cmd --permanent --info-ipset=sshblock
sshblocktype: hash:ipoptions:entries: 111.111.111.111
2.8 判斷一個ip是否存在于set中?
[root@blog ipsets]# firewall-cmd --permanent --ipset=sshblock --query-entry=1.1.1.1
no
[root@blog ipsets]# firewall-cmd --permanent --ipset=sshblock --query-entry=111.111.111.111
yes
2.9 列出所有的ipsets
[root@blog ipsets]# firewall-cmd --permanent --get-ipsets
sshblock
2.10 得到所有的默認ipset類型
[root@blog ipsets]# firewall-cmd --get-ipset-types
hash:ip hash:ip,mark hash:ip,port hash:ip,port,ip hash:ip,port,net hash:mac
hash:net hash:net,iface hash:net,net hash:net,port hash:net,port,net
三、firewalld中使用ipset
3.1 把一個ipset加入到禁止的規則
[root@blog ipsets]# firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source ipset="sshblock" drop'
success查看xml中的記錄:
[root@blog ipsets]# more /etc/firewalld/zones/public.xml
...<rule family="ipv4"><source ipset="sshblock"/><drop/></rule>
...使生效
[root@blog ipsets]# firewall-cmd --reload
success把禁止的規則刪除
[root@blog ipsets]# firewall-cmd --permanent --remove-rich-rule 'rule family="ipv4" source ipset="sshblock" drop'
success查看xml中的記錄(剛才的drop信息被去除了):
[root@blog ipsets]# more /etc/firewalld/zones/public.xml
......使生效
[root@blog ipsets]# firewall-cmd --reload
success
3.2 把ip地址中ipset中刪除
注意:沒寫入到磁盤
[root@blog ipsets]# firewall-cmd --ipset=sshblock --remove-entry=111.111.111.111
success
[root@blog ipsets]# firewall-cmd --ipset=sshblock --query-entry=111.111.111.111
no
[root@blog ipsets]# firewall-cmd --ipset=sshblock --get-entries可見已刪除成功,如果想永久性的記錄下來:寫入到磁盤后 reload一次
[root@blog ipsets]# firewall-cmd --permanent --ipset=sshblock --remove-entry=111.111.111.111
success
[root@blog ipsets]# more /etc/firewalld/ipsets/sshblock.xml
<?xml version="1.0" encoding="utf-8"?>
<ipset type="hash:ip">
</ipset>
[root@blog ipsets]# firewall-cmd --reload
success
四、添加到ipset中的ip地址數據是否會重復
因為使用了hash類型,當ip重復時firewall-cmd會報錯:
新建ipset
[root@blog ipsets]# firewall-cmd --permanent --new-ipset=sshblock --type=hash:ip
success
添加ip
[root@blog ipsets]# firewall-cmd --permanent --ipset=sshblock --add-entry=111.111.111.111
success查看文件
[root@blog ipsets]# more /etc/firewalld/ipsets/sshblock.xml
<?xml version="1.0" encoding="utf-8"?>
<ipset type="hash:ip"><entry>111.111.111.111</entry>
</ipset>再次添加ip
[root@blog ipsets]# firewall-cmd --permanent --ipset=sshblock --add-entry=111.111.111.111
Warning: ALREADY_ENABLED: 111.111.111.111
success查看文件:
[root@blog ipsets]# more /etc/firewalld/ipsets/sshblock.xml
<?xml version="1.0" encoding="utf-8"?>
<ipset type="hash:ip"><entry>111.111.111.111</entry>
</ipset>
沒有出現重復的情況
五、使用腳本抓取有問題的ip加入到拒絕訪問的ipset
常用的幾類ip:
-
被firewalld防火墻reject的ip
-
nginx日志中訪問過于頻率的ip
-
secure日志中登錄失敗的ip
我們以secure日志中登錄失敗的ip為例:
先用命令抓取到登錄失敗的ip:
[root@blog log]# grep -i 'Failed password' /var/log/secure | awk '{print $11}' | sort -n | uniq -c | sort -k1nr | awk '{if ($1>5) print $2}'
...寫一段腳本,放到crond中定時執行即可:
[root@blog ~]# vi ./addlogifailip2firewall.sh內容:
#!/bin/bash
for LINE in `grep -i 'Failed password' /var/log/secure | awk '{print $11}' | sort -n | uniq -c | sort -k1nr | awk '{if ($1>3) print $2}'`; doecho "${LINE}";firewall-cmd --permanent --ipset=sshblock --add-entry="${LINE}";
done;
firewall-cmd --reload;
六、如何防止自己被誤關在防火墻外?使用ip白名單
把允許訪問的ip加入到trusted區域:
[root@blog zones]# firewall-cmd --permanent --zone=trusted --add-source=111.111.111.111使生效:
[root@blog zones]# firewall-cmd --reload注意此處不要使用ipset,
使用ipset后,如果同一個ip也被加入了被拒絕的set,
則此ip還是會關到外面。
原因在于firewalld把規則轉到nftables的處理機制,
它把set的處理合并到默認的public zone中去處理了.
大家可以用nft的命令驗證 :
[root@blog log]# nft list ruleset
七、查看firewalld的版本
[root@blog ~]# firewall-cmd --version
0.6.3
八、查看linux的版本
[root@blog ~]# cat /etc/redhat-release
CentOS Linux release 8.0.1905 (Core)