IPTABLES的使用
【实验目的】
1.理解iptables工作机理
2.熟练掌握iptables包过滤命令及规则
3.学会利用iptables对网络事件进行审计
4.熟练掌握iptables NAT工作原理及实现流程
5.学会利用iptables+squid实现Web应用代理
【实验原理】
一.iptables简介
从1.1内核开始,linux就已经具有包过滤功能了,在2.0的内核中我们采用ipfwadm来操作内核包过滤规则。之后在2.2内核中,采用了大家并不陌生的ipchains来控制内核包过滤规则。在2.4内核中我们不再使用ipchains,而是采用一个全新的内核包过滤管理工具—iptables。这个全新的内核包过滤工具将使用户更易于理解其工作原理,更容易被使用,当然也将具有更为强大的功能。
iptables只是一个内核包过滤的工具,iptables可以加入、插入或删除核心包过滤表格(链)中的规则。实际上真正来执行这些过滤规则的是netfilter(Linux内核中一个通用架构)及其相关模块(如iptables模块和nat模块)。
netfilter提供了一系列的“表(tables)”,每个表由若干“链(chains)”组成,而每条链中有一条或数条规则(rule)组成。我们可以这样来理解,netfilter是表的容器,表是链的容器,链又是规则的容器。
netfilter系统缺省的表为“filter”,该表中包含了INPUT、FORWARD和OUTPUT 3个链。每一条链中可以有一条或数条规则,每一条规则都是这样定义的“如果数据包头符合这样的条件,就这样处理这个数据包”。当一个数据包到达一个链时,系统就会从第一条规则开始检查,看是否符合该规则所定义的条件:如果满足,系统将根据该条规则所定义的方法处理该数据包;如果不满足则继续检查下一条规则。最后,如果该数据包不符合该链中任一条规则的话,系统就会根据预先定义的策略(policy)来处理该数据包。
图21-2-1 网络数据包在filter表中的流程
数据包在filter表中的流程如图21-2-1所示。有数据包进入系统时,系统首先根据路由表决定将数据包发给哪一条链,则可能有三种情况:
(1)如果数据包的目的地址是本机,则系统将数据包送往INPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统就会将这个包丢掉。
(2)如果数据包的目的地址不是本机,也就是说,这个包将被转发,则系统将数据包送往FORWARD链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统就会将这个包丢掉。
(3)如果数据包是由本地系统进程产生的,则系统将其送往OUTPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统就会将这个包丢掉。
当我们在使用iptables NAT功能的时候,我们所使用的表不再是“filter”表,而是“nat”表,所以我们必须使用“-t nat”选项来显式地指明。因为系统缺省的表是“filter”,所以在使用filter功能时,我们没有必要显式的指明“-t filter”。
同“filter”表一样,nat表也有三条缺省的链,这三条链也是规则的容器,它们分别是:
(1)PREROUTING:可以在这里定义进行目的NAT的规则,因为路由器进行路由时只检查数据包的目的IP地址,为了使数据包得以正确路由,我们必须在路由之前就进行目的NAT。
(2)POSTROUTING:可以在这里定义进行源NAT的规则,在路由器进行路由之后才进行源NAT。
(3)OUTPUT:定义对本地产生的数据包的目的NAT规则。
二.NAT工作原理
NAT的基本思想是为每个企业分配一个IP地址(或者是很少几个)来进行Internet传输。在企业内部,每个电脑取得一唯一的IP地址来为内部传输做路由。然而,当封包离开企业,进入ISP之后,就需要进行地址转换了。为了使这个方案可行,IP地址的范围被声明为私有的,企业可以随意在内部使用他们。仅有的规则是,没有包含这些地址的封包出现在Internet上。
「说明」 IP私有地址范围是:10.0.0.0~10.255.255.255/8、172.16.0.0 ~172.31.255.255/12、192.168.0.0~192.168.255.255/16。
如图21-2-2所示。在企业内部,每个机器都有一个唯一的172.16.x.y形式的地址。然而,当封包离开企业时,它要经过NAT转盒,NAT盒将内部IP源地址,即图中的172.16.0.50转换成企业的真实地址(这个地址对于Internet来说是可见的),此例中为202.198.168.150。NAT盒通常和防火墙一起绑定在一个设备上,这里的防火墙通过小心地控制进出企业的封包提供了安全保障。
图21-2-2 NAT地址转换
三.iptables常用操作语法
表21-2-1列举出了iptables常用的操作语法。
表21-2-1 iptables常用操作语法
功能 |
命令 |
语法 |
说明 |
添加规则 |
-A |
iptables -A INPUT -p tcp -j ACCEPT |
在所选择的规则链末尾添加规则,当源地址或目的地址是以名字而不是IP地址的形式出现时,这些名字将被解析为多个地址,这条规则将和所有可用的地址结合。 |
删除规则 |
-D |
iptables -D INPUT -p tcp -j ACCEPT |
从所选链中删除规则。有两种方法指定要删除的规则:一种方法是把规则完整定出,另一种方法是指定规则在所选链中的序号(每条链的规则都各自从1被编号)。 |
自定义链重命名 |
-E |
iptables -E customlist userlist |
对自定义的链重命名,原来的名字在前,新名字在后。 |
清空规则 |
-F |
iptables -F INPUT |
清空所选的链,如果没有指定链,则清空指定表中的所有链。默认情况下清空默认表所有的链。 |
插入规则 |
-I |
iptables -I INPUT 1 -p tcp -j ACCEPT |
在指定链内的某个位置插入规则,如果序号为1或没有序号,规则会被插入到的头部。 |
显示规则 |
-L |
iptables -L INPUT |
显示所选链的所有规则,如果没有指定链,则显示指定表中的所有链。默认情况下显示默认表所有的链。精确输出受其它参数影响,如-n和-v等参数。 |
用户自定义链 |
-N |
iptables -N customlist |
根据用户指定的名字建立新的链。所用的名字不能和已有的链、target同名。 |
默认策略 |
-P |
iptables -P INPUT DROP |
为链设置默认的target(ACCEPT、DROP、REJECT、REDIRECT、)。target称作策略,所有不符合规则的包都被强制使用这个策略。只有内建的链才可以使用策略,但内建的链和用户自定义链都不能被作为策略使用。 |
替换规则 |
-R |
iptables -R INPUT 1 -p udp -j ACCETP |
在所选中的链里指定的行上(每条链的规则都各自从1被编号)替换规则。它主要用于试验不同的规则。当源地址或目的地址是以名字而不是IP地址的形式出现时,如果这此名字可以被解析为多个地址,则这条命令会失败。 |
删除用户自定义链 |
-X |
iptables -X customlist |
删除指定的用户自定义链。这条链必须没有被引用,如果被引用,在删除之前你必须删除或者替换与之有关的规则。如果没有给出参数,这条命令将会删除默认表所有非内建的链。 |
计数器归零 |
-Z |
iptables -Z |
把指定链(如未指定则认为所有链)的所有计数器归零。 |
四.常用通用匹配语法
对于任何协议及协议的扩展,通用匹配都可以直接使用。
(1)匹配指定协议。
匹配-p,--protocol/使用iptables -A INPUT -p tcp -j ACCEPT/说明匹配指定的协议,指定协议的形式有以下几种:①名字不分大小写,但必须是在/etc/protocols中定义的;②可以使用协议相应的整数值。例如,ICMP的值是1,TCP是6,UDP是17;③缺少设置ALL,相应数值是,要注意这只代表匹配TCP、UDP、ICMP,而不是/etc/protocols中定义的所有协议;④可以是协议列表,以英文逗号为分隔符,如:udp,tcp;⑤可以在协议前加英文的感叹号表示取反,注意有空格,如:--protocol !tcp表示非TCP协议,也就是UDP和ICMP。可以看出这个取反的范围只是TCP、UDP和ICMP。
(2)以IP源地址匹配包。
匹配-s,--src,--source/使用iptables -A INPUT -s 192.168.0.1 -j ACCEPT/说明以IP源地址匹配包。地址的形式如下:①单个地址,如192.168.0.1,也可写成192.168.0.1/255.255.255.255或192.168.0.1/32;②网络,如192.168.0.0/24,或192.168.0.0/255.255.255.0;③在地址前加英文感叹号表示取反,注意空格,如--source !192.168.0.0/24表示除此地址外的所有地址;④缺省是所有地址。
(3)以IP目的地址匹配包。
匹配-d,--dst,--destination/使用iptables -A INPUT -d 192.168.0.1 -j ACCEPT/说明以IP目的地址匹配包。地址的形式和--source完全一样。
(4)以包进入本地使用的网络接口匹配包。
匹配-i/使用iptables -A INPUT -i eth0 -j ACCEPT/说明以包进入本地所使用的网络接口来匹配包。要注意这个匹配操作只能用于INPUT,FORWARD和PREROUTING这三个链,用在其他任何地方会提示错误信息。指定接口有以下方法:①指定接口名称,如:eth0、ppp0等;②使用通配符,即英文加号,它代表字符数字串。若直接用一个加号,即iptables -A INPUT -i +表示匹配所有的包,而不考虑使用哪个接口。通配符还可以放在某一类接口的后面,如:eth+表示匹配所有从Ethernet接口进入的包;③在接口前加英文感叹号表示取反,如:-i ! eth0意思是匹配来自除eth0外的所有包。
(5)以包离开本地所使用的网络接口来匹配包。
匹配-o/使用iptables -A OUTPUT -o eth1 -j ACCEPT/说明以包离开本地所使用的网络接口来匹配包。要注意这个匹配操作只能用于OUTPUT,FORWARD和POSTROUTING这三个链,用在其他任何地方会提示错误信息。
(6)匹配通信源端口。
匹配--source-port,--sport/使用iptables -A INPUT -p tcp --sport 1111/说明当通信协议为TCP或UDP时,可以指定匹配的源端口,但必须与匹配协议相结合使用。
(7)匹配通信源端口。
匹配-- destination-port,--dport/使用iptables -A INPUT -p tcp --dport 80/说明当通信协议为TCP或UDP时,可以指定匹配的目的端口,但必须与匹配协议相结合使用。
五.iptables功能扩展
1.TCP扩展
iptables可以扩展,扩展分为两种:一种是标准的;另一种是用户派生的。如果指定了“-p tcp”,那么TCP扩展将自动加载,通过--tcp-flags扩展,我们指定TCP报文的哪些Flags位被设置,在其后跟随两个参数:第一个参数代表Mask,指定想要测验的标志位;第二个参数指定哪些位被设置。
例:设置iptables防火墙禁止来自外部的任何tcp主动请求,并对此请求行为进行事件记录。
其中ULOG指定对匹配的数据包进行记录,由日志生成工具ULOG生成iptables防火日志,--log-prefix选项为记录前缀。
2.ICMP扩展
例:设置iptables防火墙允许来自外部的某种类型/代码的ICMP数据包。
其中--icmp-type为扩展命令选项,其后参数可以是三种模式:
(1)ICMP类型名称(例如,host-unreachable)。
(2)ICMP类型值(例如3)。
(3)ICMP类型及代码值(8/0)。
六.状态检测
“状态”的意思是指如果一个数据包是对先前从防火墙发出去的包的回复,则防火墙自动不用检查任何规则就立即允许该数据包进入并返回给请求者,这样就不用设置许多规则定义就可实现应用的功能。
我们可以把请求端与应答端之间建立的网络通信连接称为网络会话,每个网络会话都包括以下信息——源IP地址、目标IP地址、源端口、目的端口,称为套接字对;协议类型、连接状态(TCP协议)和超时时间等。防火墙把这些信息称为状态(stateful)。状态包过滤防火墙能在内存中维护一个跟踪状态的表,比简单的包过滤防火墙具有更大的安全性,而iptables就是一种基于状态的防火墙。命令格式如下:
其中,state表是一个由逗号分割的列表,用来指定连接状态,状态分为4种:
(1)NEW:该包想要建立一个新的连接(重新连接或连接重定向)。
(2)RELATED:该包是属于某个已经建立的连接所建立的新连接。举例:FTP的数据传输连接和控制连接之间就是RELATED关系。
(3)ESTABLISHED:该包属于某个已经建立的连接。
(4)INVALID:该包不匹配于任何连接,通常这些包被DROP。
七.NAT操作
前面提到在iptables防火墙中提供了3种策略规则表:Filter、Mangle和NAT,这3种表功能各不相同,而最为常用的就是filter和nat表。
nat表仅用于NAT,也就是网络地址转换。做过NAT操作的数据包的地址就被改变了,当然这种改变是根据我们的规则进行的。属于流的包只会经过这个表一次,经一个包被允许做NAT,那么余下的包都会自动地做相同的操作。也就是说,余下的包不会再通过这个表一个一个的被NAT,而是自动完成的。常用操作分为以下几类。
(1)SNAT(source network address translation,源网络地址目标转换)。
SNAT是POSTROUTING链表的作用,在封包就要离开防火墙之前改变其源地址,这在极大程度上可以隐藏本地网络或者DMZ等。比如,多个PC机使用路由器共享上网,每个PC机都配置了内网IP(私有IP),PC机访问外部网络的时候,路由器将数据包的报头中的源地址替换成路由器的IP,当外部网络的服务器比如网站Web服务器接到访问请求的时候,它的日志记录下来的路由器的IP,而不是PC机的内网IP,这是因为,这个服务器收到的数据包的报头里边的“源地址”已经被替换了。所以叫做SNAT,基于源地址的地址转换。
例如更改所有来自192.168.0.1/24的数据包的源IP地址为10.0.0.1,其iptables实现为:
(2)DNAT(destination network address translation,目标网络地址转换)。
DNAT是PREROUTING链表的作用,在封包刚刚到达防火墙时改变其目的地址,以使包能够被路由到某台主机。典型的应用是,有个Web服务器放在企业网络DMZ区,其配置了内网IP地址,企业防火墙的的外网接口配置了企业唯一的公网IP,互联网上的访问者使用公网IP来访问这个网站,当访问的时候,客户端发出一个数据包,这个数据包的报头里边,目标地址写的是防火墙的公网IP,然后再把这个数据包发送到DMZ区的Web服务器上,这样,数据包就穿透了防火墙,并从公网IP变成了一个对DMZ区的访问了。所以叫做DNAT,基于目标的网络地址转换。
例如更改所有来自202.98.0.1/24的数据包的目的IP地址为192.168.0.1,其iptables实现为:
(3)REDIRECT(重定向)。
REDIRECT是DNAT的特殊情况是重定向,也就是所谓的Redirection,这时候就相当于将符合条件的数据包的目的IP地址改为数据包进入系统时的网络接口的IP地址。通常是在与squid配置形成透明代理时使用,假设squid的监听端口是3128,我们可以通过以下语句来将来自192.168.0.1/24,目的端口为80的数据包重定向到squid监听:
(4)MASQUERADE(地址伪装)。
在iptables中有着和SNAT相近的效果,但也有一些区别。在使用SNAT的时候,出口IP的地址范围可以是一个,也可以是多个,例如把所有192.168.0.0/24网段数据包SNAT成202.98.0.150/202.98.0.151/202.98.0.152等几个IP然后发出去,其iptables实现为:
SNAT即可以NAT成一个地址,也可以NAT成多个地址。但是,对于SNAT来说不管是几个地址,必须明确指定转换的目标地址IP。假如当前系统用的是ADSL动态拨号方式,那么每次拨号,出口IP都会改变,而且改变的幅度很大,不一定是202.98.0.150到202.98.0.152范围内的地址,这个时候如果使用SNAT的方式来配置iptables就会出现麻烦了,因为每次拨号后出口IP都会变化,而iptables规则内的IP是不会随着自动变化的,每次地址变化后都必须手工修改一次iptables,把规则里边的固定的IP改成新的IP,这样是非常不好用的。
MASQUERADE就是针对这种场景而设计的,它的作用是从防火墙外网接口上自动获取当前IP地址来做NAT,比如下边的命令:
八.防火墙应用代理
1.代理服务器概述
在TCP/IP网络中,传统的通信过程是这样的:客户端向服务器请求数据,服务器响应该请求,将数据传送给客户端,如图21-2-3所示。
图21-2-3 直接访问Internet
在引入了代理服务器以后,这一过程变成了这样:客户端向服务器发起请求,该请求被送到代理服务器;代理服务器分析该请求,先查看自己缓存中是否有请求数据,如果有就直接传递给客户端,如果没有就代替客户端向该服务器发出请求。服务器响应以后,代理服务将响应的数据传递给客户端,同时在自己的缓存中保留一份该数据的拷贝。这样,再有客户端请求相同的数据时,代理服务器就可以直接将数据传送给客户端,而不需要再向该服务器发起请求,如图21-2-4所示。
图21-2-4 通过代理服务器访问Internet
2.代理服务器功能
一般说来,代理服务器具有以下的功能:
(1)通过缓存增加访问速度。
随着Internet的迅猛发展,网络带宽变得越来越珍贵。所以为了提高访问速度,好多ISP都提供代理服务器,通过代理服务器的缓存功能来加快网络的访问速度。一般说来,大多数的代理服务器都支持HTTP缓存,但是,有的代理服务器也支持FTP缓存。在选择代理服务器时,对于大多数的组织,只需要HTTP缓存功能就足够了。
通常,缓存有主动缓存被动缓存之分。所谓被动缓存,指的是代理服务器只在客户端请求数据时才将服务器返回的数据进行缓存,如果数据过期了,又有客户端请求相同的数据时,代理服务器又必须重新发起新的数据请求,在将响应数据传送给客户端时又进行新的缓存。所谓主动缓存,就是代理服务器不断地检查缓存中的数据,一旦有数据过期,则代理服务器主动发起新的数据请求来更新数据。这样,当有客户端请求该数据时就会大大缩短响应时间。对于数据中的认证信息,大多数的代理服务器都不会进行缓存的。
(2)提供用私有IP访问Internet的方法。
IP地址是不可再生的宝贵资源,假如你只有有限的IP地址,但是需要提供整个组织的Internet访问能力,那么,你可以通过使用代理服务器来实现这一点。
(3)提高网络的安全性。
如果内部用户访问Internet都是通过代理服务器,那么代理服务器就成为进入Internet的唯一通道;反过来说,代理服务器也是Internet访问内部网络的唯一通道,如果你没有做反向代理,则对于Internet上的主机来说,你的整个内部网只有代理服务器是可见的,从而大大增强了网络的安全性。
3.传统、透明和反向代理服务器
(1)传统代理服务器。
传统代理常被用于缓存静态网页(例如:html文件和图片文件等)到本地网络上的一台主机上(即代理服务器)。不缓存的页面被第二次访问的时候,浏览器将直接从本地代理服务器那里获取请求数据而不再向原Web站点请求数据。这样就节省了宝贵的网络带宽,而且提高了访问速度。但是,要想实现这种方式,必须在每一个内部主机的浏览器上明确指明代理服务器的IP地址和端口号。客户端上网时,每次都把请求给代理服务器处理,代理服务器根据请求确定是否连接到远程Web服务器获取数据。如果在本地缓存区有目标文件,则直接将文件传给用户即可。如果没有的话则先取回文件,并在本地保存一份缓存,然后将文件发给客户端浏览器。
(2)透明代理服务器。
透明代理与传统代理的功能完全相同。但是,代理操作对客户端浏览器是透明的(即不需指明代理服务器的IP和端口)。透明代理服务器阻断网络通信,并且过滤出访问外部的HTTP(80端口)流量。如果客户端的请求在本地有缓存则将缓存的数据直接发给用户,如果在本地没有缓存则向远程Web服务器发出请求,其余操作和传统代理服务器完全相同。对于Linux操作系统来说,透明代理使用iptables实现。因为不需要对浏览器作任何设置,所以,透明代理对于ISP来说特别有用。
(3)反向代理服务器。
反向代理是和前两种代理完全不同的一种代理服务。使用它可以降低原始Web服务器的负载。反向代理服务器承担了对原始Web服务器的静态页面的请求,防止原始服务器过载。如图21-2-5所示,它位于本地Web服务器和Internet之间,处理所有对Web服务器的请求。如果互联网用户请求的页面在代理器上有缓存的话,代理服务器直接将缓存内容发送给用户。如果没有缓存则先向Web服务器发出请求,取回数据,本地缓存后再发送给用户。这种方式通过降低了向Web服务器的请求数从而降低了Web服务器的负载。
图21-2-5 反向代理服务器位于Internet与组织服务器之间
4.代理服务器squid简介
squid是一个缓存Internet数据的一个开源软件,它会接收用户的下载申请,并自动处理所下载的数据。也就是说,当一个用户要下载一个主页时,他向squid发出一个申请,要求squid替它下载,squid连接申请网站并请求该主页,然后把该主页传给用户同时保留一个备份,当别的用户申请同样的页面时,squid把保存的备份立即传给用户,使用户觉得速度相当快。目前squid可以代理HTTP、FTP、GOPHER、SSL和WAIS协议,暂不能代理POP、NNTP等协议。但是已经有人开始改进squid,相信不久的将来,squid将能够代理这些协议。
squid不是对任何数据都进行缓存。像信用卡账号、可以远方执行的Script、经常变换的主页等是不适合缓存的。squid可以根据用户的需要进行设置,过滤掉不想要的东西。
squid可用在很多操作系统中,如Digital Unix,FreeBSD,HP-UX,Linux,Solaris,OS/2等,也有不少人在其他操作系统中重新编译过squid。
squid对内存有一定的要求,一般不应小于128M,硬盘最好使用服务器专用SCSI硬盘。
squid是一个高性能的代理缓存服务器,和一般的代理缓存软件不同,squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。
squid将数据元缓存在内存中,同时也缓存DNS查询的结果。此外,它还支持非模块化的DNS查询,对失败的请求进行消极缓存。squid支持SSL,支持访问控制。由于使用了ICP(轻量Internet缓存协议),squid能够实现层叠的代理阵列,从而最大限度地节约带宽。
squid由一个主要的服务程序squid,一个DNS查询程序dnsserver,几个重写请求和执行认证的程序,以及几个管理工具组成。当squid启动以后,它可以派生出预先指定数目的dnsserver进程,而每一个dnsserver进程都可以执行单独的DNS查询,这样就减少了服务器等待DNS查询的时间。
5.squid常用配置选项
因为缺省的配置文件不能使squid正常启动服务,所以我们必须首先修改该配置文件的有关内容,才能让squid运行起来。
下面是squid.conf文件的结构。squid.conf配置文件的可以分为13个部分,这13个部分如表21-2-2所示。
表21-2-2 squid常用配置选项
选项 |
说明 |
NETWORK OPTIONS |
有关的网络选项 |
OPTIONS WHICH AFFECT THE NEIGHBOR SELECTION ALGORITHM |
作用于邻居选择算法的有关选项 |
OPTIONS WHICH AFFECT THE CACHE SIZE |
定义cache大小的有关选项 |
LOGFILE PATHNAMES AND CACHE DIRECTORIES |
定义日志文件的路径及cache的目录 |
OPTIONS FOR EXTERNAL SUPPORT PROGRAMS |
外部支持程序选项 |
OPTIONS FOR TUNING THE CACHE |
调整cache的选项 |
TIMEOUTS |
超时 |
ACCESS CONTROLS |
访问控制 |
ADMINISTRATIVE PARAMETERS |
管理参数 |
OPTIONS FOR THE CACHE REGISTRATION SERVICE |
cache注册服务选项 |
HTTPD-ACCELERATOR OPTIONS |
HTTPD加速选项 |
MISCELLANEOUS |
杂项 |
DELAY POOL PARAMETERS |
延时池参数 |
虽然squid的配置文件很庞大,但是如果你只是为一个中小型网络提供代理服务,并且只准备使用一台服务器,则只需要修改配置文件中的几个选项。
6.squid常用命令选项
(1)端口号。
http_port指令告诉squid在哪个端口侦听HTTP请求。默认端口是3128:http_port 3128,如果要squid作为加速器运行则应将它设为80。
你能使用附加http_port行来指定squid侦听在多个端口上。例如,来自某个部门的浏览器发送请求3128,然而另一个部门使8080端口。可以将两个端口号列举出来:
http_port 3128
http_port 8080
squid也可以使http_port指令侦听在指定的接口地址上。squid作为防火墙运行时,它有两个网络接口:一个内部的和一个外部的。你可能不想接受来自外部的http请求。为了使squid仅仅侦听在内部接口上,简单的将IP地址放在端口号前面:
http_port 192.168.1.1:3128
(2)日志文件路径。
默认的日志目录是squid安装位置下的logs目录,其路径是/usr/local/squid/var/logs。
你必须确认日志文件所存放的磁盘位置空间足够。squid想确认你不会丢失任何重要的日志信息,特别是你的系统被滥用或者被攻击时。
squid有三个主要的日志文件:cache.log、access.log和store.log。cache.log文件包含状态性的和调试性的消息。access.log文件包含了对squid发起的每个客户请求的单一行。每行平均约150个字节。假如因为某些理由,你不想squid记录客户端请求日志,你能指定日志文件的路径为/dev/null。store.log文件对大多数cache管理员来说并非很有用。它包含了进入和离开缓存的每个目标的记录。平均记录大小典型的是175-200字节。
如果squid的日志文件增加没有限制。某些操作系统对单个文件强制执行2G的大小限制,即使你有充足的磁盘空间。超过该限制会导致写错误,squid就会退出。
(3)访问控制。
squid默认的配置文件拒绝每一个客户请求。在任何人能使用代理之前,你必须在squid.conf文件里加入附加的访问控制规则。最简单的方法就是定义一个针对客户IP地址的ACL和一个访问规则,告诉squid允许来自这些地址的HTTP请求。squid有许多不同的ACL类型。src类型匹配客户IP地址,squid会针对客户HTTP请求检查http_access规则。
acl MyNetwork src 192.168.0.0/16
http_access allow MyNetwork
请将这些行放在正确的位置。http_access的顺序非常重要。在第一次编辑squid.conf文件时,请看如下注释:
在该注释之后,以及"http_access deny all"之前插入新规则。
(4)命令选项。
这里的很多选项在实际应用中从不会使用,另外有些仅仅在调试问题时有用,如表21-2-3所示。
表21-2-3 命令选项
选项 |
说明 |
-a port |
指定新的http_port 值。该选项覆盖了来自squid.conf 的值。注意,你能在squid.conf里指定多个值。-a 选项仅仅覆盖配置文件里的第一个值。(该选项使用字母a 是因为在Harvest cache 里,HTTP 端口被叫做ASCII 端口) |
-d level |
让squid 将它的调试信息写到标准错误(假如配置了,就是cache.log和syslog)。level参数指定了显示在标准错误里的消息的最大等级。在多数情况下,d1 工作良好。 |
-f file |
指定另一个配置文件。 |
-h |
帮助 |
-k function |
指示squid 执行不同的管理功能。功能参数是下列之一:reconfigure,rotate,shutdown,interrupt,kill,debug, check,or parse。 |
-s |
激活将日志记录到syslog 进程。squid 使用LOCAL4 syslog 设备。 级别调试信息以优先级LOG_WARNING 被记录,1 级别消息以LOG_NOTICE 被记录。更高级的调试信息不会被发送到syslogd.你可以在/etc/syslogd.conf 文件里使用如下接口: local4.warning /var/log/squid.log |
-u port |
指定另一个ICP 端口号,覆盖掉squid.conf 文件里的icp_port。 |
-z |
初始化cache,或者交换,目录。在首次运行squid,或者增加新的cache目录时,你必须使用该选项。 |
-C |
阻止安装某些信号句柄,它们捕获特定的致命信号例如SIGBUS和SIGSEGV。正常的,这些信号被squid 捕获,以便它能干净的关闭。然而,捕获这些信号可能让以后调试问题困难。使用该选项,致命的信号导致它们的默认动作,通常是coredump。 |
-D |
禁止初始化DNS 测试。正常情况下,squid 直到验证它的DNS 可用才能启动。该选项阻止了这样的检测。你也能在squid.conf 文件里改变或删除dns_testnames 选项。 |
-F |
让squid 拒绝所有的请求,直到它重新建立起存储元数据。假如你的系统很忙,该选项可以减短重建存储元数据的时间。然而,如果你的cache 很大,重建过程可能会花费很长的时间。 |
-N |
阻止squid变成后台服务进程。 |
-R |
阻止squid 在绑定HTTP 端口之前使用SO_REUSEADDR 选项。 |
-V |
激活虚拟主机加速模式。类似于squid.conf 文件里的httpd_accel_host virtual 指令。 |
-X |
强迫完整调试模式,如你在squid.conf 文件里指定debug_options ALL,9 一样。 |
-Y |
在重建存储元数据时,返回ICP_MISS_NOFETCH 代替ICP_MISS.忙碌的父cache 在重建时,该选项可以导致最少的负载。 |
【实验步骤】
本练习主机A、B为一组,C、D为一组,E、F为一组。
首先使用“快照X”恢复Linux系统环境。
一.包过滤实验
操作概述:为了应用iptables的包过滤功能,首先我们将filter链表的所有链规则清空,并设置链表默认策略为DROP(禁止)。通过向INPUT规则链插入新规则,依次允许同组主机icmp回显请求、Web请求,最后开放信任接口eth0。iptables操作期间需同组主机进行操作验证。
(1)清空filter链表所有规则链规则。
iptables命令iptables -t filter -F
(2)同组主机使用/opt/ExpNIS/NetAD-Lab/Tools/portscan/nmap工具对当前主机进行端口扫描。
(3)查看INPUT、FORWARD和OUTPUT链默认策略。
iptables命令iptables -t filter -L
(4)将INPUT、FORWARD和OUTPUT链默认策略均设置为DROP。
iptables命令 iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
同组主机利用nmap对当前主机进行端口扫描,查看扫描结果,并利用ping命令进行连通性测试。
(5)利用功能扩展命令选项(ICMP)设置防火墙仅允许ICMP回显请求及回显应答。
ICMP回显请求类型 8 ;代码 。
ICMP回显应答类型 ;代码 。
iptables命令iptables -I INPUT -p icmp --icmp-type 8/0 -j ACCEPT
iptables -I OUTPUT -p icmp --icmp-type 0/0 -j ACCEPT
利用ping指令测试本机与同组主机的连通性。
(6)对外开放Web服务(默认端口80/tcp)。
iptables命令iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I OUTPUT -p tcp --sport 80 -j ACCEPT
同组主机利用nmap对当前主机进行端口扫描,查看扫描结果。
(7)设置防火墙允许来自eth0(假设eth0为内部网络接口)的任何数据通过。
iptables命令iptables -A INPUT -i eth0 -j ACCEPT
iptables -A OUTPUT -o eth0 -j ACCEPT 同组主机利用nmap对当前主机进行端口扫描,查看扫描结果。
二.事件审计实验
操作概述:利用iptables的日志功能检测、记录网络端口扫描事件,日志路径 /var/log/iptables.log。
(1)清空filter表所有规则链规则。
iptables命令iptables -F
(2)根据实验原理(TCP扩展)设计iptables包过滤规则,并应用日志生成工具ULOG对iptables捕获的网络事件进行响应。
iptables命令iptables -I INPUT -p tcp --tcp-flag ALL SYN -j ULOG--ulog-prefix “SYN Request”
(3)同组主机应用端口扫描工具对当前主机进行端口扫描,并观察扫描结果。
(4)在同组主机端口扫描完成后,当前主机查看iptables日志,对端口扫描事件进行审计,日志内容如图21-2-1所示。
图21-2-1 iptables日志内容
三.状态检测实验
操作概述:分别对新建和已建的网络会话进行状态检测。
1.对新建的网络会话进行状态检测
(1)清空filter规则链全部内容。
iptables命令 iptables -F
(2)设置全部链表默认规则为允许。
iptables命令iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
(3)设置规则禁止任何新建连接通过。
iptables命令iptables -A INPUT -m state --state NEW -j DROP
(4)同组主机对当前主机防火墙规则进行测试,验证规则正确性。
2.对已建的网络会话进行状态检测
(1)清空filter规则链全部内容,并设置默认规则为允许。
(2)同组主机首先telnet远程登录当前主机,当出现“login:”界面时,暂停登录操作。
telnet登录命令 telnet 同组主机IP
(3)iptables添加新规则(状态检测)——仅禁止新建网络会话请求。
iptables命令 iptables -A INPUT -m state --state NEW -j DROP
或 iptables -I INPUT -m state --state NEW -j DROP
同组主机续步骤(2)继续执行登录操作,尝试输入登录用户名“guest”及口令“guestpass”,登录是否成功? 成功 。
同组主机启动Web浏览器访问当前主机Web服务,访问是否成功? 不成功 。解释上述现象添加的iptables命令仅对新建会话连接起到阻塞作用,对属于已建立会话连接的数据包不起作用,而telnet会话是已建连接 。
(4)删除步骤(3)中添加的规则。
iptables命令 iptables -D INPUT -m state --state NEW -j DROP
或 iptables -D INPUT 1
(5)同组主机重新telnet远程登录当前主机,当出现“login:”界面时,暂停登录操作。
(6)iptables添加新规则(状态检测)——仅禁止已建网络会话请求。
iptables命令iptables -A INPUT -m state --state ESTABLISHED -j DROP
或 iptables -I INPUT -m state --state ESTABLISHED -j DROP
同组主机续步骤(5)继续执行登录操作,登录是否成功? 。
同组主机启动Web浏览器访问当前主机Web服务,访问是否成功? 。解释上述现象 。
尝试输入登录用户名“guest”及口令“guestpass”,登录是否成功 不成功 。
同组主机启动Web浏览器访问当前主机Web服务,访问是否成功 不成功 。解释上述现象 添加的iptables命令对已建会话连接起到阻塞作用 。
(7)当前主机再次清空filter链表规则,并设置默认策略为DROP,添加规则开放FTP服务,并允许远程用户上传文件至FTP服务器。
iptables命令iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED –j ACCEPT
iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
同组主机尝试上传文件,是否成功?
四.NAT转换实验
实验概述:图21-2-2描述了NAT转换实验所应用的网络拓扑结构。内网主机与NAT服务器eth0接口位于同一网段(内网);外网主机与NAT服务器eth1接口位于同一网络(外网);NAT服务器提供NAT转换。通过设置nat服务器的iptables NAT规则,实现内、外网主机间的通信数据包的地址转换,达到屏蔽内部网络拓扑结构与转发外网主机请求端口的目的(端口重定向)。
「说明」 本实验是在Linux系统下完成,Linux系统默认安装了2块以太网卡,网络接口分别为eth0和eth1,在设置NAT服务前请激活eth1网络接口,命令ifconfig eth1 up。
本步骤由3人为一组进行,其中主机A、C、E为一组,B、D、F为一组。实验角色说明如下:
实验主机 |
实验角色 |
主机A、B |
内网主机 |
主机C、D |
NAT服务器 |
主机E、F |
外网主机 |
实验操作前,实验主机需重置iptables,具体命令如下:
1.确定各接口IP地址
(1)默认内网IP地址192.168.0.0/24、外网IP地址202.98.0.0/24。配置完成内网主机eth0接口IP地址及默认网关(指向NAT服务器内网接口),NAT服务器eth0和eth1接口IP地址,外网主机eth0接口IP地址,并完成下列问题的填写:
内网主机IP192.168.0.50/24,其默认网关192.168.0.150;
外网主机IP202.98.0.50/24;
NAT服务器内网接口IP192.168.0.150/24、外网接口IP202.98.0.150/24 。
(2)内网主机添加静态ARP缓存表项目
NAT服务器作为内网主机访问外网的唯一的安全网关,其IP与MAC地址应被绑定到内网主机的ARP缓存表中,防止内网主机遭受ARP欺骗、IP欺骗等网络行为,添加ARP静态表项命令如下:
例如NAT服务器内网接口的IP地址为192.168.0.50,MAC地址为aa:bb:cc:dd:ee:ff,则添加静态表项的命令为arp -s 192.168.0.50 aa:bb:cc:dd:ee:ff。
(3)内网主机对NAT服务器内网接口进行连通性测试(ping);外网主机对NAT服务器外网接口进行连通性测试(ping)。
2.设置iptables规则允许内部网络访问外部网络
操作流程:首先开启NAT服务器的路由功能(开启网络接口间数据的转发),清空filter链表全部规则,并设置其默认策略为DROP;继续设置规则允许来自内网的数据流进入外网,并允许任何返回流量回到内网(数据转发)。
(1)NAT服务器开启路由功能。
基于安全的考虑,默认情况下Linux路由数据包的功能是关闭的,通过下述命令开启系统路由功能:
(2)清空filter表规则链内容,并设置filter表INPUT、FORWARD和OUTPUT规则链,默认策略为禁止。
iptables命令iptables –F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
(3)添加filter表新规则,允许来自内网的数据流进入外网,并允许任何返回流量回到内网(即实现NAT服务器内部网络接口eth0与外部网络接口eth1间的数据转发)。
iptables -A FORWARD -i eth0 -o eth1 -s 192.168.0.0/24 -d any/0 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
(4)外网主机启动snort(/opt/ExpNIS/NetAD-Lab/Tools/ids/snort)以网络嗅探方式运行(设置过滤器仅监听icmp数据包),snort命令如下:
内网主机ping探测外网主机,是否ping通未ping通?描述snort捕获数据现象捕获到了源地址为内网主机IP、目的地址为外网主机IP的ICMP请求报文,但没有捕获到应答报文 。
外网主机的默认网关指向NAT服务器的外网接口eth1,内网主机再次ping探测外网主机,是否ping通ping通?外网主机停止snort监听(Ctrl+C),观察捕获到的ICMP请求数据,其源IP地址是捕获到的ICMP请求数据源IP地址是内网主机IP地址 ,结合先前实验现象,说明原因:外网主机在未指向默认网关的情况下(同时没有相关路由信息),由于其回显应答的ICMP数据包目的地址为内网主机IP,与本地网络不处于同一网段,所以该数据包被丢弃;相反指定了网关,外网主机会将该包发送给网关,即NAT服务器,NAT服务器将此包路由发送给内网主机。
3.设置iptables规则通过NAT屏蔽内部网络拓扑结构
操作流程:在实现步骤2的操作基础上,继续添加nat表新规则,实现数据包从内网到外网的源地址转换。
(1)添加nat表新规则,通过网络地址转换实现内网主机访问外网。
iptables命令iptables -t nat -A POSTROUTING -o eth1 -s 192.168.0.0/24 -d any/0 -j SNAT --to-source 202.98.0.150
iptables -t nat -A POSTROUTING -m state --state ESTABLISHED,RELATED –j ACCEPT 由于步骤2中已经添加了eth0到eth1的数据转发规则,所以此处不必再填写。
(2)外网主机将默认网关指为空,并重新启动snort捕获ICMP数据。内网主机对外网主机进行ping探测,是否ping通ping 通?外网主机停止snort监听,观察所捕获到ICMP请求数据,其源IP地址是NAT服务器外网接口IP?解释实验象由于NAT服务器对来自内网主机的数据包做了SNAT,即替换数据包源IP地址为外网接口IP,然后再将转换后的数据包发送到外网中。在接收到应答包时,对数据包进行反向转换,即替换数据包的目的IP地址为内网主机IP,然后再将反向转换后的数据包发送到内网中。
4.设置防火墙规则通过NAT实现端口重定向
操作流程:在实现步骤3的操作基础上,继续添加nat表新规则,实现数据从外网到内网的地址转换。
(1)添加nat表新规则,实现80/tcp请求数据从外网到内网的地址转换。
iptables命令iptables -t nat -A PREROUTING -i eth1 –p tcp --dport 80 -s any/0 -d 202.98.0.150 -j DNAT --to-dest 192.168.0.50
iptables -t nat -A PREROUTING -m state --state ESTABLISHED,RELATED -j ACCEPT
(2)完成NAT外网接口eth1到内网接口eth0之间的数据转发。
iptables命令iptables -A FORWARD -i eth1 -o eth0 -s any/0 -d 192.168.0.50 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
(3)NAT服务器停止本机Web服务,具体命令如下:
(4)确定外网主机默认网关指为空,内、外网主机均启动snort,捕获目的端口为80/tcp的数据包;外网主机启动Web浏览器,在地址栏中输入:http://NAT服务器外网接口IP,在成功访问到Web页面后,观察snort捕获数据,回答下列问题:
外网主机观察80/tcp会话的源、目的IP地址对是NAT服务器外网接口IP和外网主机IP内网主机观察80/tcp会话的源、目的IP地址对是外网主机IP和内网主机IP。
外网主机所访问Web页面来源哪台主机 外网主机所访问Web页面来自内网主机?
解释上述实验现象 上述现象的原因是由于NAT服务器对来自外网主机的数据包做了DNAT,即替换数据包目的IP地址(也可替换目的端口)为内网主机IP,然后再将转换后的数据包发送到内网中。在接收到应答包时,对数据包进行反向转换,即替换数据包的源IP地址为NAT服务器外网接口IP,然后再将反向转换后的数据包发送到外网中。
5.允许NAT服务器访问外网主机提供的Web服务
回顾步骤1-4,思考下面的问题:
实验期间表filter的INPUT和OUTPUT规则链默认策略始终为DROP(禁止数据包流入和流出),而步骤中也没有为这两个链表进行任何操作,为什么内、外网主机间访问还会成功呢?
(1)NAT服务器启动Web浏览器,访问外网主机Web服务,是否成功访问不成功?
(2)添加filter表新规则,仅允许NAT服务器本地数据访问外网主机Web服务(80/tcp)
iptables命令iptables -A OUTPUT -o eth1 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
(3)NAT服务器再次访问外网主机Web服务,是否成功访问成功?回答上面的思考问题。
filter表INPUT和OUTPUT规则链仅对本地进程网络通信起作用,换句话说,转发数据和NAT操作不受此规则链限制,因为这时的数据包来源非本地进程。
五.应用代理实验
实验概述:使用iptables+squid方式来实现传统代理、透明代理和反向代理。实验角色说明如下:
实验主机 |
实验角色 |
系统环境 |
主机A、B |
内网客户端 |
Windows |
主机C、D |
代理服务器 |
Linux |
主机E、F |
外网Web服务器 |
Windows |
在进行实验操作前,首先重启iptables服务,并清空防火墙规则。
1.传统代理
(1)外网Web服务器手动分配IP地址,并确认本地Web服务已启动。
(2)代理服务器激活网络接口eth1,并手动分配IP地址,可通过以下两种方式激活eth1:
通过“桌面”|“管理”|“网络”激活eth1,并手动分配IP地址;
在控制台中输入命令ifconfig eth1 up激活eth1,输入命令ifconfig eth1 202.98.X.Y/24为eth1分配IP地址。
(3)代理服务器配置squid。
代理服务器进入目录/usr/local/squid/etc/,使用vim编辑器打开配置文件squid.conf。
在squid.conf中配置如下选项:
(4)运行代理服务器
代理服务器进入目录/usr/local/squid/sbin/,输入命令:./squid –NCd1启动代理服务。
(5)通过代理访问Web服务器
内网客户端打开IE浏览器,通过“工具”|“Internet选项”|“连接”|“局域网设置”选中“为LAN使用代理服务器”,在“地址”中输入代理服务器的内网IP,在“端口”中输入代理服务器的监听端口号,单击“确定”按钮,完成浏览器设置。
内网客户端在IE浏览器地址栏中输入http://外网Web服务器IP地址,即可访问到Web页面。
(6)验证代理服务器的作用
内网客户访问外网Web服务,是否可以访问到页面可以。
外网Web服务器关闭Web服务,代理服务器访问外网Web服务,是否可以访问到页面 不可以。
内网客户端再次访问外网Web服务,是否可以访问到页面可以,为什么?虽然外网Web服务器已关闭,但是代理服务器中还缓存有外网Web服务器的页面,所以内网客户端还可以访问到外网Web服务器的页面。
2.透明代理
(1)外网Web服务器开启Web服务。
(2)代理服务器配置squid。
代理服务器进入目录/usr/local/squid/etc/,使用vim编辑器打开配置文件squid.conf,配置如下选项:
(3)代理服务器添加iptables规则。
对从代理服务器内网接口进入的、基于tcp协议的、目的端口是80的数据包,做“端口重定向”。将数据包重定向到3128端口,命令如下:
(4)运行代理服务器。
(5)通过代理访问Web服务器。
内网客户端将本地连接的“默认网关”设置为代理服务器的内网IP,即代理服务器的eth0网络接口的IP。
内网客户端打开IE浏览器,通过“工具”|“Internet选项”|“连接”|“局域网设置”,取消“为LAN使用代理服务器”。
内网客户端在IE浏览器地址栏输入“http://外网Web服务器的IP”,即可访问到外网Web服务器的Web页面。
3.反向代理
(1)内网客户端开启Web服务。
(2)代理服务器配置squid。
代理服务器进入目录/usr/local/squid/etc/,使用vim编辑器打开配置文件squid.conf,配置如下选项:
(3)停止代理服务器的Web服务。
在代理服务器的终端输入命令:service httpd stop。
(4)删除缓存文件。
删除目录/usr/local/squid/var/cache/00/00下所有文件。
(5)运行代理服务器。
(6)外网通过代理访问内网客户端Web服务
外网Web服务器在IE浏览器地址栏中输入“http://代理服务器外网IP”即可访问到内网客户端的Web页面。
【实验总结】
通过这次实验使我熟悉了对iptables常用命令的认识,对它进行包过滤事件处理的理解,以及如何利用iptables对网络事件进行审计原理的理解,为进一步的学习打下了基础。