我目前有一个脚本,它根据两个文件之间的选择标准向防火墙表添加规则。
文件 1 密钥.txt
<string>
<string>
..
..
文件 2 hellos.txt
<string> <ipaddress> <ipaddress>
<string> <ipaddress> <ipaddress>
..
..
我的脚本将文件 2 中的字符串与文件 1 中的字符串进行匹配。如果匹配,则它会在字符串匹配后为 ipaddress 添加防火墙规则。
脚本如下 -
#!/bin/bash
while true
do
#Match a string from both the files and print the ipaddress to a file
word=$(awk 'FNR==NR{a[$1];next}($1 in a){print}' keys.txt hellos.txt | awk -v OFS=' ' '{ print $2, $3 }') >address.txt
#Remove duplicates for the ipaddress file
awk '!a[$0]++' address.txt > address_improved.txt
#Add firewall rule from new file.
filename=address_improved.txt
while read -r a b
do
"/sbin/iptables" -I FORWARD 1 -m physdev --physdev-is-bridged --physdev-in enxa0cec80f92bd --physdev-out eno1 -s $a -d $b -j ACCEPT
done < "$filename"
sleep 0.01
#Run while loop again because the files are changing constantly
done
我该如何改进此脚本,以便每次执行 while 循环时都不会添加重复的防火墙规则。我尝试添加 -C(检查)选项,但它对我不起作用。我只是得到了一个错误的规则输出。
答案1
匹配两个文件中的字符串并将 ipaddress 打印到文件中
而是执行:(按照以下说明操作)
ipset add allowed_hosts <ip> <ip>
(不会自动允许重复)
设置 ipset 准备就绪:(根据您的喜好调整 maxelem)
ipset create allowed_hosts hash:net,net family inet hashsize 262144 maxelem 333000 counters comment
您的新规则:
"/sbin/iptables" -I INPUT 1 -m conntrack -j ACCEPT --ctstate RELATED,ESTABLISHED
"/sbin/iptables" -I INPUT 2 -m physdev --physdev-is-bridged --physdev-in enxa0cec80f92bd --physdev-out eno1 -m set --match-set allowed_hosts src,dst -j ACCEPT
"/sbin/iptables" -I INPUT 3 -m physdev --physdev-is-bridged --physdev-in enxa0cec80f92bd --physdev-out eno1 -m u32 --u32 "0>>22&0x3C@ 12>>26&0x3C@ 0 & 0xFF000000=0x17000000" -j DROP
"/sbin/iptables" -I FORWARD 1 -m conntrack -j ACCEPT --ctstate RELATED,ESTABLISHED
"/sbin/iptables" -I FORWARD 2 -m physdev --physdev-is-bridged --physdev-in enxa0cec80f92bd --physdev-out eno1 -m set --match-set allowed_hosts src,dst -j ACCEPT
"/sbin/iptables" -I FORWARD 3 -m physdev --physdev-is-bridged --physdev-in enxa0cec80f92bd --physdev-out eno1 -m u32 --u32 "0>>22&0x3C@ 12>>26&0x3C@ 0 & 0xFF000000=0x17000000" -j DROP
现在你的新循环:
while read -r a b
do
"/sbin/ipset" -! add allowed_hosts $a,$b
done < "$filename"
如果您需要保存 ipset 表,请说重新启动。
ipset save >ipset.txt
或者
ipset save -f ipset.txt
批量导入,包括从保存中自动创建。
ipset restore -f ipset.txt
由于您不需要不断更改 iptables,因此它将更加高效。
这行代码可以消除循环之外的所有问题
word=$(awk 'FNR==NR{a[$1];next}($1 in a){print}' keys.txt hellos.txt | awk -v OFS=' ' '{ print $2,$3 }') |xargs -n1 ipset -! add allowed_hosts
xargs -n1 为来自 stdin 的每一行重复该命令。-! 隐藏重复条目警报。来自 stdin 的输出会自动附加,因此不会提及。
您仍然需要 1 个 iptables 条目和上面提到的 ipset。