以下相关操作基于redhat系统,在其他系统里,相关的文件路径,操作目标等会有变化。

1、服务器上防火墙的安装

      Redhat系统

包括RPM安装方式、YUM安装和源码安装

操作示例:

             rpm–ivh iptables.xxxxx.rpm

             yum–install –y iptables


      Ubuntu/Debian系统

      APT安装,源码安装。

操作示例:

             sudoapt-get install iptables


             ./configure

             make

             makeinstall


检查是否安装,可在终端里执行iptables命令。


2、防火墙的管理

1 )保存规则

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


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


2)查看规则

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


#more /etc/sysconfig/iptables

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

*filter

:INPUTACCEPT [0:0]

:FORWARDACCEPT [0:0]

:OUTPUTACCEPT [2237:2371316]

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

-AINPUT -j RH-Firewall-1-INPUT

-AFORWARD -j RH-Firewall-1-INPUT

-ARH-Firewall-1-INPUT -i lo -j ACCEPT

-ARH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT

-ARH-Firewall-1-INPUT -p esp -j ACCEPT

-ARH-Firewall-1-INPUT -p ah -j ACCEPT

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

-ARH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT

-ARH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT

-ARH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

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

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

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

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

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

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


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


还有一种保存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_nsip_conntrack_ftp"


功能:当iptables启动时,载入ip_conntrack_netbios_nsip_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表示是。



3、防火墙的常见配置

      1)实例入门

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

当一台服务器为外界提供比较重要的服务,或者一台客户机在不安全的网络环境中使用时,都需要在计算机上安装防火墙,以最大限度地防止主机受到外界的攻击。例如,为了使主机能为外界提供ssh服务,除了配置好ssh服务器外,还需要开放TCP 22号端口。因为在默认的防火墙配置中,并不允许目的端口为22TCP数据包进入主机。为了开放TCP22号端口,可以有两种办法,一种是在RH-Firewall-1-INPUT链中加入相应的规则,还有一种是把规则加到INPUT链中。但需要注意的是,规则是有次序的,如果使用以下命令,则是没有效果的。


# iptables -A INPUT -p tcp --dport 22 -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:22

                                                                                          #新添加的规则



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


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


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


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


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


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


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


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

# iptables -L --line-number

Chain INPUT (policy ACCEPT)

num target                prot opt   source        destination        

1   ACCEPT                 tcp  --       anywhere     anywhere tcpdpt:telnet

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

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

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


# iptables -F


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


2)常用的主机防火墙规则

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

示例1


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


功能:允许目的端口为80TCP数据包通过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 --dport1024:65535 -j ACCEPT

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

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


示例4


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


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

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

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


示例5


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


功能:接收目的端口为20235380110号的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:CCUDP数据包。

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




4、课后练习:

1)学会使用man命令查看iptables的使用方法。

2)练习iptables的各种配置规则。

3)遇到问题通过网络搜索相关解决方法。