iptables的安装与配置

iptables默认已经安装好了,可以使用rpm -qa命令查看默认安装了哪些软件

防火墙服务器搭建与应用(2.0)_LINUX

自动加载iptables服务

防火墙服务器搭建与应用(2.0)_端口号_02

也可以使用ntsysv命令,利用文本图形对iptables自动加载进行配置

防火墙服务器搭建与应用(2.0)_防火墙_03

防火墙服务器搭建与应用(2.0)_端口号_04

iptables命令

如果想灵活运用iptables来加固系统安全,就必须熟练掌握iptables的语法格式。格式如下:

iptables 【-t表】 -命令 -匹配  -j动作/目标

1.表选项

-t参数用来指定规则表。内置规则表有三个,分别是:nat、mangle和filter。如果没有指定规则表,则默认使用filter表。各个规则表的功能上已在上节详细讲述过,这里小编就不再重复。

2.命令选项

命令选项用于指定iptables的执行方式,即提交的规则要做什么操作,包括插入规则、删除规则和添加规则等

命令                                                 说明

-A,--append                    添加一条规则到某个规则链中,并且该规则将会成为规则链中的最后一条规则。例如,iptables -A INPUT...

-D,--delete                     从某个规则中删除一条规则。例如,iptables -D INPUT --dport 80 -j DROP  iptables -D INPUT 1

-R,--replace                     取代现行的规则,规则被取代后不改变其顺序。例如,iptables -R INPUT1 -s 192.168.0.1 -j DROP

-I,--insert                       插入一条规则,原本该位置上的规则将会往后移动一个顺位。例如,iptables -I INPUT 1 --dport 80 -j ACCEPT

-L,list                          列出某规则中的所有规则,例如,iptables -L INPUT

-F,--flush                 删除某规则中的所有规则。例如,iptables -F INPUT

-Z,--zero                   将封包计数器归零。例如,iptables -Z INPUT

-N,--new-chain             定义新的规则链。例如,iptables -N tcp_allowed

-X,--delete-chain            删除某个规则链。例如,iptables -X tcp_allowed

-P,--policy                      定义过滤策略。例如,iptables -P INPUT DROP

-E,--rename-chain               修改自定义规则链的名称。例如,iptables -E tcp_allowed disallowed

-P或--policy

作用:定义过滤策略,所有不符合规则的包都被强制使用这个策略

iptables -t filter -P INPUT DROP

说明:只有内建的链才可以使用规则

-A或--append

作用:在选择的链的最后添加一条规则

iptables -A OUTPUT  --sport 22 DROP

-D或--delete

作用:从所选链中删除规则

iptables -D OUTPUT

说明:删除规则的时候可以把规则完整写出来进行删除,就像创建规则时一样,但是更快的方法是指定规则在所选链中的序号。

3.匹配选项

匹配选项指定需要过滤的数据包所具备的条件。即在过滤数据包的时候,iptables根据什么来判断是否允许数据包通过。与规则匹配所应具有的特征包括源地址、目的地址、传输协议和端口号等。

在TCP/IP的网络环境里,大多数数据包所使用的协议不是TCP类型就是UDP类型或ICMP类型。例如ping所使用的就是ICMP协议。匹配选项如下:

匹配                                              说明

-p --protocol                 匹配数据包通信的协议类型。如果要匹配所有类型,则可以使用all关键词。例如,-p all

-s,--src,--source       匹配数据包的源ip地址。例如:-s 192.168.0.0/24,也可以使用“!”运算字进行反向比对,例如,-s ! 192.168.0.0/24

-d,--dst, --destination         匹配数据包的目的ip地址。例如,iptables -A INPUT -d 192.168.1.1

-i,--in --interface                   匹配数据包是从哪片网卡进入的,可以使用通配字符+来做大范围比对,例如:-i eth+表示所有的Ethernet网卡。也可以使用!运算字符进行反向比对,例如,-i ! eth0

-o,--out -interface                匹配数据包要从哪片网卡发送。例如,iptables -A FORWARD -o eth0

--sport,--source-port           匹配数据包的源端口,可以设置一个端口,或是一个范围,例如:--sport22:80,表示22~80端口都算符合条件,如果要比对不连续的多个端口,则必须使用--multiport参数

--dport,--destination-port         匹配数据包的目的端口号。例如,iptables -A INPUT -p tcp --dport 22

--tcp-flags                             匹配TCP数据包的状态标志位。例如,iptables -p tcp --tcp-flags SYN,FIN,ACK SYN

--syn                               匹配是否为要求联机的tcp数据包,与iptables -p tcp --tcp-flags SYN,FIN,ACK SYN的作用完全相同。例如,iptables -p tcp --syn

-mmultiport--source-port            匹配不连续的多个源端口号,一次最多可以匹配15个端口。例如,iptables -A INPUT -p tcp -m mutiport --source-port 22,53,80,110

-mmultiport--destination-port         匹配不连续的多个目的源端口号。例如,iptables -A INPUT -p tcp -m multiport -destination-port 22,53,80,110

-m multiport --port                 匹配源端口号和目的端口号相同的数据包。例如,iptables -A INPUT -p tcp -m multiport --port 22,56,80,110

--icmp-type                       匹配icmp的类型编号,可以使用代码或数字编号来进行比对。例如,iptables -A INPUT -p imcp -icmp-type 8

-m limit --limit                  匹配某些时间内数据包的平均流量(单位时间为秒)。例如,iptables -A INPUT -m limit --limit 3/hour

--limit-burst                匹配瞬间大量数据包的数量。例如,iptables -A INPUT -m limit--limit-burst5

-m mac --mac-source           匹配数据包源网络接口的硬件地址,这个参数不能用在OUTPUT和Postrouting规则链上,这是因为数据包要送出网卡后,才能由网卡驱动程序通过ARP协议查出目的地的Mac地址。例如,iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01

--mark                          匹配数据包是否被表示某个号码,当数据包被匹配成功时,可以通过mark处理动作,将该数据包标识一个号码,不能超过4294967296.例如,iptables -t mangle -A INPUT -m mark --mark  1

-m owner --uid -owener       匹配来自本机的数据包,是否为某些特定使用者产生的,这样可以避免服务器使用root或其它身份将敏感数据传送出去。例如,iptables -A OUTPUT -m owner  --uid-owner 500

-m  owner  --gid-owner        匹配来自本机的数据包,是否为某特定使用者群组所产生的,这样可以避免服务器使用root或其它身份将敏感数据传送出去。例如,iptables -A OUTPUT -m owner --gid-owner 0

-m owner --pid-owner          匹配来自本机的数据包,是否为某些特定行程所产生的。例如,iptables -A OUTPUT -m owner --pid-owner  78

-m owner --sid-owner         匹配来自本机的数据包,是否为某特定联机(Session ID)的响应封包,例如,iptables -A OUTPUT -m owner  --sid-owner  100

-m state --state                      匹配联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW和RELATED。INVALID表示该数据包的联机编号(Session ID)无法辨识或编号不正确。ESTABLISHED表示该数据包属于某个已经建立的联机。NEW表示该数据包要起始一个联机。RELATED表示该数据包属于某个已经建立的联机所建立的新联机。例如,iptables -A INPUT -mstate--state RELATED,ESTABLISHED

-p或--protocol

作用:匹配指定的协议

iptables -A INPUT -p udp -j DROP

说明:设置协议对应的整数值。如,ICMP的值是1,TCP是6,UDP是17.默认设置为ALL,相应数是0,仅代表匹配TCP、UDP和ICMP协议。

-sport或--source-port

作用:基于TCP包的源端口进行匹配,即通过检测数据包的源端口是否所指定的端口来判断数据包的去留。

iptables -A INPUT -sport 80 j ACCEPT

说明:如果不指定此项,则表示针对所有端口。

-s或--src或-source

作用:以IP地址匹配包

iptables -A INPUT -s 1.1.1.1 -j DROP

说明:在地址前加英文感叹号表示取反,要注意空格。如-s! 192.168.0.0/24表示除此以外的所有地址。

4.动作选项

动作选项确定将如何处理符合条件的数据包,其中最为基本的选项有:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK。

(1)ACCEPT

作用:允许符合条件的数据包通过。即接收这个数据包,允许它去往目的地。

(2)DROP

作用:拒绝符合条件的数据包通过,即丢弃该数据包

(3)REJECT

作用:REJECT和DROP都会将数据包丢弃,区别在于REJECT除了丢弃数据包外,还向发送者返回错误信息。

(4)SNAT

作用:进行源网络地址转换,即更换数据包的源IP地址。网络地址转换是一个常用的功能,后面会详细说明。

说明:SNAT只能用在nat表的POSTROUTING链里,只要连接中有一个符合条件的包被执行了此动作,那么这个链接的其他数据包都会自动执行此动作。

(5)DNAT

作用:与SNAT对应,将目的网络地址进行转换,也就是更换数据包的目的IP地址。

说明:DNAT只能用在nat表的PREROUTING和OUTPUT链中,或者用在被这两条链调用的链中,包含DANT的链不能被除此之外的其它链调用,如POSTROUTING。

(6)LOG

作用:用来记录数据包的相关信息,用来帮助排除错误。LOG会返回数据包的有关细节,如IP地址等。

(7)MASQUERADE

作用:和SNAT的作用基本相同,区别在于它不需要指定“--to-source”。MASQUERADE是专门设计用于需要动态获取IP地址的连接的。比如,拨号上网、DHCP等。

防火墙的配置

设置默认策略

在iptables中,所有的内置链都会有一个默认策略。当通过iptables的数据包不符合链中的任何一条规则时,则按默认策略来处理数据包。

定义默认策略的格式如下:

iptables  [-t表名]  -P 链名  动作

将filter 表中INPUT链的默认策略定义为DROP(丢弃数据包)

iptables -P INPUT -j DROP

将nat表中OUTPUT链的默认策略定义为ACCEPT(接收数据包)

iptables -t nat -P OUTPUT -j ACCEPT

查看iptables规则

查看iptables规则的格式如下:

iptables [-t 表名]- L 链名

查看nat表中所有链的规则

#iptables -t  nat  -L

chain  PREOUTING (policy ACCEPT)

target       prot  opt  source             destination


chain  PREOUTING (policy ACCEPT)

target       prot  opt  source             destination


chain  OUTPUT (policy ACCEPT)

target       prot  opt  source             destination

查看filter表中FORWARD链的规则

#iptables -L FORWARD

chain FORWARD (policy ACCEPT)

target     prot  opt  source               destination

RH-Firewall-l-INPUT all-- anywhere                 anywhere

添加、删除、修改规则

为filter表的INPUT链添加一条规则,拒绝所有使用ICMP协议的数据包

#iptables -A INPUT -p icmp -j DROP

查看规则表:

#iptables -L INPUT

Chain INPUT (policy ACCEPT)

target            prot  opt  source                     destination

RH-Firewall-l-INPUT  all  --  anywhere               anywhere

DROP              icmp  --  anywhere                   anywhere

为filter表的INPUT链添加一条规则,允许访问TCP协议的80端口的数据包通过,并查看规则列表:

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

#iptables  -L  INPUT

Chain  INPUT(policy  ACCEPT)

target             prot  opt  source                   destination

RH-Firewall-l-INPUT  all  --  anywhere               anywhere

DROP             icmp  --  anywhere              anywhere

ACCEPT         tcp  --  anywhere                  anywhere        tcp  dpt:http

在filter表中INPUT链的第2条规则前插入一条新规则,不允许访问TCP协议的53端口的数据包通过。

#iptables  -l  INPUT  2  -p  tcp  --  dport  53  -j  DROP

#iptables  -L  INPUT

Chain  INPUT(policy  ACCEPT)

target            prot  opt  source                 destination

RH-Firewall-l-INPUT  all  --  anywhere              anywhere

DROP           tcp  --  anywhere            anywhere              tcp  dpt:domain

DROP            icmp  --  anywhere          anywhere

ACCEPT        tcp  --  anywhere           anywhere            tcp  dpt:http

在filter表中INPUT链的第一条规则前插入一条新规则,允许访问IP地址172.16.0.0/16网段的数据包通过。

#iptables  -I  INPUT  -s  172.16.0.0/16  -j  ACCEPT

#iptables  -L  INPUT

Chain  INPUT(policy  ACCEPT)

target               prot  opt  source                     destination

ACCEPT             all  --  172.16.0.0/16             anywhere

RH-Firewall-l-INPUT  all  --  anywhere             anywhere

DROP                tcp  --  anywhere                 anywhere                 tcp  dpt:domain

DROP                icmp  --  anywhere               anywhere

ACCEPT             tcp  --  anywhere                anywhere                tcp  dpt:http

删除filter表中INPUT链的第二条规则

#iptables  -D  INPUT  -p  icmp  -j  DROP

#iptables  -L  INPUT  

Chain  INPUT(policy  ACCEPT)

target               prot  opt  source              destination

ACCEPT          all  --  172.16.0.0/16          anywhere

RH-Firewall-l-INPUT  all  --  anywhere               anywhere

DROP           tcp  --anywhere                anywhere                tcp  dpt  :domain

ACCEPT        tcp  --  anywhere                anywhere               tcp  dpt:http

清除filter表内INPUT链的所有规则

#iptables  -F  INPUT

#iptables  -L  INPUT

Chain  INPUT  (policy  ACCEPT)

target            prot  opt  source             destination

保存规则与恢复

iptables-save用来保存规则,它的用法比较简单,格式如下:

iptables-save [-c]  [-t  表名]

其中:

-c:保存包和字节计数器的值,使得在重启防火墙后不丢失对包的字节的统计。

-t:选择保存那张表的规则,如果没有-t参数则保存所有的表。

#iptables-save

其中:“*”是表的名字,它后面是该表中的规则集。可以使用重定向命令来保存这些规则集,如下所示。

#iptables-save > /etc/iptables-save

Iptables-restore用来装载由iptables保存的规则集。格式如下:

Iptables-restore [-c] [-n]

其中:

-c:装入包和字节计数器

-n:不覆盖已有的表或表内的规则。默认情况是清除所有已存在的规则。

使用重定向来恢复由iptables-save保存的规则集,如下所示

#iptables-restore >/etc/iptables-save

说明:所有的添加、删除、修改都是临时生效,重新启动系统后,将恢复成原有的配置。如果想使所做的修改在重启系统后生效,则可以使用以下命令来保存。

#iptables-restore > /etc/iptables-save

#service iptables save

禁止客户机访问某些网站

由于网络上有很多不安全的站点,为了使网络更为安全,有必要禁止客户机访问某些网站。通过iptables可以使用域名或IP地址来禁止访问指定的网站。

禁止所有学生访问IP地址为192.1.2.3的网站。

#iptables  -A  FORWARD  -d  192.1.2.3  -j  DROP

#iptables  -L  FORWARD

Chain  FORWARD  (policy  ACCEPT)

target                 prot  opt  source                      destination

RH-Firewall-l-INPUT  all  --  anywhere                           anywhere

DROP                         all  --  anywhere                   192.1.2.3

禁止所有学生访问域名为www.xxx.com的网站

#iptables -A FORWARD  -d  www.xxx.com -j  DROP

禁止客户机使用QQ

有时,需要禁止客户机使用QQ。如在上班时间禁止公司员工上QQ聊天,或在学校上课时间禁止学生上QQ等。要封锁QQ,只要知道QQ使用的服务器地址和端口号就可以了。QQ使用的服务器地址和端口可以从QQ的安装目录下找到。进入QQ安装目录,使用记事本或其它编辑器打开以QQ号码命名子目录下的config.db文件,在该文件中即可看到QQ使用的服务器的地址和端口号。

在config.db文件中找到QQ服务所使用的地址和端口号。QQ通常使用的TCP或UDP协议的8000端口,有些新版的QQ可能使用TCP的的80端口服务器的IP地址,这些服务所对应域名分别为tcpconn.tencent.com、tcpconn2.tencent.com、tcpconn3.tencent.com和tcpconn4.tencent.com。此外,还有VIP会员使用的服务器http.tencent.com和http2.tencent.com。输入的具体命令如下所示。

#iptables -I FORWARD -p tcp  --  dport 8000 -j DROP

#iptables -I FORWARD -p udp  --  dport 8000 -j DROP

#iptables -I FORWARD -d tcpconn.tencent.com -j DROP

#iptables -I FORWARD -d tcpconn2.tencent.com -j DROP

#iptables -I FORWARD -d tcpconn3.tencent.com -j DROP

#iptables -I FORWARD -d tcpconn4.tencent.com -j DROP

#iptables -I FORWARD -d http.tencent.com -j DROP

#iptables -I FORWARD -d http2.tencent.com -j DROP

网络地址转换

iptables利用nat表,将内网地址与外网地址进行转换,可完成内外网的通信。nat表支持以下3中操作。

(1)SNAT:改变数据包的源地址,防火墙会使用外部地址,替换数据包的本地网络地址,是网络内部主机能够与网络外部通信。

(2)DNAT:改变数据包的目的地址。防火墙接收到数据包后,会将该包目的地址进行替换,重新转发到网络内部的主机。当应用服务器处于网络内部时,防火墙接收到外部的请求,会按照规则设定,将访问重定向到指定的主机上,使外部的主机能够正常访问内部的主机。

(3)MASQUERADE:与SNAT一样,但主要用于ISP随机分配的接入外网的地址是不固定的地址的情况。

配置SNAT

SNAT的功能是进行源IP地址转换,也就是重写数据包的源IP地址。若网络内部主机采用共享方式,访问Internet连接时,就需要用到SNAT的功能,将本地IP地址,替换为公网的合法IP地址。

SNAT只能在nat表的POSTROUTING链,并且只要连接的第一个符合条件的包被SNAT进行地址转换,那么这个链接的其他所有的包都会自动地完成地址替换工作,而且这个规则还会应用于这个链接的其它数据包。格式如下:

iptables -t nat -A POSTROUTING -o 网络节后 -j SNAT  --to-source  IP地址

指定替换的IP地址和端口有以下几种方式:

(1)指定单独的地址。如:202.3.2.1

(2)一段连续的地址范围。如202.3.2.1~202.3.2.11,这样会为数据包随机分配一个IP地址,以实现负载均衡。

(3)端口范围。在指定-p  tcp或-p  udp 的前提下,可以指定源端口的范围,如202.3.2.11:1024-10000,这样包的源端口就被限制在1024~10000之内了。

学院内部主机使用10.0.0.0/8网段的IP地址,并且使用linux主机作为服务器连接网络,外网为固定地址192.168.1.3.现在需要修改相关设置保证内网用户能够正常访问Internet

1.开启内核路由转发功能

在内核里打开IP转发功能,如下所示

#echo 1 >/proc/sys/net/ipv4/ip_forward

2.添加SNAT规则

设置规则,将数据包的源地址改为公网地址,如下所示。

#iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to -source  192.168.1.3

#service iptables save

将当前规则保存到 /etc/sysconfig/iptables:                            [确定]

防火墙配置完成后,还要对网络内部客户机添加网关以及DNS服务器地址,才可以正常访问Internet。

配置DNAT

DNAT能够完成目的网络地址的转换。如,企业web服务器在网络内部,其使用私有网络地址,不能在Internet上使用合法IP地址,互联网的其它主机是无法与其直接通信的。使用DNAT,防火墙的80端口接收数据包后,通过转换数据包的目的地址,信息就会转发给内部网络的web服务器

DNAT需要在nat表的PREROUTING链中设置,参数为--to-destination.格式如下:

iptables -t nat -A PREROUTING            -i   网络接口  -p 协议  -dport  端口  -j  DNAT  --  to-destination  IP地址

DNAT能够完成以下功能

1.发布内网服务器

DNAT接收外部的请求数据包,并转发至内部的应用服务器。这个过程是透明的,访问者感觉像直接在内网服务器进行通信一样。

web服务器的IP地址为192.168.1.3,防火墙外部IP地址为202.200.200.10.先需要调整防火墙设置,保证外网用户能够正常访问该服务器。

使用DNAT将发送至202.200.200.10且端口为80的数据包转发至192.168.1.3,如下所示。

#iptables -t nat  -A PREROUTING  -d  202.200.200.10 -p tcp  --dport  80  -j  DNAT --to-destination  192.168.1.3

2.实现负载均衡

如果内部网络存在多台相同应用类型的服务器,就可以使用DNAT,将外部的访问流量分配到多台服务器上,实现负载均衡,减轻服务器的负担。

学院有两台数据相同的web服务器,IP地址分别为10.0.0.10/10.0.0.11,防火墙外部IP地址为202.200.200.10.为了提高页面的响应速度,需要对web服务进行优化。

#iptables  -t  nat  -A  PREROUTING  -d  202.200.200.10  -p  tcp  --  dport  80  -j  DNAT  --to  10.0.0.10-10.0.0.11

MASQUERADE

MASQUERADE和SNAT的作用相同,也是提供源地址转换的操作,但它是针对外部接口为动态IP地址的情况而设计的,不需要使用--to-source指定转换的IP地址。如果网络采用拨号方式接入Internet,而没有对外的表态IP地址,那么,建议使用MASQUERADE.

假设,公司内部网络有200台计算机,网段为192.168.1.0/24,并配有一台拨号主机,使用接口ppp0接入Internet,所有客户端通过该主机访问互联网。这时,需要在拨号主机进行设置,将192.168.1.0/24的内部地址,转换为ppp0的公网地址,如下所示。

#iptables  -t nat  -A  POSTROUTING  -o  ppp0 -s  192.168.1.0/24  -j  MASQUERADE

说明:MASQUERADE是特殊的过滤规则,他只能伪装从一个接口到另一个接口的数据