可还是有一些问题要考虑。现在,我们不能再在INPUT链依据某些条件,比如--in-interface $LAN_IFACE --dst $INET_IP来进行过滤(译者注:因为这时已无固定的INET_IP)。这强迫我们只能基于Internet接口进行包的过滤,在这种情况下,内网必须访问那个可变的 Internet的IP。这会出现一些问题,有个例子能够说明这一点,就是我们在防火墙上运行HTTP服务。假如我们访问这个网站(其中,主页包含了一个指向HTTP服务器的静态连接,这可能是某个动态的DNS解决方案),问题就暴露了。经过NAT操作的机子会向DNS查询HTTP服务器的IP,然后再试着访问这个IP。万一我们是基于接口和IP做的过滤,这台机子就不能访问到HTTP了,因为INPUT链会 DROP掉这个包(译者注:还是因为Internet接口的IP不固定)。在某种情况下,这也会发生在您有静态IP的时候,但在那种情况下,我们能够增加一条规则,以检查LAN接口的包是否是发往INET_IP的,若是,则ACCEPT。
假如您看过以前的内容,得到或写一个能够获取动态IP的脚本可能会是个解决问题的好办法。比如,我们能够写一个脚本,他紧随着Internet连接的启动而运行,而且他能从命令ifconfig的输出中提取IP,再把这个IP赋给某个变量。较好的办法是使用一些程式自带的脚本,如 pppd带的脚本ip-up。也有一些网站,如linuxguruz.org,提供了很多有用的脚本,您能够在附录其他资源和链接找到他的链接。
![]() | 这个脚本比rc.firewall.txt的安全性要差一点。我明确地建议您尽可能使用后者,因为前者的开放性大了点,所以外部攻击的威胁就大了。 |
更有一种方法可获得IP,就是在脚本里加上类似这样的语句:
INET_IP=`ifconfig $INET_IFACE | grep inet | cut -d : -f 2 |
cut -d ' ' -f 1`
上面这句话的作用是从ifconfig的输出里提取接口$INET_IFACE的IP,再赋给$INET_IP。更好的办法是使用脚本 retreiveip.txt。但要注意,这个方法可能会引起一些不正常的情况,比如使防火墙和内网之间已有的连接停止。下面就说明一下最常见的问题。
假如这个脚本的代码是在另一个脚本内运行的,而那个脚本又是由PPP daemon启动的,就会因为NEW not SYN rules(具体信息查看未配置SYN的NEW状态包)的原因而挂起所以当前活动的连接。假如您删掉那个规则,可能会没有事,但还是不保险。
假如您不想改变已有的规则,而又要添加或删除规则,还要不损害已有的规则,这就没法做了。比如,您又想阻塞任何局域网里的机子访问防火墙,又想让他们能控制防火墙上的PPP daemon,假如不删除那个用来阻塞的规则,怎么能完成这样的事?
- 事情可能也不必这么复杂,就像上面说的,这会导致一些安全问题。但假如这个脚本能保持简单,维持规则的顺序和发现问题都是很容易的。





