Iptables ipset 使用经验: Difference between revisions

From 清冽之泉
Jump to navigation Jump to search
No edit summary
 
(47 intermediate revisions by the same user not shown)
Line 1: Line 1:
iptables 加上 ipset,对大批量地屏蔽恶意 ip,非常有用。ipset 负责建立一个 ip 集合,比如白名单集合、黑名单集合;iptables 规则负责对该集合做放行或封禁处理。
== 总框架 ==
前提是先安装好用到的软件:<code>apt install ipset iptables netfilter-persistent ipset-persistent iptables-persistent</code>
# 临时
## ipset create:创建一个名单容器,如 mw_white
## ipset add:往名单里加 IP,立即生效
## iptables -C:检查规则是否已存在,只检查,不修改
## iptables -I:改内存里的防火墙规则,让 iptables 引用 ipset 名单
# 持久化
## ipset save > /etc/iptables/ipsets:把名单名字、成员持久化
## iptables-save > /etc/iptables/rules.v4:把防火墙规则持久化
## netfilter-persistent save:统一保存当前 ipset / iptables 状态
# 开机重生
## systemctl enable netfilter-persistent:让开机时自动读取上述文件并恢复
== 白名单 ==
== 白名单 ==
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash" line>
ipset create mw_white hash:ip family inet hashsize 4096 maxelem 131072 -exist
ipset create mw_white hash:ip family inet hashsize 4096 maxelem 131072 -exist
iptables -I INPUT 1 -m set --match-set mw_white src -j ACCEPT
iptables -C INPUT -m set --match-set mw_white src -j ACCEPT 2>/dev/null || iptables -I INPUT 1 -m set --match-set mw_white src -j ACCEPT
</syntaxhighlight>
 
== 黑名单 IP ==
<syntaxhighlight lang="bash" line>
ipset create mw_ban hash:ip family inet hashsize 4096 maxelem 131072 timeout 86400 -exist
iptables -C INPUT -m set --match-set mw_ban src -j DROP 2>/dev/null || iptables -I INPUT 2 -m set --match-set mw_ban src -j DROP
</syntaxhighlight>
 
== 黑名单 网段 ==
<syntaxhighlight lang="bash" line>
ipset create mw_ban_net hash:net family inet hashsize 4096 maxelem 131072 timeout 1728000 -exist # 恶意网段,封 20 天
iptables -C INPUT -m set --match-set mw_ban_net src -j DROP 2>/dev/null || iptables -I INPUT 3 -m set --match-set mw_ban_net src -j DROP
ipset add mw_ban_net 1.2.3.0/24
</syntaxhighlight>
 
== 常规操作 ==
日常操作,主要改集合名和具体 IP。
<syntaxhighlight lang="bash" line>
ipset list mw_white
ipset list mw_white
ipset test mw_white 1.2.3.4
ipset test mw_white 1.2.3.4 # 改动前先检查自己有没有在白名单
ipset add mw_white 1.2.3.4 -exist
ipset add mw_white 1.2.3.4 -exist
ipset del mw_white 1.2.3.4
ipset del mw_white 1.2.3.4
</syntaxhighlight>
</syntaxhighlight>


== 黑名单 ==
== 反向操作 ==
<syntaxhighlight lang="bash">
有时,也需要把错误规则清除。
ipset create mw_ban hash:ip family inet hashsize 4096 maxelem 131072 timeout 86400 -exist
<syntaxhighlight lang="bash" line>
iptables -I INPUT 2 -m set --match-set mw_ban src -j DROP
iptables -L INPUT -n --line-numbers # 查看
ipset list mw_ban
iptables -D INPUT -m set --match-set mw_ban_net src -j DROP # 删除
ipset test mw_ban 1.2.3.4
ipset destroy mw_ban_net # 销毁
ipset add mw_ban 1.2.3.4 -exist
ipset del mw_ban 1.2.3.4
</syntaxhighlight>
</syntaxhighlight>


== 速率 ==
== 持久化 ==
<syntaxhighlight lang="bash" line>
# 单独手动保存
ipset save > /etc/iptables/ipsets
iptables-save > /etc/iptables/rules.v4


== 重启 ==
# 统一保存当前 netfilter 状态
<syntaxhighlight lang="bash">
netfilter-persistent save
ipset save > /etc/ipset.conf # 保存规则
ipset restore < /etc/ipset.conf # 手动恢复
</syntaxhighlight>
</syntaxhighlight>


自动脚本:
不确定时,不要统一保存。确切无误了,再统一保存。
因为 iptables-persistent 只管 iptables,不管 ipset,所以要建一个 ipset 的自动恢复脚本。
 
<syntaxhighlight lang="bash">
== 开机重生 ==
# 放进 /etc/systemd/system/ipset-restore.service
<code>systemctl enable netfilter-persistent</code>。
[Unit]
Description=Restore IP sets
Before=netfilter-persistent.service
Wants=netfilter-persistent.service


[Service]
== 未来巡查 ==
Type=oneshot
<syntaxhighlight lang="bash" line>
ExecStart=/usr/sbin/ipset restore < /etc/ipset.conf
systemctl status netfilter-persistent
RemainAfterExit=yes
systemctl is-enabled netfilter-persistent # 问下有没有开机自启
iptables -L INPUT -n --line-numbers | head -30


[Install]
ls -l /etc/iptables/ipsets
WantedBy=multi-user.target
ls -l /etc/iptables/rules.v4
ls -l /usr/lib/systemd/system/netfilter-persistent.service
ls -l /usr/share/netfilter-persistent/plugins.d/
</syntaxhighlight>
</syntaxhighlight>


最后重启服务:
一个运维心法:内存状态、文件状态、开机恢复状态,三者必须对齐。
<syntaxhighlight lang="bash">
 
systemctl daemon-reload
任何命令、结果,都不是孤立的,一定有实体存在于某处。
systemctl enable ipset-restore
</syntaxhighlight>

Latest revision as of 22:02, 22 July 2026

iptables 加上 ipset,对大批量地屏蔽恶意 ip,非常有用。ipset 负责建立一个 ip 集合,比如白名单集合、黑名单集合;iptables 规则负责对该集合做放行或封禁处理。

总框架

前提是先安装好用到的软件:apt install ipset iptables netfilter-persistent ipset-persistent iptables-persistent

  1. 临时
    1. ipset create:创建一个名单容器,如 mw_white
    2. ipset add:往名单里加 IP,立即生效
    3. iptables -C:检查规则是否已存在,只检查,不修改
    4. iptables -I:改内存里的防火墙规则,让 iptables 引用 ipset 名单
  2. 持久化
    1. ipset save > /etc/iptables/ipsets:把名单名字、成员持久化
    2. iptables-save > /etc/iptables/rules.v4:把防火墙规则持久化
    3. netfilter-persistent save:统一保存当前 ipset / iptables 状态
  3. 开机重生
    1. systemctl enable netfilter-persistent:让开机时自动读取上述文件并恢复

白名单

ipset create mw_white hash:ip family inet hashsize 4096 maxelem 131072 -exist
iptables -C INPUT -m set --match-set mw_white src -j ACCEPT 2>/dev/null || iptables -I INPUT 1 -m set --match-set mw_white src -j ACCEPT

黑名单 IP

ipset create mw_ban hash:ip family inet hashsize 4096 maxelem 131072 timeout 86400 -exist
iptables -C INPUT -m set --match-set mw_ban src -j DROP 2>/dev/null || iptables -I INPUT 2 -m set --match-set mw_ban src -j DROP

黑名单 网段

ipset create mw_ban_net hash:net family inet hashsize 4096 maxelem 131072 timeout 1728000 -exist # 恶意网段,封 20 天
iptables -C INPUT -m set --match-set mw_ban_net src -j DROP 2>/dev/null || iptables -I INPUT 3 -m set --match-set mw_ban_net src -j DROP
ipset add mw_ban_net 1.2.3.0/24

常规操作

日常操作,主要改集合名和具体 IP。

ipset list mw_white
ipset test mw_white 1.2.3.4 # 改动前先检查自己有没有在白名单
ipset add mw_white 1.2.3.4 -exist
ipset del mw_white 1.2.3.4

反向操作

有时,也需要把错误规则清除。

iptables -L INPUT -n --line-numbers # 查看
iptables -D INPUT -m set --match-set mw_ban_net src -j DROP # 删除
ipset destroy mw_ban_net # 销毁

持久化

# 单独手动保存
ipset save > /etc/iptables/ipsets
iptables-save > /etc/iptables/rules.v4

# 统一保存当前 netfilter 状态
netfilter-persistent save

不确定时,不要统一保存。确切无误了,再统一保存。

开机重生

systemctl enable netfilter-persistent

未来巡查

systemctl status netfilter-persistent
systemctl is-enabled netfilter-persistent # 问下有没有开机自启
iptables -L INPUT -n --line-numbers | head -30

ls -l /etc/iptables/ipsets
ls -l /etc/iptables/rules.v4
ls -l /usr/lib/systemd/system/netfilter-persistent.service
ls -l /usr/share/netfilter-persistent/plugins.d/

一个运维心法:内存状态、文件状态、开机恢复状态,三者必须对齐。

任何命令、结果,都不是孤立的,一定有实体存在于某处。