Linux网关路由器基于ipset批量导入文件黑名单IP的脚本故障排查求助
Linux网关路由器基于ipset批量导入文件黑名单IP的脚本故障排查求助
嘿各位bash大佬,我是个刚入门的新手,现在碰到个棘手的问题,想请大家帮我看看!
我家里用一台Linux服务器当网关路由器,已经配置好了基于ipset列表的iptables封禁规则,现在想把一个大文件里的黑名单IP批量导入到ipset集合里,但自己写的脚本要么跑不起来,要么达不到预期效果,实在摸不着头脑了😭
先跟大家说下我的背景:
- 路由器上的iptables规则是依赖名为
blocked_ip系列的ipset集合来封禁IP的 - 我需要从路由器拉取一个
dump.xml文件,解析出里面的IP地址,处理后批量导入到ipset里
我写的脚本步骤大概是这样的:
- 用scp从路由器拉取
dump.xml到本地指定目录 - 用Python脚本解析xml,提取出IP地址存成文本文件
- 对IP列表排序去重,避免重复封禁
- 因为IP数量特别多(几百万条),所以把文件分割成每个90万行的小文件,方便后续处理
- 最后循环遍历这些小文件,把IP逐个添加到对应的ipset集合里(比如第一个小文件的IP进
blocked_ip1,第二个进blocked_ip2以此类推)
但现在脚本不仅没写完(ipset循环部分写到一半卡壳了),而且前面的文件处理步骤也可能有问题,下面是我目前写的脚本代码:
#!/bin/bash # 从路由器拉取dump.xml文件 scp -P 21 root@192.168.0.10:/blocked-IP/dump.xml /var/scripts/IP cd /var/scripts/IP # 用Python解析xml提取IP /usr/bin/python2.7 /var/scripts/IP/parser_ip.py > /var/scripts/IP/ip_addresses.txt # 排序并去重IP列表 /usr/bin/sort -u /var/scripts/IP/ip_addresses.txt > /var/scripts/IP/sorted_ip.txt # 将大文件分割为每个90万行的小文件 /usr/bin/split -l 900000 -d /var/scripts/sorted_ip.txt /var/scripts/IP/sorted_ip_split # 准备导入ipset # 原本想先清空现有集合,但先注释掉了 #/sbin/ipset -F blocked_ip n=1; # 遍历所有分割后的小文件 for file_ip in `find /var/scripts/IP -type f -name "sorted_ip_split*"` do # 读取文件里的每一行IP cat $file_ip | while read line do # 尝试添加到对应的ipset集合 /sbin/ipset -A "blocked_ip${n}" $line done n=$((n+1)) done
我自己排查的时候发现几个可能的问题,但不确定:
- scp用了-P 21端口,是不是搞错了?因为我记得scp默认是22端口,路由器上的scp服务会不会是在22端口?
- split命令的输入路径是不是写错了?我生成的
sorted_ip.txt是在/var/scripts/IP/目录下,但split里写的是/var/scripts/sorted_ip.txt,是不是路径少了IP子目录? - 用
find命令遍历文件的时候,用反引号的方式会不会有问题?比如文件名如果有特殊字符的话? - ipset的集合
blocked_ip1、blocked_ip2这些我都没提前创建,是不是ipset -A命令会报错?因为添加元素需要集合先存在对吧? - 还有如果重复运行脚本,之前的IP会不会重复添加?我原本想先用
ipset -F清空,但又怕影响现有规则,所以注释掉了。
现在实在不知道该从哪下手了,有没有大佬能帮我排查下脚本里的问题,或者给我一些改进的建议?比如批量导入ipset有没有更高效的方式,不用逐行读取添加的?
备注:内容来源于stack exchange,提问作者user26537511
相关产品推荐
相关产品推荐

