我如何以编程方式动态管理 iptables 规则?
- 2024-11-01 08:41:00
- admin 原创
- 46
问题描述:
我需要查询现有规则,并能够轻松添加和删除规则。我还没有找到任何可以执行此操作的 API。我是否遗漏了什么?
我最接近的解决方案是使用iptables-save | iptables-xml
查询并手动调用 iptables 命令本身来添加/删除规则。我考虑过的另一个解决方案是从我的应用程序数据库中重新生成整个规则集并刷新整个链,然后再次应用它。但我想避免这种情况,因为我不想丢弃任何数据包——除非有办法自动完成此操作。我想知道是否有更好的方法。
C 语言中的 API 非常棒;但是,由于我计划将其构建成一个独立的 suid 程序,所以用任何语言执行此操作的库也很好。
解决方案 1:
来自netfilter 常见问题解答:
不幸的是,答案是:不是。
现在您可能会想“但是 libiptc 怎么办?”。正如邮件列表中多次指出的那样,libiptc绝不会用作公共接口。我们不保证接口稳定,并且计划在下一个版本的 Linux 数据包过滤中将其删除。libiptc 太低层了,无论如何都无法合理使用。
我们很清楚这种 API 存在根本缺陷,我们正在努力改善这种情况。在此之前,建议使用 system() 或打开 iptables-restore 的 stdin 管道。后者将为您提供更好的性能。
解决方案 2:
使用 iptables-save 和 iptables-restore 来查询和重新生成规则无疑是最有效的方法。它们曾经是 shell 脚本,但现在它们是非常高效的 C 程序。
不过,我应该指出,您可以使用一个工具来使维护 iptables 变得更加容易。大多数动态规则集实际上是多次重复的相同规则,例如:
iptables -A INPUT -s 1.1.1.1 -p tcp -m --dport 22 -j ACCEPT
iptables -A INPUT -s 2.2.2.0/24 -p tcp -m --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j REJECT
每次想要更改哪些端口可以访问端口 22(例如,对于端口敲击很有用)时,您都无需替换这些规则,而是可以使用 ipset。即:
ipset -N ssh_allowed nethash
iptables -A ssh_allowed -m set --set ssh_allowed src -p tcp -m --dport 22 -j ACCEPT
ipset -A ssh_allowed 1.1.1.1
ipset -A ssh_allowed 2.2.2.0/24
集合可以保存 IP 地址、网络、端口、MAC 地址,并在其记录中设置超时。(有没有想过只添加一个小时的东西?)。
甚至存在一种将一个集合与另一个集合交换的原子方法,因此刷新意味着创建一个新的临时集合,然后将其交换为现有集合的名称。
解决方案 3:
您可以考虑使用rfw,它是 iptables 的 REST API。它序列化来自各种潜在并发源的 iptables 命令并即时远程执行 iptables。
rfw 专为分布式系统而设计,可尝试更新多个机器上的防火墙规则,但它也可以在本地主机接口上的单台机器上运行。这样,它就可以避免 SSL 和身份验证开销,因为在这种情况下,它可以在纯 HTTP 上运行。
示例命令:
PUT /drop/input/eth0/11.22.33.44
其对应为:
iptables -I INPUT -i eth0 -s 11.22.33.44 -j DROP
您可以插入和删除规则以及查询当前状态以获取 JSON 格式的现有规则:
GET /list/input
免责声明:我启动了该项目。它是根据 MIT 许可证开源的。
解决方案 4:
据我所知(虽然似乎没有参考资料提到这一点),iptables-restore
它是原子的。最后,当COMMIT
读取行时,iptables
调用iptc_commit
in libiptc
(这是您不应该使用的内部接口),然后setsockopt(SO_SET_REPLACE)
使用您的新规则集进行调用。
这听起来就像你能得到的最原子的东西:只需一个内核调用。然而,我们欢迎更多知识渊博的人对此提出异议。:-)
编辑:我可以确认你的描述是正确的。iptables-restore
是作为内核中的原子操作完成的。
更具体地说,操作“仅”是每个 CPU 的原子操作。因为我们将整个规则集 blob 存储在每个 CPU 上(由于缓存优化)。
解决方案 5:
故意没有提供 API 来管理这些规则。你不应该想这么做。或者其他什么。
如果您需要足够动态的规则,并且您关心执行 /sbin/iptables 的性能,那么还有其他方法可以做到:
使用类似“最近”匹配或 IP 集匹配的方法,您可以在不更改规则集的情况下从黑名单/白名单中添加/删除 IP 地址。
您可以使用 NFQUEUE 将数据包传递到用户空间进行过滤
解决方案 6:
今天早上我醒来发现我受到了来自俄罗斯的拒绝服务 (DOS) 攻击。他们从数十个 IP 块攻击我。他们肯定有一个很大的 IP 池或某种代理列表/服务。每次我阻止一个 IP,另一个就会弹出来。最后,我找了一个脚本,发现我需要编写自己的解决方案。下面的有点激进,但他们将我的 TOP LOAD LEVEL 运行到 200 以上。
这是我编写的用于实时阻止 DOS 的快速脚本。
cat **"output of the logs"** | php ipchains.php **"something unique in the logs"**
==> PHP 脚本:
<?php
$ip_arr = array();
while(1)
{
$line = trim(fgets(STDIN)); // reads one line from STDIN
$ip = trim( strtok( $line, " ") );
if( !array_key_exists( $ip, $ip_arr ) )
$ip_arr[$ip] = 0;
$regex = sprintf( "/%s/", $argv[1] );
$cnt = preg_match_all( $regex, $line );
if( $cnt < 1 ) continue;
$ip_arr[$ip] += 1;
if( $ip_arr[$ip] == 1 )
{
// printf( "%s
", $argv[1] );
// printf( "%d
", $cnt );
// printf( "%s
", $line );
printf( "-A BLOCK1 -s %s/24 -j DROP
", $ip );
$cmd = sprintf( "/sbin/iptables -I BLOCK1 -d %s/24 -j DROP", $ip );
system( $cmd );
}
}
?>
假设:
1) BLOCK1 is a Chain already created.
2) BLOCK1 is a Chain that is run/called from the INPUT CHAIN
3) Periodically you will need to run "ipchains -S BLOCK1" and put output in /etc/sysconfig file.
4) You are familiar with PHP
5) You understand web log line items/fields and output.
解决方案 7:
这是使用 bash 和 iptables 动态阻止黑客在 CentOS 上滥用 sshd 的示例。在本例中,我将 sshd 配置为禁止密码登录(允许密钥)。我在 /var/log/secure 中查找“Bye Bye”的条目,这是 sshd 礼貌地说“f-off”的方式……
IP=$(awk '/Bye Bye/{print $9}' /var/log/secure |
sed 's/://g' |sort -u | head -n 1)
[[ "$IP" < "123" ]] || {
echo "Found $IP - blocking it..." >> /var/log/hacker.log
/sbin/iptables -A INPUT -s $IP -j DROP
service iptables save
sed -i "/$IP/d" /var/log/secure
}
我每秒、每分钟或任何让我高兴的时间循环运行一次。我测试 $IP 的值以验证它是否找到了有用的值,如果是,我调用 iptables 将其删除,然后使用 sed 清除日志文件中的 $IP,这样就不会再次添加该条目。
我做了一些预处理(未显示)以将一些始终有效且可能在连接时遇到问题(由于用户错误)的重要 IP 列入白名单。
我会不时地对 iptables 过滤列表进行排序,并从中创建 IP 范围(使用不同的脚本 - 检查后,它们通常是来自印度、中国和俄罗斯的 IP 范围)。因此,我的整体 iptables 过滤规则集保持在 50 到 500 个条目之间;ipset 在这么短的列表中并没有真正改善多少。
解决方案 8:
MarkR 说得对,你不应该这样做。最简单的方法是从脚本中调用 iptables,或者编写 iptables 配置并“恢复”它。
不过,如果您愿意,请阅读 iptables 的源代码。iptables 使用匹配和表作为共享对象。您可以使用源代码或它们。
Linux netfilter 在 /usr/include/netfilter* 下也有一些包含文件。这些是一些低级函数。这是 iptables 使用的。这是在没有 iptables 的情况下可以获得的最接近 API 的 API。
但是这个 API 很“混乱”。请记住,它被设计为仅供 iptables 使用。它没有很好的文档记录,您可能会遇到非常具体的问题,API 可能会在没有任何警告的情况下快速更改,因此升级可能会破坏您的代码,等等。
解决方案 9:
我知道根据 netfilter 讨论,这是一个短期解决方案,但在短期内,您可以使用 python 包装的 iptc:
https://github.com/ldx/python-iptables
我在最近的一个项目中试用了一些它,发现它非常有效。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件