分享
 
 
 

FreeBSD连载(79):设置和使用ipfilter

王朝system·作者佚名  2006-11-23
窄屏简体版  字體: |||超大  

设置和使用ipfilter虽然ipfw/natd已经是相当强大的网络地址转换及防火墙系统,然而它还是有一定的缺点存在。其中最重要的一个缺点是natd是使用守护进程的方法来进行地址转换,因为它没有运行在内核中,而是通过divert socket来和内核通信,这种方式虽然比较灵活,但效率显然要低一些。

另外,natd的功能还不能满足有些要求,natd能做静态地址转换和使用一个伪装地址为多个内部地址服务,但其不能从一个给定的地址池中,为内部地址自动分配IP地址。毕竟natd是一个较早的网络地址转换工具,当前的发展已经比较迟缓。但是由于ipfw是FreeBSD系统的一部分,并且过滤和地址转换是由不同的部分来完成的,结构清晰,因此对于大部分情况都很适合,因此一般仍应使用ipfw/natd。

如果ipfw/natd不能满足使用者的需要,能避免ipfw/natd缺点的另一个网络地址转换和数据包过滤的工具是ipfilter。虽然FreeBSD是其支持的主要系统,但它其实是一个支持多平台的独立软件,不仅能运行在FreeBSD上,也能运行在其他多种Unix系统中。由于它被包括进FreeBSD基本系统中,因此在FreeBSD下配置ipfilter同样也非常轻松。

ipfilter的网址为http://cheops.anu.edu.au/~avalon/,FreeBSD 3.0之前它不包括在FreeBSD的基本系统中,需要手工设置。

由于ipfilter与ipfw同为在内核级对IP数据包进行处理的系统,因此他们相互冲突,不能同时并存在一个内核内,否则内核的TCP/IP功能就不能正常执行。为了使用ipfilter,就需要重新定制内核,删除所有IPFIREWALL的设置,而添加IPFILTER的设置。

#options IPFIREWALL#options IPDIVERToptions IPFILTERoptions IPFILTER_LOG

选项IPFILTER为支持IPFILTER的基本代码,IPFILTER_LOG为支持IPFILTER的统计记录能力。需要增加这些选项,并注释IPFIREWALL、IPDIVERT及其相关选项。此后,就可以重新定制、安装新内核。然而在重新启动之前,还需要在rc.conf中设置firewall_enable的值为NO,当系统内核不存在IPFIREALL功能又设置了firewall_enable的时候,启动文件就会自动载入支持这个功能的可加载模块ipfw.ko,载入ipfw.ko之后的系统内核就等同于使用IPFIREWALL内核选项的系统,与ipfilter发生冲突。然而ipfilter仍然需要设置gateway_enable,以打开系统内核的数据包转发功能。

使用新内核启动系统之后,如果本地计算机的网络功能正常,此时再使用ipfw就会报告错误。这就能使用ipfilter来设置包过滤和网络地址转换了。

设置地址转换

为了在ipfilter下设置网络地址转换,首先要创建一个地址转换设置文件,例如/etc/ipflter.nat。与ipfw/natd的相似,最基本的用法为使用一个外部地址来转换所有内部地址,此时必须进行端口转换,因此ipfilter.nat中应该包含的NAT规则为:

map fxp1 192.168.3.0/24 -> 202.102.245.60/32 portmap tcp/udp 10000:65000

这个设置中,首先使用map关键字指明是进行地址转换的设置,此后的fxp1为连接外部网络的网络界面,在这个网络界面上执行数据包的IP地址和端口地址转换,第三个参数为进行转换的内部地址的范围,此后跟随的一个->符号表示进行地址转换,第五个参数为要转换为的外部地址,当指定子网掩码长度为32时就表示这只是一个主机而非子网范围,后面portmap关键字对tcp/udp协议进行端口转换,其使用的映射端口范围为在10000到65000之间,也可以对tcp或udp协议分别指定转换端口的范围。

如果使用者拥有的不仅是一个主机,而是一个具备多个合法IP地址的子网,这样就能设置使用地址池,为内部向外连接的计算机动态分配合法的外部IP地址,这样的设置更为简单,因为不需要指定portmap进行地址转换。

map fxp1 192.168.3.0/24 -> 202.102.245.0/26

显然内部计算机的数量显然要多于系统拥有的合法地址的数量,上例中内部地址最多254个,而合法的外部地址仅仅有62个,这样如果向外连接的计算机一多,必然出现地址资源用光的问题。因此动态分配IP一般和端口转换结合起来,以避免出现地址消耗完毕的问题。

map规则是用于转换外出数据包的源地址,使得被转换后的地址好象是从外部地址中发起的。而另一个规则rdr用于转换数据包中的目的地址,这样就能使得一个数据包被转发到某个特定计算机上进行处理,这可用于构建端口映射关系。

rdr fxp1 202.102.245.60 port ftp -> 192.168.3.2 port ftp

上面的规则将指定ipfilter在fxp1网络界面上将发送给202.102.245.60,端口为ftp的数据包,转换为发送给内部地址192.168.3.2。

rdr的另一个重要用途是可以用以构建透明的代理服务器,普通代理服务器都需要在客户机上进行设置,如果不进行设置,客户机将直接访问Internet上的计算机而不通过代理服务器,然而防火墙可以将这些应用请求转发给代理服务器,完成代理工作。此时对外界发送请求是在内部网络界面fxp0上发起的,因此也要在这里进行地址转换,而使用0.0.0.0/0代表对所有目的地址,并且是80端口的浏览请求都转发到127.0.0.1上去,而127.0.0.1必须运行代理服务器软件,以提供代理服务。

rdr fxp0 0.0.0.0/0 port 80 -> 127.0.0.1 port 80

虽然不是所有的应用代理服务都能使用透明代理的方法来减轻客户设置的负担,但绝大多数代理完全可以使用这种方法,使得客户不需要修改软件设置,就能利用代理服务器,而代理服务器具备大量的缓冲区,能够节约内部网络的Internet访问流量并加速Internet访问速度。

因此,一个简单的不支持透明代理服务器的设置文件ipnat.conf例子为:

map fxp1 192.168.3.0/24 -> 202.102.245.0/26 portmap tcp/udp 10000:65000map fxp1 192.168.3.0/24 -> 202.102.245.0/26rdr fxp1 202.102.245.60 port ftp -> 192.168.3.2 port ftp

在这样的设置下,tcp和udp在地址资源消耗完毕之后将进行端口转换,而其他协议,如icmp,将直接进行地址转换而不必进行端口转换。此后就可以将这个转换规则加入系统中,需要执行ipnat命令:

# ipnat -C# ipnat -f /etc/ipnat.conf

当前使用-C参数用于清除现有的转换规则,-f用于从配置文件中读取转换规则。设置了转换规则之后,就可以使用-l参数查看当前设置的转换规则和已经激活的转换关系。

# ipnat -lList of active MAP/Redirect filters:map fxp1 192.168.3.0/24 -> 202.102.245.0/26 portmap tcp/udp 10000:65000map fxp1 192.168.3.0/24 -> 202.102.245.0/26 rdr fxp1 202.102.245.60/32 port 21 -> 192.168.3.2 port 21 tcpList of active sessions:RDR 192.168.3.2 21 <- -> 202.102.245.60 21 [202.102.245.25 35635] 863992 0 407MAP 192.168.3.2 1024 <- -> 202.102.245.60 10000 [202.102.245.25 9999] 863993 0 1f09

设置包过滤

ipfilter也能很好的完成包过滤任务,它的过滤规则相当复杂。下面为一些简单的过滤设置例子,一般这些过滤规则可以保存在/etc/ipf.conf文件中。

block in log quick all with shortblock in log quick all with ipopts

block参数用于屏蔽符合过滤条件的数据包,in代表数据包的方向,标识从网络上或其他网络界面上发送到某个网络界面上的数据包,log用于指出该规则过滤的数据包应被记录下来,quick指示ipfilter进行快速过滤处理,符合这个规则的数据包将立即丢弃,all with short标识不完整的IP数据包,数据包的长度太小就没有包含合法的源地址或目标地址,从而无法被ipfilter识别,all with ipopts标志本身带有路由数据的IP数据包,这些IP数据包由于包含自己的路由信息,因此可能会带来网络安全问题。

这两句设置用于过滤可能会带来安全问题的短数据包或具备路由信息的数据包。

pass in on fxp0 allpass out on fxp0 allpass in on lo0 allpass out on lo0 all

pass用于指定数据包可以通过,out与in相反,标识从网络界面向网络上或其他网络界面发送的数据包,而on fxp0或on lo0标识进行处理的网络界面。这里的设置允许内部网络界面、loopback网络界面可以自由发送和接收数据包。

block in log on fxp1 allblock out log on fxp1 all

为了安全起见,除了明确指定可以发送和接收的数据包之外,屏蔽其余的外部网络界面进行数据发送和接收。

block in log quick on fxp1 from 10.0.0.0/8 to anyblock in log quick on fxp1 from 192.168.0.0/16 to anyblock in log quick on fxp1 from 172.16.0.0/12 to anyblock in log quick on fxp1 from 127.0.0.0/8 to any

上面的设置明确屏蔽具备内部网络地址的数据包被转发到外部网络去,由于ipfilter中地址转换和包过滤是在同一个系统中完成的,因此不必担心它们会发生冲突问题。

pass out log on fxp1 proto icmp all keep statepass out log on fxp1 proto tcp/udp from any to any keep state

proto用于指定不同的协议,通常可以设置为tcp, udp和icmp。这两行设置允许TCP, UDP, ICMP协议的数据包可以向外发送出去,keep state用于标识建立TCP连接之后的数据包,或者ICMP、UDP的回应数据包,以允许回应数据包能发送回内部网络。

pass in quick on fxp1 proto tcp from any to any port = ftp-data keep statepass in quick on fxp1 proto tcp from any port = ftp-data to any port > 1023 keep state

ftp中将打开额外的端口以进行数据传输,这两个设置允许对ftp数据端口的数据包能够进行转发。

block return-rst in log on fxp1 proto tcp from any to any flags S/SAblock return-icmp(net-unr) in log on fxp1 proto udp from any to any

对于其他tcp连接请求,防火墙回应一个RST数据包关闭连接,S/SA标识TCP数据包的标志,S为Syn,A为Ack,而S/SA表示对Syn和Ack中的Syn标志进行检查,这类数据包是用于设定连接的数据包。对UDP请求,防火墙回应网络不可达到的ICMP包。

上面的例子将屏蔽外部计算机发向网络内部的数据包,但允许内部向外的发起网络访问。如果要允许外部网络对内的访问,就必须增加其他pass in规则,以使得过滤规则能适应更复杂的情况。为了使上面的设置生效,必须将过滤规则加入到内核中去,这需要使用ipf命令。

# ipf -Fa# ipf -f /etc/ipf.conf

首先使用-Fa标志清除所有的过滤规则,然后将ipf.conf中的设置加入系统中。此后,可以使用ipfstat来检查ipfilter进行过滤的各种统计信息。

# ipfstat input packets: blocked 227 passed 116210 nomatch 68219 counted 0output packets: blocked 0 passed 74586 nomatch 20316 counted 0 input packets logged: blocked 227 passed 24883output packets logged: blocked 0 passed 17153 packets logged: input 0 output 0 log failures: input 25028 output 17139fragment state(in): kept 0 lost 0fragment state(out): kept 0 lost 0packet state(in): kept 1 lost 0packet state(out): kept 14 lost 8ICMP replies: 160 TCP RSTs sent: 9Result cache hits(in): 47523 (out): 53694IN Pullups succeeded: 0 failed: 0OUT Pullups succeeded: 0 failed: 0Fastroute successes: 0 failures: 0TCP cksum fails(in): 0 (out): 0Packet log flags set: (0x10000000) packets passed through filter

虽然在规则中指定了log选项,但是缺省时候syslogd并不会记录ipfilter发送的信息。符合规则的数据记录并没有真正被发送到系统日志记录中,必须使用ipmon打开记录功能。

# ipmon -s -n -x

由于ipmon使用的是syslog的local0通道,缺省情况下local0通道并没有打开,因此只有很少的错误信息被发送到/var/log/messages文件中。为了打开local0通道,还需要改动syslogd.conf,增加下面的设置,以记录ipfilter的全部记录。

local0.* /var/log/ipfilter.log

为了不让ipfilter的记录发送到/var/log/messages等其他日志文件中,可以在/var/log/messags设置行中添加一个记录local.none。

此后,使用touch创建ipfilter.log文件,并重新启动syslogd,就能在/var/log/ipfilter.log中正确记录过滤记录了。当一切都设置完毕之后,就能将ipf和ipnat这两个设置命令放入系统启动文件rc.local,以便每次系统自动启动都能执行防火墙设置。

未完,待续。。。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有