匹配两个文件中的字符串并将 ipaddress 打印到文件中

匹配两个文件中的字符串并将 ipaddress 打印到文件中

我目前有一个脚本,它根据两个文件之间的选择标准向防火墙表添加规则。

文件 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。

相关内容