Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104573219
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-02 19:39:44

作者:marple_feng  出处:Unix爱好者家园unix-cd.com   
在网上找了很长时间,发现相关文件很少,但最后还是基本实现了这个功能: 
下载地址: 
ftp://ftp.sco.com/pub/TLS/tls709.tar.Z 
ftp://ftp.sco.com/pub/TLS/tls709.ltr 

第一步:按照tls709_ltr.htm文件进行安装: 
INSTALLATION: 

- Place tls709.Z in /, then run the following commands: 

 # cd / 
 # uncompress tls709.Z 
 # tar xvf tls709 

 This will install the files: 
   /tmp/ipfilter/README 
   /tmp/ipfilter/ip/space.c 
   /tmp/ipfilter/ip/Driver.o 
   /tmp/ipfilter/tcp/Driver.o 
   /tmp/ipfilter/tcp/space.c 
   /tmp/ipfilter/ipl-bin/ipf 
   /tmp/ipfilter/ipl-bin/ipfstat 
   /tmp/ipfilter/ipl-bin/ipmon 
   /tmp/ipfilter/ipl-bin/ipnat 
   /tmp/ipfilter/ipl-driver/Driver.o 
   /tmp/ipfilter/ipl-driver/Master 
   /tmp/ipfilter/ipl-driver/Node 
   /tmp/ipfilter/ipl-driver/System 
   /tmp/ipfilter/ipl-man/ipf.4 
   /tmp/ipfilter/ipl-man/ipf.5 
   /tmp/ipfilter/ipl-man/ipf.8 
   /tmp/ipfilter/ipl-man/ipfilter.5 
   /tmp/ipfilter/ipl-man/ipfstat.8 
   /tmp/ipfilter/ipl-man/ipftest.1 
   /tmp/ipfilter/ipl-man/ipl.4 
   /tmp/ipfilter/ipl-man/ipmon.8 
   /tmp/ipfilter/ipl-man/ipnat.1 
   /tmp/ipfilter/ipl-man/ipnat.4 
   /tmp/ipfilter/ipl-man/ipnat.5 
   /tmp/ipfilter/ipl-man/mkfilters.1 

- Make backup copies of the 'ip' and 'tcp' driver files in /etc/conf/pack.d, 
 then copy the new versions from /tmp/ipfilter to their respective locations 
 under /etc/conf/pack.d: 

ip/Driver.o 
ip/space.c 
tcp/Driver.o 
tcp/space.c 

- Add the IP Filter driver ("ipl"): 

cd /tmp/ipfilter/ipl-driver 
/etc/conf/bin/idinstall -k -a ipl 

- Copy the IP Filter configuration binaries: 

cd /tmp/ipfilter/ipl-bin 
cp * /etc 

- Relink the kernel by running '/etc/conf/cf.d/link_unix -y', and reboot 
 your system. 
//以上都是照着做,没什么特殊的。 

See the man pages in /tmp/ipfilter/ipl-man for configuration information. 
//这个偶技术太差,看不懂。 
Also see the IP Filter home page:    
And the IP Filter mailing list:     mailto://majordomo@coombs.anu.edu.au 
    with "subscribe ipfilter" in the body 

第二步:然后又在网上找到在freebsd上实现ipf的文章,又借鉴了一下: 

原文:为设置和使用ipfilter (年1月20日 15:30 王波 ) 


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

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

  如果ipfw/natd不能满足使用者的需要,能避免ipfw/natd缺点的另一个网络 
地址转换和数据包过滤的工具是ipfilter。虽然FreeBSD是其支持的主要系统,但 
它其实是一个支持多平台的独立软件,不仅能运行在FreeBSD上,也能运行在其他 
多种Unix系统中。由于它被包括进FreeBSD基本系统中,因此在FreeBSD 下配置i 
pfilter同样也非常轻松。 
由于ipfilter与ipfw同为在内核级对IP数据包进行处理的系统,因此他们相 
互冲突,不能同时并存在一个内核内,否则内核的TCP/IP功能就不能正常执行。 
为了使用ipfilter,就需要重新定制内核,删除所有 IPFIREWALL的设置,而添加 
IPFILTER的设置。 

#options IPFIREWALL 
#options IPDIVERT 

options IPFILTER 
options IPFILTER_LOG 
  
  

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

  使用新内核启动系统之后,如果本地计算机的网络功能正常,此时再使用ip 
fw就会报告错误。这就能使用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 

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

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

map fxp1 192.168.3.0/24 -> 202.102.245.0/26 portmap tcp/udp 10000:6500 

map fxp1 192.168.3.0/24 -> 202.102.245.0/26 
rdr 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 -l 
List of active MAP/Redirect filters: 
map fxp1 192.168.3.0/24  -> 202.102.245.0/26  portmap tcp/udp 10000:65 
000 
map 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 tcp 

List of active sessions: 
RDR 192.168.3.2     21    <- -> 202.102.245.60  21    [202.102.245.25 
35635] 863 
992 0 407 
MAP 192.168.3.2     1024  <- -> 202.102.245.60  10000 [202.102.245.25 
9999] 8639 
93 0 1f09 
  
  


设置包过滤 

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

block in log quick all with short 
block in log quick all with ipopts 
  
  

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

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

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

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

block in log on fxp1 all 
block out log on fxp1 all 
  
  

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

block in log quick on fxp1 from 10.0.0.0/8 to any 
block in log quick on fxp1 from 192.168.0.0/16 to any 



block in log quick on fxp1 from 172.16.0.0/12 to any 
block in log quick on fxp1 from 127.0.0.0/8 to any 
  
  

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

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

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

pass in quick on fxp1 proto tcp from any to any port = ftp-data keep s 
tate 
pass 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/SA 
block 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请求,防火墙回应网络不可达到的I 
CMP包。 

  上面的例子将屏蔽外部计算机发向网络内部的数据包,但允许内部向外的发 
起网络访问。如果要允许外部网络对内的访问,就必须增加其他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 0 
output packets: blocked 0 passed 74586 nomatch 20316 counted 0 
input packets logged: blocked 227 passed 24883 
output packets logged: blocked 0 passed 17153 
packets logged: input 0 output 0 
log failures: input 25028 output 17139 
fragment state(in): kept 0 lost 0 
fragment state(out): kept 0 lost 0 
packet state(in): kept 1 lost 0 
packet state(out): kept 14 lost 8 
ICMP replies: 160 TCP RSTs sent: 9 
Result cache hits(in): 47523 (out): 53694 
IN Pullups succeeded: 0 failed: 0 
OUT Pullups succeeded: 0 failed: 0 
Fastroute successes: 0 failures: 0 
TCP cksum fails(in): 0 (out): 0 
Packet log flags set: (0x10000000) 
packets passed through filter 
  
  

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

# ipmon -s -n -x 
  
  

  由于ipmon使用的是syslog的local0通道,缺省情况下local0通道并没有打开 
,因此只有很少的错误信息被发送到/var/log/messages文件中。为了打开local 
0通道,还需要改动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,以便每次系统自动启动都能 
执行防火墙设置。 

第三步:我断章取意,在/etc 下新建了ipf.conf文件, 
block in log quick all with short 
block in log quick all with ipopts 
block in log quick all with frag 
block in log quick all with opt lsrr 
block in log quick all with opt ssrr   //以上表示将不合格的数据拦截。 
pass out on net1 all 
pass in on net1 all         //表示net1网卡上的数据都可以通过 
pass in quick on net1 from 192.168.1.0/24 to any 
pass in quick on net0 proto tcp from any to any port = 80 flags S/SA keep state 
pass in quick on net0 proto tcp from any to any port = 23 flags S/SA keep state         //表示只允许net1网卡80和23断口的数据通过 
block in quick on net0 all     //net1网卡上其他数据都拦截。 

第四步:在/etc/rc2.d/目录中创建 S99ipf文件, 
ipf -F a 
ipf -f /etc/ipf.conf 
并执行 /etc/S99ipf 

第五步:用ipfstat命令查看 

其他的nat,日志我都没有装。怎么样,高手给点意见。
阅读(527) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~