我需要 iptables 以允许基于来自我的家庭 ip 的域名进行 ssh 访问,但希望对所有其他地址保持关闭状态。由于我的动态 ip 偶尔会发生变化,所以我编写了一个脚本来根据我的动态 dns 条目的 ip 更新规则。我是新手,所以我相信有更好的方法。将“yourname”替换为您的动态 dns 主机名。
#!/bin/sh
/usr/bin/nslookup yourname.dynalias.org > temp
found=0
address=""
while read LINE
do
if [[ "$LINE" == Address* ]]; then
let found++
if [[ $found == 2 ]]; then
address=${LINE:8};
/sbin/iptables-save > /root/rulesdump
while read LINE2
do
if [[ "$LINE2" == *$address* ]]; then
ruleexists=1;
fi
done < /root/rulesdump;
if [[ "$ruleexists" != 1 ]]; then
/sbin/iptables -D INPUT -j LOG_DROP
/sbin/iptables -A INPUT -s $address -p tcp -m tcp --dport 22 -j LOG_ACCEPT
/sbin/iptables -A INPUT -j LOG_DROP
fi
fi
fi
done < /root/temp;
如果可能,请考虑设置一个透明的应用程序级代理。应用程序代理可能会更容易进行这种类型的过滤。
如果您必须使用 iptables 执行此操作,则 kludgy 选项将是创建一个链,创建一个命令行脚本,该脚本会定期使用来自 DNS 的结果更新该特定链,以获得您需要使用的名称。
如果有人要尝试创建一个真正基于包过滤的 DNS 的东西,那几乎肯定必须通过用户空间来完成。具体来说,您将使用类似libnetfilter_queue的东西。我从未使用过它,但Packetbl可能接近做到这一点,但它似乎没有得到很好的维护。
另一种选择可能是设置第 7 层过滤。如果 DNS 名称作为数据包负载的一部分被转换,您可能能够过滤请求的一部分。
我需要 iptables 以允许基于来自我的家庭 ip 的域名进行 ssh 访问,但希望对所有其他地址保持关闭状态。由于我的动态 ip 偶尔会发生变化,所以我编写了一个脚本来根据我的动态 dns 条目的 ip 更新规则。我是新手,所以我相信有更好的方法。将“yourname”替换为您的动态 dns 主机名。
将上面的脚本放在 crontab 中以每隔一段时间运行一次。
简短的回答,如果您确定 IP 永远是静态的:
在红宝石和更短的情况下也是如此: