一、Iptables的定义及相关内容

   iptables 是建立在 netfilter 架构基础上的一个包过滤管理工具,最主要的作用是用来做防火墙或透明代理。Iptables 从 ipchains 发展而来,它的功能更为强大。Iptables 提供以下三种功能:包过滤、NAT(网络地址转换)和通用的 pre-route packet mangling。包过滤:用来过滤包,但是不修改包的内容。Iptables 在包过滤方面相对于 ipchians 的主要优点是速度更快,使用更方便。NAT:NAT 可以分为源地址 NAT 和目的地址 NAT。

   Iptables 可以追加、插入或删除包过滤规则。实际上真正执行这些过虑规则的是 netfilter 及其相关模块(如 iptables 模块和 nat 模块)。Netfilter 是 Linux 核心中一个通用架构,它提供了一系列的 “表”(tables),每个表由若干 “链”(chains)组成,而每条链中可以有一条或数条 “规则”(rule)组成。  

   iptables包含4个表,5个链。其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度。

 1、4个表:

    filter,nat,mangle,raw。

    默认表是filter(没有指定表的时候就是filter表)。

    表的处理优先级:raw>mangle>nat>filter。

    filter:一般的过滤功能

    nat:用于nat功能(端口映射,地址映射等)

    mangle:用于对特定数据包的修改

    raw:有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能

  filter 表的系统 chain: INPUT(输入),FORWAD(向前),OUTPUT(输出)

  nat 表的系统 chain: PREROUTING(预分类),POSTROUTING(路由之后),OUTPUT(输出)

  mangle 表的系统 chain: PREROUTING(预分类),OUTPUT(输出)


 2、5个链:

    PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。

    PREROUTING:数据包进入路由表之前

    INPUT:通过路由表后目的地为本机

    FORWARDING:通过路由表后,目的地不为本机

    OUTPUT:由本机产生,向外转发

    POSTROUTIONG:发送到网卡接口之前。

    



wKiom1ckLC_RPFOAAAC-hQukLGU113.gif


      每一条链中可以有一条或数条规则,每一条规则都是这样定义的:如果数据包头符合这样的条件,就这样处理这个数据包。当一个数据包到达一个链时,系统就会从第一条规则开始检查,看是否符合该规则所定义的条件: 如果满足,系统将根据该条规则所定义的方法处理该数据包;如果不满足则继续检查下一条规则。最后,如果该数据包不符合该链中任一条规则的话,系统就会根据该链预先定义的策略来处理该数据包。


二、IPTABLES 语法:

  表: iptables从其使用的三个表(filter、nat、mangle)而得名, 对包过滤只使用 filter 表,   filter还是默认表,无需显示说明.

  操作命令: 即添加、删除、更新等。

  链:对于包过滤可以针对filter表中的INPUT、OUTPUT、FORWARD链,也可以操作用户自定义的链。

  规则匹配器:可以指定各种规则匹配,如IP地址、端口、包类型等。

  目标动作:当规则匹配一个包时,真正要执行的任务,常用的有:

   ACCEPT: 允许包通过

   DROP: 丢弃包

 一些扩展的目标还有:

 REJECT: 拒绝包,丢弃包同时给发送者发送没有接受的通知;

 LOG: 包有关信息记录到日志;

 TOS: 改写包的TOS值;

 REDIRECT: 重定向;  

   redirect是完全的跳转,浏览器将会得到跳转的地址, 并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,forward更加高效,在forward可以满足需要时,尽量使用Request Dispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用 HttpServletResponse.sendRequest()方法。 

  forward是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址,他是不会改变Request的值,如果你需要在下一个页面中能从中获取新的信息的话,你可以Request.setAttribute()来放置一些标志,这样从下一个页面中获取。

 使FORWARD规则能够生效的2种方法:

 (1)[root@rhlinux root]# vi /proc/sys/net/ipv4/ip_forward

    [root@rhlinux root]# echo "1" > /proc/sys/net/ipv4/ip_forward


 (2)[root@rhlinux root]# vi /etc/sysconfig/network

    [root@rhlinux root]# echo "FORWARD_IPV4=true" > /etc/sysconfig/network

iptables语法格式:

  iptables [-t table] CMD [chain] [rule-matcher] [-j target]

常用操作命令:

   -A 或 -append 在所选链尾加入一条或多条规则

   -D 或 -delete 在所选链尾部删除一条或者多条规则

   -R 或 -replace 在所选链中替换一条匹配规则

   -I 或 -insert 以给出的规则号在所选链中插入一条或者多条规则。如果规则号为1,即在链头部。

   -L 或 -list 列出指定链中的所有规则,如果没有指定链,将列出链中的所有规则。

   -F 或 -flush 清除指定链和表中的所有规则, 假如不指定链,那么所有链都将被清空。

   -N 或 -new-chain 以指定名创建一条新的用户自定义链,不能与已有链名相同。

   -X 或 -delete-chain 删除指定的用户定义帘,必需保证链中的规则都不在使用时才能删除,若没有指定链,则删除所有用户链.

   -P 或 -policy 为永久链指定默认规则(内置链策略),用户定义链没有缺省规则,缺省规则也使规则链中的最后一条规则,用-L显示时它在第一行显示.

   -C 或 -check 检查给定的包是否与指定链的规则相匹配.

   -Z 或 -zero 将指定链中所有的规则包字节(BYTE)计数器清零.

   -h 显示帮助信息.


常用匹配规则器:

  -p , [!] protocol 指出要匹配的协议,可以是tcp, udp, icmp, all, 前缀!为逻辑非,表示除该协议外的所有协议.

  -s [!] address[/mask] 指定源地址或者地址范围.

  -sport [!] port[:port] 指定源端口号或范围,可以用端口号也可以用/ETC/SERVICES文件中的名子.

  -d [!] address[/mask] 指定目的地址或者地址范围.

  -dport [!] port[:port] 指定目的端口号或范围,可以用端口号也可以用/ETC/SERVICES文件中的名子.

  -icmp-type [!] typename 指定匹配规则的ICMP信息类型(可以使用 iptables -p icmp -h 查看有效的ICMP类型名)

  -o [!] interface name[+] 匹配规则的对外网络接口,该选项只针对于OUTPUT,FORWARD,POSTROUTING链是合法的.


如何制定永久规则集:

 /etc/sysconfig/iptables 文件是 iptables 守护进程调用的默认规则集文件.

 可以使用以下命令保存执行过的IPTABLES命令:

   /sbin/iptables-save > /etc/sysconfig/iptables


要恢复原来的规则库,可以使用:

  /sbin/iptables-restore < /etc/sysconfig/iptables

  iptables命令和route等命令一样,重启之后就会恢复,所以:

  [root@rhlinux root]# service iptables save

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

另一种方法是: 

 /etc/rc.d/init.d/iptables 是IPTABLES的启动脚本,所以:

 [root@rhlinux root]# /etc/rc.d/init.d/iptables save

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

三、实例


链基本操作:

  [root@rh34 root]# iptables -L -n

 (列出表/链中的所有规则,包过滤防火墙默认使用的是filter表,因此使用此命令将列出filter表中所有内容,-n参数可加快显示速度,也可不加-n参数。)

  [root@rh34 root]# iptables -F

 (清除预设表filter中所有规则链中的规则)

  [root@rh34 root]# iptables -X

 (清除预设表filter中使用者自定义链中的规则)

 [root@rh34 root]# iptables -Z

 (将指定链规则中的所有包字节计数器清零)

------------------------------------------------------------

设置链的默认策略,默认允许所有,或者丢弃所有:

 [root@rh34 root]# iptables -P INPUT ACCEPT

 [root@rh34 root]# iptables -P OUTPUT ACCEPT

 [root@rh34 root]# iptables -P FORWARD ACCEPT

 (以上我们在不同方向设置默认允许策略,若丢弃则应是DROP,严格意义上防火墙应该是DROP然后再允许特定)

---------------------------------------------------------------

向链中添加规则,下面的例子是开放指定网络接口(信任接口时比较实用):

 [root@rh34 root]# iptables -A INPUT -i eth1 -j ACCEPT

 [root@rh34 root]# iptables -A OUTPUT -o eth1 -j ACCEPT

 [root@rh34 root]# iptables -A FORWARD -i eth1 -j ACCEPT

 [root@rh34 root]# iptables -A FORWARD -o eth1 -j ACCEPT

--------------------------------------------------------------

使用用户自定义链:

 [root@rh34 root]# iptables -N brus

 (创建一个用户自定义名叫brus的链)

 [root@rh34 root]# iptables -A brus -s 0/0 -d 0/0 -p icmp -j DROP

 (在此链中设置了一条规则)

 [root@rh34 root]# iptables -A INPUT -s 0/0 -d 0/0 -j brus

 (向默认的INPUT链添加一条规则,使所有包都由brus自定义链处理)

----------------------------------------------------------------

基本匹配规则实例:


 匹配协议:

 iptables -A INPUT -p tcp

(指定匹配协议为TCP)

 iptables -A INPUT -p ! tcp

(指定匹配TCP以外的协议)


匹配地址:

 iptables -A INPUT -s 192.168.1.1

 (匹配主机)

 iptables -A INPUT -s 192.168.1.0/24

 (匹配网络)

 iptables -A FORWARD -s ! 192.168.1.1

 (匹配以外的主机)

 iptables -A FORWARD -s ! 192.168.1.0/24

 (匹配以外的网络)


匹配接口:

 iptables -A INPUT -i eth0

 iptables -A FORWARD -o eth0

 (匹配某个指定的接口)

 iptables -A FORWARD -o ppp+

 (匹配所有类型为ppp的接口)


匹配端口:

 iptables -A INPUT -p tcp --sport www

 iptables -A INPUT -p tcp --sport 80

 (匹配单一指定源端口)

 iptables -A INPUT -p ucp --dport 53

 (匹配单一指定目的端口)

 iptables -A INPUT -p ucp --dport ! 53

 (指定端口以外)

 iptables -A INPUT -p tcp --dport 22:80

 (指定端口范围,这里我们实现的是22到80端口)

---------------------------------------------------------------------------------

设置扩展的规测匹配:

(希望获得匹配的简要说明,可使用: iptables -m name_of_match --help)

 多端口匹配扩展:

 iptables -A INPUT -p tcp -m multiport --source-port 22,53,80

 (匹配多个源端口)

 iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80

 (匹配多个目的端口)

 iptables -A INPUT -p tcp -m multiport --port 22,53,80

 (匹配多个端口,无论是源还是目的端口)


--------------------------------------------------------------------------------

limit速率匹配扩展:

 [root@redhatlinux9 root]# iptables -A FORWARD -m limit --limit 300/hour

 (表示限制每小时允许通过300个数据包)

 [root@redhatlinux9 root]# iptables -A INPUT -m limit --limit-burst 10

 (--limit-burst指定触发时间的值(默认为5),用来比对瞬间大量数据包的数量。)

 (上面的例子用来比对一次同时涌入的数据包是否超过十个,超过此上限的包将直接被丢弃)

[root@redhatlinux9 root]# iptables -A FORWARD -p icmp -m limit --limit 3/m --limit-burst 3

 (假设均匀通过,平均每分钟3个,那么触发值burst保持为3。如果每分钟通过的包的数目小于3,那么触发值busrt将在每个周期(若每分钟允许通过3个,则周期数为20秒)后加1,但最大值为3。每分钟要通过的包数量如果超过3,那么触发值busrt将减掉超出的数值,例如第二分钟有4个包,那么触发值变为2,同时4个包都可以通过,第三分钟有6个包,则只能通过5个,触发值busrt变为0。之后,每分钟如果包数量小于等于3个,则触发值busrt将加1,如果每分钟包数大于3,触发值busrt将逐渐减少,最终维持为0)

(即每分钟允许的最大包数量等于限制速率(本例中为3)加上当前的触发值busrt数。任何情况下,都可以保证3个包通过,触发值busrt相当于是允许额外的包数量)

iptables命令可用于配置Linux的包过滤规则,常用于实现防火墙、NAT。咋一看iptables的配置很复杂,掌握规律后,其实用iptables完成指定任务并不难,下面我们通过具体实例,学习iptables的详细用法。


四、iptables的详细用法

 1.删除已有规则 

  在新设定iptables规则时,我们一般先确保旧规则被清除,用以下命令清除旧规则:

   iptables -F (or iptables --flush) 


 2.设置chain策略

   对于filter table,默认的chain策略为ACCEPT,我们可以通过以下命令修改chain的策略:

   iptables -P INPUT DROP

   iptables -P FORWARD DROP

   iptables -P OUTPUT DROP

以上命令配置将接收、转发和发出包均丢弃,施行比较严格的包管理。由于接收和发包均被设置为丢弃,当进一步配置其他规则的时候,需要注意针对INPUT和OUTPUT分别配置。当然,如果信任本机器往外发包,以上第三条规则可不必配置。


 3.屏蔽指定ip

  有时候我们发现某个ip不停的往服务器发包,这时我们可以使用以下命令,将指定ip发来的包丢弃:

   BLOCK_THIS_IP="x.x.x.x"

   iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP

   以上命令设置将由x.x.x.x ip发往eth0网口的tcp包丢弃。


 4.配置服务项

  利用iptables,我们可以对日常用到的服务项进行安全管理,比如设定只能通过指定网段、由指定网口通过SSH连接本机:

  iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLESHED -j ACCEPT

  iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

 若要支持由本机通过SSH连接其他机器,由于在本机端口建立连接,因而还需要设置以下规则:

 iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state ESTABLESHED -j ACCEPT

 iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

类似的,对于HTTP/HTTPS(80/443)、pop3(110)、rsync(873)、MySQL(3306)等基于tcp连接的服务,也可以参照上述命令配置。


 对于基于udp的dns服务,使用以下命令开启端口服务:

 iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT

 iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT

 

 5.网口转发配置

 对于用作防火墙或网关的服务器,一个网口连接到公网,其他网口的包转发到该网口实现内网向公网通信,假设eth0连接内网,eth1连接公网,配置规则如下:

 iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

 

 6.端口转发配置

  对于端口,我们也可以运用iptables完成转发配置:

  iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22

以上命令将422端口的包转发到22端口,因而通过422端口也可进行SSH连接,当然对于422端口,我们也需要像以上“4.配置服务项”一节一样,配置其支持连接建立的规则。


 7.DoS***防范

  利用扩展模块limit,我们还可以配置iptables规则,实现DoS***防范:

  iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

--litmit 25/minute 指示每分钟限制最大连接数为25

--litmit-burst 100 指示当总连接数超过100时,启动 litmit/minute 限制


 8.配置web流量均衡

  我们可以将一台服务器作为前端服务器,利用iptables进行流量分发,配置方法如下:

复制代码

iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:80

iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.102:80

iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.103:80

复制代码

以上配置规则用到nth扩展模块,将80端口的流量均衡到三台服务器。


 9.将丢弃包情况记入日志

   使用LOG目标和syslog服务,我们可以记录某协议某端口下的收发包情况。拿记录丢包情况举例,可以通过以下方式实现。

首先自定义一个chain:

iptables -N LOGGING

其次将所有接收包导入LOGGING chain中:

iptables -A INPUT -j LOGGING

然后设置日志前缀、日志级别:

iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7

最后将包倒向DROP,将包丢弃:

iptables -A LOGGING -j DROP

另可以配置syslog.conf文件,指定iptables的日志输出。