任何人都可以请build议一种方法来使用iptables规则中的域名。
如果可以的话,请考虑设置一个透明的应用程序级代理。 一个应用程序代理可能会更容易做这种types的过滤。
如果你必须使用iptables来做,一个kludgy选项就是创build一个链,创build一个命令行脚本,定期用DNS的结果更新这个特定的链,以获得你需要使用的名字。
如果有人试图创build一个真正基于数据包过滤的DNS,那么几乎可以肯定必须通过用户空间来完成。 具体来说,你会使用像libnetfilter_queue 。 我从来没有使用它,但Packetbl可能会接近这样做,但它似乎没有很好的维护。
另一种select可能是设置第7层过滤 。 如果将DNS名称作为数据包有效负载的一部分进行转换,则可能可以过滤部分请求。
我需要iptables允许基于域名从我的家庭IP SSH访问,但要保持closures所有其他地址。 由于我有一个dynamic的ip偶尔会改变,我写了一个脚本来更新基于我的dynamicDNS条目的IP规则。 我是新来的,所以我确定有更好的方法。 将“yourname”replace为dynamicDNS主机名。
#!/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;
把上面的脚本放在crontab中,经常运行。
同样的事情ruby和更短:
#!/usr/bin/env ruby require 'resolv' ip = Resolv.getaddress "mydomain.com" `iptables -A INPUT -p tcp --dport 22 -s #{ip} -j ACCEPT` if `iptables --list` !~ /#{ip}/
简短的回答,如果你确定IP永远是静态的:
iptables -A INPUT -s `dig host.your-domain-name.com +short`/32 -p tcp -m tcp --dport 22 -j ACCEPT