Linux防火墙配置(二)-05互联
>

新闻中心 / Linux防火墙配置(二)

Linux防火墙配置(二)

时间:2018/8/5 23:30:41

9.2 iptables主机防火墙

主机防火墙主要用于保护防火墙所在的主机免受外界的攻击,当一台服务器为外界提供比较重要的服务,或者一台客户机在不安全的网络环境中使用时,都需要在计算机上安装防火墙。本节主要介绍iptables主机防火墙规则的配置,包括iptables防火墙的运行与管理、RHEL 5默认防火墙规则的解释、用户根据需要添加自己的防火墙规则等内容。

9.2.1 iptables防火墙的运行与管理

RHEL 5默认安装时,已经在系统中安装了iptables软件包,可以用以下命令查看。

[root@localhost ~]# rpm -qa | grep iptables

iptables-1.3.5-1.2.1

iptables-ipv6-1.3.5-1.2.1

#

一般情况下,iptable开机时都已经默认运行,但与其他一些服务不同,iptables的功能是管理内核中的防火墙规则,不需要常驻内存的进程。如果对防火墙的配置做了修改,并且想保存已经配置的iptables规则,可以使用以下命令。

# /etc/rc.d/init.d/iptables save

此时,所有正在使用的防火墙规则将保存到/etc/sysconfig/iptables文件中,可以用以下命令查看该文件的内容。

# more /etc/sysconfig/iptables

# Generated by iptables-save v1.3.5 on Fri Jan 16 14:58:31 2009

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [2237:2371316]

:RH-Firewall-1-INPUT - [0:0]

-A INPUT -j RH-Firewall-1-INPUT

-A FORWARD -j RH-Firewall-1-INPUT

-A RH-Firewall-1-INPUT -i lo -j ACCEPT

-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT

-A RH-Firewall-1-INPUT -p esp -j ACCEPT

-A RH-Firewall-1-INPUT -p ah -j ACCEPT

-A RH-Firewall-1-INPUT -d 224.0.0.251 -p udp -m udp --dport 5353 -j ACCEPT

-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT

-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 808 -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT

可以看到,/etc/sysconfig/iptables文件中包含了一些iptables规则,这些规则的形式与iptables命令类似,但也有区别。

%注意:一般不建议用户手工修改这个文件的内容,这个文件只用于保存启动iptables时,需要自动应用的防火墙规则。

以上看到的实际上是默认安装RHEL 5时该文件中的内容,其所确定的规则的解释见9.2.2小节。还有一种保存iptables规则的方法是使用iptables-save命令,格式如下:

# iptables-save > abc

此时,正在使用的防火墙规则将保存到abc文件中。如果希望再次运行iptables,可以使用以下命令。

# /etc/rc.d/init.d/iptables start

上述命令实际上是清空防火墙所有规则后,再按/etc/sysconfig/iptables文件的内容重新设定防火墙规则。还有一种复原防火墙规则的命令如下:

# iptables-restore < abc

此时,由iptables-save命令保存在abc文件中的规则将重新载入到防火墙中。如果使用以下命令,将停止iptables的运行。

# /etc/rc.d/init.d/iptables stop

上述命令实际上是清空防火墙中的规则,与“iptables -F”命令类似。此外,/etc/sysconfig目录的iptables-config文件是iptables防火墙的配置文件,去掉注释后的初始内容和解释      如下:

配置1:

IPTABLES_MODULES="ip_conntrack_netbios_ns ip_conntrack_ftp"

功能:当iptables启动时,载入ip_conntrack_netbios_ns和ip_conntrack_ftp两个iptables模块。

配置2:

IPTABLES_MODULES_UNLOAD="yes"

功能:当iptables重启或停止时,是否卸载所载入的模块,yes表示是。

配置3:

IPTABLES_SAVE_ON_STOP="no"

功能:当停止iptables时,是否把规则和链保存到/etc/sysconfig/iptables文件,no表          示否。

配置4:

IPTABLES_SAVE_ON_RESTART="no"

功能:当重启iptables时,是否把规则和链保存到/etc/sysconfig/iptables文件,no表         示否。

配置5:

IPTABLES_SAVE_COUNTER="no"

功能:当保存规则和链时,是否同时保存计数值,no表示否。

配置6:

IPTABLES_STATUS_NUMERIC="yes"

功能:输出iptables状态时,是否以数字形式输出IP地址和端口号,yes表示是。

配置7:

IPTABLES_STATUS_VERBOSE="no"

功能:输出iptables状态时,是否包含输入输出设备,no表示否。

配置8:

IPTABLES_STATUS_LINENUMBERS="yes"

功能:输出iptables状态时,是否同时输出每条规则的匹配数,yes表示是。

9.2.2 RHEL 5开机时默认的防火墙规则

在Linux系统中,可以通过使用iptables命令构建各种类型的防火墙。RHEL 5操作系统默认安装时,iptables防火墙已经安装,并且开机后会自动添加了一些规则,这些规则实际上是由/etc/sysconfig目录中的iptables文件决定的。可以通过“iptables -L”命令查看这些默认添加的规则。

# iptables -L

Chain INPUT (policy ACCEPT)                  #INPUT链中的规则

target                 prot opt source                 destination        

RH-Firewall-1-INPUT all -- anywhere             anywhere       #规则1

Chain FORWARD (policy ACCEPT)             # FORWARD链中的规则

target                 prot opt source                destination         

RH-Firewall-1-INPUT all -- anywhere             anywhere            #规则2

Chain OUTPUT (policy ACCEPT)               # OUTPUT链中的规则

target                 prot opt source               destination        

Chain RH-Firewall-1-INPUT (2 references)    #自定义的RH-Firewall-1-INPUT链
                                            中的规则,被其他链引用两次

target         prot opt source               destination        

ACCEPT     all -- anywhere             anywhere                      #规则3

ACCEPT     icmp -- anywhere             anywhere     icmp any          #规则4

ACCEPT     esp -- anywhere             anywhere                        #规则5

ACCEPT     ah   -- anywhere             anywhere                         #规则6

ACCEPT     udp -- anywhere             224.0.0.251   udp dpt:mdns     #规则7

ACCEPT     udp -- anywhere              anywhere     udp dpt:ipp       #规则8

ACCEPT     tcp -- anywhere             anywhere     tcp dpt:ipp      #规则9

ACCEPT     all -- anywhere anywhere state RELATED,ESTABLISHED #规则10

ACCEPT     tcp -- anywhere anywhere    state NEW tcp dpt:ftp     #规则11

ACCEPT     tcp    -- anywhere anywhere     state NEW tcp dpt:ssh    #规则12

ACCEPT     tcp    -- anywhere   anywhere     state NEW tcp dpt:http #规则13

ACCEPT     tcp    -- anywhere    anywhere    state NEW tcp dpt:smtp #规则14

REJECT     all    -- anywhere      anywhere reject-with icmp-host- 
                                                    prohibited      #规则15

#

由于上面的iptables命令没有用-t选项指明哪一张表,也没有指明是哪一条链,因此默认列出的是filter表中的规则链。由以上结果可以看出,filter表中总共有4条链。其中,INPUT、FORWARD和OUTPUT链是内置的,而RH-Firewall-1-INPUT链是用户自己添        加的。

1.规则列

在前面列出的防水墙规则中,每一条规则列出了5项内容。target列表示规则的动作目标。prot列表示该规则指定的上层协议名称,all表示所有的协议。opt列出了规则的一些选项。source列表示数据包的源IP地址或子网,而destination列表示数据包的目的IP地址或子网,anywhere表示所有的地址。除了上述5列以外,如果存在,每一条规则的最后还要列出一些子选项,如RH-Firewall-1-INPUT链中的规则4等。

如果执行iptables命令时加了-v选项,则还可以列出每一条规则当前匹配的数据包数、字节数,以及要求数据包进来和出去的网络接口。如果加上-n选项,则不对显示结果中的IP地址和端口做名称解析,直接以数字的形式显示。还有,如果加上“--line-number”选项,可以在第一列显示每条规则的规则号。

2.规则解释

INPUT链中的规则1其target列的内容是RH-Firewall-1-INPUT,opt列是all,source和destination列均为anywhere,表示所有的数据包都交给自定义的RH-Firewall-1-INPUT链去处理。FORWARD链的规则2与规则1完全一样。OUTPUT链中没有规则。

在自定义的RH-Firewall-1-INPUT链中,列出了很多的规则,规则3表示接收所有的数据包。需要注意的是,如果在iptables中加-v选项列出这条规则时,将会看到in列是lo,即要求数据包是从环回接口中进来的,而不是任意网络接口进来的数据包都接收。

规则4表示所有icmp数据包都接收,即其他计算机ping本机时,予以接收,而且在OUTPUT链中没有规则,因此本机的ICMP回复数据包也能顺利地进入网络,被对方收到。规则5和规则6表示接收所有的esp和ah协议的数据包,这两种协议属于IPv6协议。

规则7表示目的地址是224.0.0.251,目的端口是mdns的UDP数据包允许通过。224.0.0.251是一种组播地址,mdns是端口号的一种名称。如果执行iptables命令时加了-n选项,则会显示数字5353,它是组播地址的DNS端口。

规则8和规则9表示允许所有目的端口是ipp的UDP和TCP数据包通过,ipp是端口631的名称解析,它是用于网络打印服务的端口。规则10表示所有状态是RELATED和ESTABLISHED的数据包通过,RELATED状态表示数据包要新建一个连接,而且这个要新建的连接与现存的连接是相关的,如FTP的数据连接。ESTABLISHED表示本机与对方建立连接时,对方回应的数据包。

规则11至规则14表示允许目的端口是ftp、ssh、http和smtp,状态是NEW的TCP数据包通过,状态为NEW即意味着这个TCP数据包将与主机发起一个TCP连接。这几条规则的端口对应的都是最常见的网络服务,它们的端口号分别是21、22、80和25。最后一条规则15表示拒绝所有的数据包,并向对方回应icmp-host-prohibited数据包。

3.补充解释

需要再次提醒的是,这些规则是有次序的。当一个数据包进入RH-Firewall-1-INPUT链后,将依次与规则3至规则15进行比较。按照这些规则的目标设置,如果数据包能与规则3至14中的任一条匹配,则该数据包将被接收。如果都不能匹配,则肯定能和规则15匹配,于是数据包被拒绝。

由于RH-Firewall-1-INPUT链是被INPUT链调用的,如果要返回到INPUT链,需要执行名为RETURN的目标动作。

%说明:在FORWARD链中也调用了RH-Firewall-1-INPUT链,即数据包如果不是发送给本机的,当经过FORWARD链时,还要进入RH-Firewall-1-INPUT链,与规则3到规则15再次进行匹配。

9.2.3 管理主机防火墙规则

可以有很多功能种类的防火墙,有些是安装在某一台主机上,主要用于保护主机本身的安全;有些是安装在网络中的某一节点,专门用于保护网络中其他计算机的安全;也有一些可以为内网的客户机提供NAT服务,使内网的客户机共用一个公网IP,以便节省IP地址资源。下面首先介绍一下主机防火墙的应用示例。

当一台服务器为外界提供比较重要的服务,或者一台客户机在不安全的网络环境中使用时,都需要在计算机上安装防火墙,以最大限度地防止主机受到外界的攻击。9.2.2小节介绍的开机时默认的防火墙设置非常典型,用户可以根据自己主机的功能关闭已经开放的端口,或者开放更多的端口,以便允许符合更多规则的数据包通过。

例如,为了使主机能为外界提供telnet服务,除了配置好telnet服务器外,还需要开放TCP23号端口。因为在默认的防火墙配置中,并不允许目的端口为23的TCP数据包进入主机。为了开放TCP23号端口,可以有两种办法,一种是在RH-Firewall-1-INPUT链中加入相应的规则,还有一种是把规则加到INPUT链中。但需要注意的是,规则是有次序的,如果使用以下命令,则是没有效果的。

# iptables -A RH-Firewall-1-INPUT -p tcp --dport 23 -j ACCEPT

上述命令执行后,可以再次查看规则情况。

# iptables -L -n --line-number

Chain RH-Firewall-1-INPUT (2 references)

num target        prot opt source            destination         

11   ACCEPT     tcp -- 0.0.0.0/0        0.0.0.0/0    state NEW tcp dpt:80

12   ACCEPT     tcp -- 0.0.0.0/0        0.0.0.0/0    state NEW tcp dpt:25

13   REJECT     all -- 0.0.0.0/0        0.0.0.0/0   reject-with icmp-host- 
                                                    prohibited

14   ACCEPT     tcp -- 0.0.0.0/0        0.0.0.0/0     tcp dpt:23
                                                    # 新添加的规则

#

可以看到,新添加的规则位于最后的位置。由于所有的数据包都可以与目标动作为REJECT的规则号为13的规则匹配,而REJECT代表的是拒绝,因此数据包到达新添加的规则前肯定已被丢弃,这条规则是不会被使用的。为了解决这个问题,需要把上述规则插入到现有的规则中,要位于规则13的前面。下面是正确的开放TCP23号端口的命令。

# iptables -I RH-Firewall-1-INPUT 11 -p tcp --dport 23 -j ACCEPT

以上命令中,“-I RH-Firewall-1-INPUT 11”表示在RH-Firewall-1-INPUT链原来的规则11前面插入一条新规则,规则内容是接受目的端口为23的TCP数据包。为了删除前面添加的无效规则,可以执行以下命令。

# iptables -D RH-Firewall-1-INPUT 15

15是第一次添加的那条无效规则此时的规则号,也可能是其他的数值,可根据具体显示结果加以改变。如果希望新加的规则与原来的规则11、12等类似,可以执行以下命令。

# iptables -I RH-Firewall-1-INPUT 11 -m state --state NEW -p tcp --dport 23 -j ACCEPT

以上是在RH-Firewall-1-INPUT链中添加规则,以开放TCP23号端口。还有一种开放TCP23号端口的方法是在INPUT链中添加规则,具体命令如下所示。

# iptables -I INPUT 1 -p tcp --dport 23 -j ACCEPT

# iptables -L --line-number

Chain INPUT (policy ACCEPT)

num target               prot opt    source      destination        

1    ACCEPT               tcp --    anywhere    anywhere    tcp dpt:telnet

2    RH-Firewall-1-INPUT   all    --    anywhere   anywhere

%注意:添加的规则也要位于原来规则2的前面,否则,任何数据包都匹配规则2,将会跳到RH-Firewall-1-INPUT链,并且不再回来。因此,添加在规则2后面的规则都是无效的。

前面介绍的是在RHEL5默认防火墙规则的基础上添加用户自己的防火墙规则,以开放TCP23号端口。在很多的时候,用户可能希望从最初的状态开始,构建自己的防火墙。为了从零开始设置iptables防火墙,可以用以下命令清空防火墙中所有的规则。

# iptables -F

然后再根据要求,添加自己的防火墙规则。一般情况下,保护防火墙所在主机的规则都添加在INPUT内置链中,以挡住外界访问本机的部分数据包。本机向外发送的数据包只经过OUTPUT链,一般不予限制。如果不希望本机为外界数据包提供路由转发功能,可以在FORWARD链中添加一条拒绝一切数据包通过的规则,或者干脆在内核中设置不转发任何数据包。

9.2.4 常用的主机防火墙规则

当设置主机防火墙时,一般采取先放行,最后全部禁止的方法。也就是说,根据主机的特点,规划出允许进入主机的外界数据包,然后设计规则放行这些数据包。如果某一数据包与放行数据包的规则都不匹配,则与最后一条禁止访问的规则匹配,被拒绝进入主机。下面列出一些主机防火墙中常用的iptables命令及其解释,这些命令添加的规则都放在filter表的INPUT链中。

示例1:

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

功能:允许目的端口为80的TCP数据包通过INPUT链。

说明:这种数据包一般是用来访问主机的Web服务,如果主机以默认的端口提供Web服务,应该用这条规则开放TCP80端口。

示例2:

iptables -A INPUT -s 192.168.1.0/24 -i eth0 -j DROP

功能:从接口eth0进来的、源IP地址的前3字节为192.168.1的数据包予以丢弃。

说明:需要注意这条规则的位置,如果匹配这条规则的数据包同时也匹配前面的规则,而且前面的规则是放行的,则这条规则对匹配的数据包将不起作用。

示例3:

iptables -A INPUT -p udp --sport 53 --dport 1024:65535 -j ACCEPT

功能:在INPUT链中允许源端口号为53,目标端口号为1024至65535的UDP数据包通过。

说明:这种特点的数据包是当本机查询DNS时,DNS服务器回复的数据包。

示例4:

iptables -A INPUT -p tcp --tcp-flags SYN,RST,ACK SYN -j ACCEPT

功能:SYN、RST、ACK 3个标志位中SYN位为1,其余两个为0的TCP数据包予以放行。符合这种特征的数据包是发起TCP连接的数据包。

说明:“--tcp-flags”子选项用于指定TCP数据包的标志位,可以有SYN、ACK、FIN、RST、URG和PSH共6种。当这些标志位作为“--tcp-flags”的参数时,用空格分成两部分。前一部分列出有要求的标志位,用“,”分隔;后一部分列出要求值为1的标志位,如果有多个,也用“,”分隔,未在后一部分列出的标志位其值要求为0。

%注意:这条命令因为经常使用,可以用“--syn”代替“--tcp-flags SYN,RST,ACK SYN”。

示例5:

iptables -A INPUT -p tcp -m multiport --dport 20:23,53,80,110 -j ACCEPT

功能:接收目的端口为20至23、53、80和110号的TCP数据包。

说明:“-m multiport”用于指定多个端口,最多可以有15项,用“,”分隔。

示例6:

iptables -A INPUT -p icmp -m limit --limit 6/m --limit-burst 8 -j ACCEPT

功能:限制ICMP数据包的通过率,当一分钟内通过的数据包达到8个时,触发每分钟通过6个数据包的限制条件。

说明:以上命令中,除了m表示分以外,还可以用s(秒)、h(小时)和d(天)。这个规则主要用于防止DoS攻击。

示例7:

iptables -A INPUT -p udp -m mac --mac-source ! 00:0C:6E:AB:AB:CC -j DROP

功能:拒绝源MAC地址不是00:0C:6E:AB:AB:CC的UDP数据包。

说明:该规则不应该放在前面,否则,大部分的UDP数据包都将被拒绝,随后的规则将不会使用。

9.2.5 使用图形界面管理主机防火墙规则

为了使初学者也能构建iptables主机防火墙,在RHEL 5中,还为用户提供了配置主机防火墙的图形界面。在RHEL 5桌面环境下,选择“系统”|“管理”|“安全级别和防火墙”命令后,将出现图9-4所示的对话框。

名为“信任的服务”的列表框中列出了常见的网络服务名称,前面打勾的服务所对应的网络端口是开放的,允许外界的用户访问。如果用户需要开放更多的端口,可以在列出的服务名称前的框内单击鼠标,打上勾后再单击“应用”按钮即可。

此外,窗口中还提供了启用或禁用防水墙的选择菜单,如图9-5所示。还有,如果在图9-4中单击了“其他端口”标签,将在下面出现如图9-5所示的一个列表框和“添加”、“删除”按钮,用于添加和删除“信任的服务”列表框中未列出的端口。


并选择TCP或UDP协议,然后单击“确定”按钮,将返回到图9-5所示的防火墙设置对话框,然后在“其他端口”列表框中将出现所添加的端口号和协议名称。单击“删除”按钮可以删除列表框中选中的端口。为了使添加或删除端口生效,需要单击图9-5中的“应用”按钮,此时将出现图9-7所示的对话框,要求用户确认该操作。


以上是通过图形界面管理主机防火墙规则,实际的结果和命令方式是一样的。例如,如果刚才在图9-6所示的窗口中输入8080端口并选择TCP协议,然后再到终端查看防火墙中的规则时,将会发现如下结果。

[root@localhost sysconfig]# iptables -L --line-number

11   ACCEPT     tcp -- anywhere     anywhere   state NEW tcp dpt:http

12   ACCEPT        anywhere    state NEW tcp dpt:smtp

13   ACCEPT     tcp -- anywhere     anywhere   state NEW tcp dpt:webcache

14   REJECT    all -- anywhere   anywhere reject-with icmp-host- 
prohibited

#