当你在建立一个防火墙的时候,你会认为应该谨慎的使用代理,你可以"绷紧"你的防火墙规则来保护你的内部网。或者你认为你的NAT没有正常的工作,你可以使用重定向: 4.6 应用代理 ftp有两种工作方式,如果想让防火墙后面的ftp正常工作,应该使用应用代理。我们可以让我们的防火墙注意通过它的每一个包,当它发现它正在处理的是主动ftp连接,它能够产生几条临时规则,就像keep state,使得ftp的数据传输能够正常工作。我们需要些这样的规则: 5. 操作过滤规则,ipf ipf用来加载ipfilter规则。规则文件可以放在系统的任何地方,但是一般都放在/etc/ipf.rules,/usr/local/etc/ipf.rules,/etc/opt/ipf/ipf.rules 6.加载NAT规则,ipnat ipnat用来加载NAT规则。规则文件可以放在系统的任何地方,但是一般都放在/etc/ipnat.rules/usr/local/etc/ipnat.rules,/etc/opt/ipf/ipnat.rules用ipnat加载,也可以用参数-r删除规则。但一般也是清空(参数-C)然后加载,对于活动的映射-C无效,可以用-F来清除。 7. 监视和调试 你也许很想知道防火墙到底在干什么,而且如果ipfilter没有状态监视工具的话,它就不是一个完整的防火墙。 7.1 ipfstat工具 ipfstat最简的用法是显示一个关于防火墙执行情况的数据表,比如有多少个包通过或则抛弃,它们是否被记录,以及由多少状态条等等。你将看到的是这样一些数据: input packets logged: blocked 99286 passed 0
IP Filter Based Firewalls HOWTO
4.5 透明代理
rdr xl0 0.0.0.0/0 port 21 -> 127.0.0.1 port 21
这条规则是说任何连接ftp的数据包都被重定向到了127.0.0.1
针对ftp的代理有些复杂,因为web浏览器或者其它自动登录类型的客户端不知道如何跟代理通信。有个补丁是针对TIS防火墙的sftp-gw,NAT配合这个补丁能够解决这个问题。很多代理软件是透明代理(如squid)。
当你想强迫你的用户先向代理请求验证时,关键字rdr经常是很有用的。(例如你想让你的工程师能够上网冲浪,但是不希望呼叫中心的员工上网)
map tun0 192.168.1.0/24 -> 20.20.20.1/32 proxy port ftp ftp/tcp
记得把这条规则写在其它映射规则的前面,否则其它映射规则在这条规则就起作用了,记住ipnat跟ipfilter不同,ipnat是先匹配规则(只要一匹配其它规则就跳过去)。另外rcmd和raudio代理也必须写在其它规则的前面。
IPfilter可以有两套规则,活动规则和不活动规则。默认情况下所有的操作都是基于活动规则。你可以用ipf -I来使用不活动规则。这两套规则可以用参数-s进行转换。这是非常有用的,你在测试新规则的时候就不用清除老规则。
ipf加参数-r可以删除列表中的规则,但是比较安全的方法是用参数-F清除规则,然后再加载修改后的规则。
加载规则最简单的方法是ipf -Fa -f /etc/ipf.rules.想获得其它操作规则的方法请参考ipf的man page.
NAT规则和活动的映射可以用ipnat -l查看。最简单的家在NAT规则的方法是ipnat -CF -f /etc/ipnat.rules.
# ipfstat
input packets: blocked 99286 passed 1255609 nomatch 14686 counted 0
output packets: blocked 4200 passed 1284345 nomatch 14687 counted 0
output packets logged: blocked 0 passed 0
packets logged: input 0 output 0
log failures: input 3898 output 0
fragment state(in): kept 0 lost 0
fragment state(out): kept 0 lost 0
packet state(in): kept 169364 lost 0
packet state(out): kept 431395 lost 0
ICMP replies: 0 TCP RSTs sent: 0
Result cache hits(in): 1215208 (out): 1098963
IN Pullups suclearcase/" target="_blank" >cceeded: 2 failed: 0
OUT Pullups succeeded: 0 failed: 0
Fastroute successes: 0 failures: 0
TCP cksum fails(in): 0 (out): 0
Packet log flags set: (0)
none
ipfstat当然也能够显示你目前的规则列表。参数-i或者-o显示有哪些in规则或者out规则,加上参数-h能够显示更详细的信息,包括每条规则有多少个数据包命中。例如:
# ipfstat -ho
2451423 pass out on xl0 from any to any
354727 block out on ppp0 from any to any
430918 pass out quick on ppp0 proto tcp/udp from 20.20.20.0/24 to any keep state keep frags
从这里我们可以看出哪些地方可能不正常,ipfstat不能告诉你哪些规则正确或者错误,它只是告诉你由于你的规则而发生了什么事情。为了进一步调试规则,可以使用参数-n,这个参数显示规则的顺序
# ipfstat -on
@1 pass out on xl0 from any to any
@2 block out on ppp0 from any to any
@3 pass out quick on ppp0 proto tcp/udp from 20.20.20.0/24 to any keep state keep frags
ipfstat的最后一个用处是显示一些关于状态记录的数据。这个参数是-s
# ipfstat -s
281458 TCP
319349 UDP
0 ICMP
19780145 hits
5723648 misses
0 maximum
0 no memory
1 active
319349 expired
281419 closed
100.100.100.1 -> 20.20.20.1 ttl 864000 pass 20490 pr 6 state 4/4
pkts 196 bytes 17394 987 -> 22 585538471:2213225493 16592:16500
pass in log quick keep state
pkt_flags & b = 2, pkt_options & ffffffff = 0
pkt_security & ffff = 0, pkt_auth & ffff = 0
从这我们可以看到有一条tcp连接状态。不同的版本输出的内容会略有不同,但是基本的信息是一样的。这条连接的状态是4/4,而其它的状态是不完整的,我们将在后面详细介绍。4/4状态的超时时间是240小时,相当长的一段时间,但它默认是已建立的tcp连接的超时时间。当这条状态空闲时TTL的值每秒减1,最终超时并被删除。当一个连接状态重新启用时,它的TTL值又恢复到864000,必须确保一个活动的连接不会超时。我们还可以看到有196个17K的数据包通过。还有两端的端口号,这个例子是987和22。这意味着这条状态表示一个从100.100.100.1端口987到20.20.20.1端口22的连接。第二行最大的数字是TCP顺序号,保证没有人能够轻易的在这个连接中注入伪装的数据包。TCP的窗口也显示出来。