您的位置:首页 > 运维架构 > Linux

[转] Linux下防火墙iptables用法规则详及其防火墙配置

2016-10-26 16:09 633 查看
from: http://www.cnblogs.com/yi-meng/p/3213925.html
备注: 排版还不错,建议看以上的链接。

iptables规则

规则--顾名思义就是规矩和原则,和现实生活中的事情是一样的,国有国法,家有家规,所以要遵纪守法的嘛。当然在防火墙上的规则,在内核看来,规则就是决定如何处理一个包的语句。如果一个包符合所有的条件,我们就用相应的处理动作来处理。书写规则的语法格式为:

iptables [-t table] command chains [creteria] -j action

-t table就是表名,filter/nat/mangle三个表中的一个,默认是filter表

command告诉程序如何做,比如:插入一个规则,还是删除等

chains 链,有五个,PREROUTING POSTROUTING INPUT OUTPUT FORWARD

action 处理动作,有ACCEPT DENY DROP REJECT SNAT DNAT

理一下思路



下面一点点的说

一、Tables

选项-t用来指定用哪个表,它可以是下面的任何一个,默认的是filter表



二、COMMANDS

command指定iptables对我们提交的规则要做什么样的操作。这些操作可能是在某个表里增加或删除一些东西,或其他的动作。一下是iptables可用的command(如不做说明,默认表是filter)



和命令结合常用的选项



三、chains

简单说一下五个链的作用:

PREROUTING 是在包进入防火墙之后、路由决策之前做处理

POSTROUTING 是在路由决策之后,做处理

INPUT 在包被路由到本地之后,但在出去用户控件之前做处理

OUTPUT在去顶包的目的之前做处理

FORWARD在最初的路由决策之后,做转发处理

四、匹配条件

4.1 基本匹配



4.2 隐含扩展匹配

这种匹配操作是自动的或隐含的装入内核的。例如使用-p tcp时,不需要再装入任何东西就可以匹配只有IP包才有的特点。隐含匹配针对三种不同的协议,即TCP UDP ICMP。它们分别有一套适用于相应协议的判断标准

TCP匹配 只能匹配TCP包的细节,必须有-p tcp作为前提

--sport port 基于TCP包的源端口来匹配包

--dport port 基于TCP包的目的端口来匹配包

--tcp-flags tcp标志位 有两个参数列表。第一个是指定要检查的标识位;第二个是指定为1的标识位

UDP匹配

--sprot port

--dport port

ICMP匹配

--icmp-type

8 request 请求

0 reply 回复 响应

参考:http://www.cnblogs.com/itech/archive/2011/08/23/2150445.html

Linux 的内置firewall机制,是通过kernel中的netfilter模块实现的(www.netfilter.ort)。Linux kernel使用netfilter对进出的数据包进行过滤,netfilter由三个规则表组成,每个表又有许多内建的链组成。通过使用 iptables命令可以对这些表链进行操作,如添加、删除和列出规则等。

一、Netfilter规则表—filter nat mangle

  filter,用于路由网络数据包。是默认的,也就是说如果没有指定-t参数,当创建一条新规则时,它会默认存放到该表内。

  INPUT 网络数据包流向服务器

  OUTPUT 网络数据包从服务器流出

  FORWARD 网络数据包经服务器路由

  nat,用于NAT表.NAT(Net Address Translation )是一种IP地址转换方法。

  PREROUTING 网络数据包到达服务器时可以被修改

  OUTPUT 网络数据包由服务器流出

  POSTROUTING 网络数据包在即将从服务器发出时可以被修改

  mangle,用于修改网络数据包的表,如TOS(Type Of Service),TTL(Time To Live),等

  INPUT 网络数据包流向服务器

  OUTPUT 网络数据包流出服务器

  FORWARD 网络数据包经由服务器转发

  PREROUTING 网络数据包到达服务器时可以被修改

  POSTROUTING 网络数据包在即将从服务器发出时可以被修改

  1.配置Iptables

  当数据包进入服务器时,Linux Kernel会查找对应的链,直到找到一条规则与数据包匹配。如果该规则的target是ACCEPT,就会跳过剩下的规则,数据包会被继续发送。如果该 规则的target是DROP,该数据包会被拦截掉,kernel不会再参考其他规则。

  Note:如果从始至终都没有一条规则与数据包匹配,而且表末尾又没有drop all的规则,那末该数据包会被accept。Cisco则相反,在表末尾会因含deny all的规则。

1.) Iptables的命令选项
  iptables [-t tables] command option parameter target

  -A 在链尾添加一条规则

  -C 将规则添加到用户定义链之前对其进行检查

  -D 从链中删除一条规则

  -E 重命名用户定义的链,不改变链本身

  -F 清空链,删除链上的所有规则
  -I 在链中插入一条规则

  -L 列出某个链上的规则,如iptables –L INPUT 列出INPUT链的规则

  -N 创建一个新链

  -P 定义某个链的默认策略

  -R 替换链上的某条规则

  -X 删除某个用户相关的链

  -Z 将所有表的所有链的字节和数据包计数器清零

  2.) Iptables的命令参数

  -p -–protocol

  应用于数据包的协议类型,可以是TCP UDP ICMP或ALL。!也可使用。

  当使用-p tcp时,还可使用其他可以选项,以便允许进一步定义规则。选项包括:

  --sport 允许指定匹配数据包源端口.port1:port ,表示port1和port2之间的所有端口

  --dport 目的端口,和--sport雷同。

  当使用-p !udp时,也有特殊的选项供使包括:

  --sport,--dport,与-p tcp 相同,只不过用以用于UDP包。

  使用-p icmp参数时,只有一个选项可用。

  --icmp-type,允许在过滤规则中指定icmp类型。

  -s –-source 指定数据包的源地址。该参数后跟一个IP地址,一个带有sub-net mask的网络地址,或一个主机名。(不建议使用主机名)

  -d,--destination 数据包的目的地址,同-s.

  -j,--jump 用于指定一个target,告诉规则将该匹配的数据包发送到该 target。Target可以是ACCEPT,DROP,QUEUE,RETURN.如果没有-j,那么不会对数据包进行任何操作,只是将计数器加1。

-i --in-interface ,对于INPUT FORWARD PREROUTING链,该参数指定数据包到达服务器时所使用的端口。
  -o --out-interface,对于OUTPUT FORWARD POSTROUTING链,该参数指定数据包离开服务器时使用的端口。

  3.) Iptables的命令target

  创建规则的最后一步是指定Iptables对数据包的操作。只要某一规则匹配该数据包,就不会再有别的规则的操作。内建的target有:ACCEPT DROP QUEUE RETURN。

  ACCEPT:允许数据包通过,到达目的地。
  DROP:拒绝数据包通过,丢弃该包。

  QUEUE:将数据包发送回到用户应用程序处理。

  RETURN:不再根据当前链的其他规则来检查数据包,而是直接返回,继续被发送到其目的地址,或下一个链。

  2.应用Iptables规则示例

  允许WWW

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

  该规则被添加到filter表的INPUT链,允许目的端口是80的数据包。

  在内部接口上允许DHCP

  iptables –A INPUT –i eth0 –p tcp - - sport 68 - -dport 67 ACCEPT

  iptables –A INPUT –i eth0 –p ucp - -sport 68 - -dport 67 ACCEPT

  以上同时允许TCP和UDP协议。

  3.保存和恢复Iptables

  保存Iptables

  使用iptables-save可将现行的iptables规则保存,

  iptables-save > iptables保存路径,如# iptables-save > /etc/iptables.up.rule

  恢复Iptables

  使用iptables-restore 可从配置文档恢复iptables表到现行iptables表.

  iptables-restore < /etc/iptables.up.rule

二、Ubuntu Server中的Iptables

  Ubuntu Server6.06中已经默认安装iptables,版本是1.3.3.默认状态是关闭。

  通过修改/etc/network/interfaces可将iptables打开:

  auto lo

  Iface lo inet loopback

  auto eth0

  iface eth0 inet dhcp

  #添加以下内容

  pre-up iptables-restore < /etc/iptables.up.rule

  #call the restored rule when active the eth0

  post-down iptables-save > /etc/iptables.up.rule

  #restore the iptables rule when shutdown the interface eth0

  然后重新激活eth0即可。

  另外,可随时修改/etc/iptables.up.rule配置文件,来更改iptables的规则。Iptables.up.rule格式如下:

  #Generated by iptables-save V1.3.3 on Tue Jul 31 14:18:44 2007

  *filter

  :INPUT ACCEPT [73:8213]

  :FORWARD ACCEPT [0:0]

  :OUTPUT ACCEPT [8:825]

  -A INPUT –i lo –p icmp –j DROP

  -A INPUT –i eth0 –p icmp –j DROP

  COMMIT

  #Completed on Tue Jul 31 14:10:44 2007

  行与行之间不能有空行。

三.Summary

  iptables表链中每条规则的顺序很重要,如果首条是accept all,那末所有的数据包都会被允许通过firewall,因此应当适当的安排规则顺序。

  通常的法则是:拒绝所有 允许少数.

参考:http://blog.chinaunix.net/uid-20520466-id-1655741.html

linux下IPTABLES配置详解

linux下IPTABLES配置详解
如果你的IPTABLES基础知识还不了解,建议先去看看.
开始配置
我们来配置一个filter表的防火墙.
(1)查看本机关于IPTABLES的设置情况
[root@tp ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain RH-Firewall-1-INPUT (0 references)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 255
ACCEPT esp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT ah -- 0.0.0.0/0 0.0.0.0/0
ACCEPT udp -- 0.0.0.0/0 224.0.0.251 udp dpt:5353
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:631
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:25
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
可以看出我在安装linux时,选择了有防火墙,并且开放了22,80,25端口.
如果你在安装linux时没有选择启动防火墙,是这样的

[root@tp ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
什么规则都没有.
(2)清除原有规则.
不管你在安装linux时是否启动了防火墙,如果你想配置属于自己的防火墙,那就清除现在filter的所有规则.

[root@tp ~]# iptables -F 清除预设表filter中的所有规则链的规则
[root@tp ~]# iptables -X 清除预设表filter中使用者自定链中的规则
我们在来看一下
[root@tp ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
什么都没有了吧,和我们在安装linux时没有启动防火墙是一样的.(提前说一句,这些配置就像用命令配置IP一样,重起就会失去作用),怎么保存.
[root@tp ~]# /etc/rc.d/init.d/iptables save

这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.
[root@tp ~]# service iptables restart

现在IPTABLES配置表里什么配置都没有了,那我们开始我们的配置吧
(3)设定预设规则
[root@tp ~]# iptables -p INPUT DROP
[root@tp ~]# iptables -p OUTPUT ACCEPT
[root@tp ~]# iptables -p FORWARD DROP
上面的意思是,当超出了IPTABLES里filter表里的两个链规则(INPUT,FORWARD)时,不在这两个规则里的数据包怎么处理呢,那就是DROP(放弃).应该说这样配置是很安全的.我们要控制流入数据包
而对于OUTPUT链,也就是流出的包我们不用做太多限制,而是采取ACCEPT,也就是说,不在着个规则里的包怎么办呢,那就是通过.
可以看出INPUT,FORWARD两个链采用的是允许什么包通过,而OUTPUT链采用的是不允许什么包通过.
这样设置还是挺合理的,当然你也可以三个链都DROP,但这样做我认为是没有必要的,而且要写的规则就会增加.但如果你只想要有限的几个规则是,如只做WEB服务器.还是推荐三个链都是DROP.
注:如果你是远程SSH登陆的话,当你输入第一个命令回车的时候就应该掉了.因为你没有设置任何规则.
怎么办,去本机操作呗!
(4)添加规则.
首先添加INPUT链,INPUT链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链
为了能采用远程SSH登陆,我们要开启22端口.
[root@tp ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT (注:这个规则,如果你把OUTPUT 设置成DROP的就要写上这一部,好多人都是望了写这一部规则导致,始终无法SSH.在远程一下,是不是好了.
其他的端口也一样,如果开启了web服务器,OUTPUT设置成DROP的话,同样也要添加一条链:
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT ,其他同理.)
如果做了WEB服务器,开启80端口.
[root@tp ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
如果做了邮件服务器,开启25,110端口.
[root@tp ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
[root@tp ~]# iptables -A INPUT -p tcp --dport 25 -j ACCEPT
如果做了FTP服务器,开启21端口
[root@tp ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
[root@tp ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT
如果做了DNS服务器,开启53端口
[root@tp ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
如果你还做了其他的服务器,需要开启哪个端口,照写就行了.
上面主要写的都是INPUT链,凡是不在上面的规则里的,都DROP
允许icmp包通过,也就是允许ping,
[root@tp ~]# iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话)
[root@tp ~]# iptables -A INPUT -p icmp -j ACCEPT (INPUT设置成DROP的话)

允许loopback!(不然会导致DNS无法正常关闭等问题)
IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP)
IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)

下面写OUTPUT链,OUTPUT链默认规则是ACCEPT,所以我们就写需要DROP(放弃)的链.
减少不安全的端口连接
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 31337 -j DROP
[root@tp ~]# iptables -A OUTPUT -p tcp --dport 31337 -j DROP
有些些特洛伊木马会扫描端口31337到31340(即黑客语言中的 elite 端口)上的服务。既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少你的网络上可能被感染的机器和它们的远程主服务器进行独立通信的机会
还有其他端口也一样,像:31335、27444、27665、20034 NetBus、9704、137-139(smb),2049(NFS)端口也应被禁止,我在这写的也不全,有兴趣的朋友应该去查一下相关资料.

当然出入更安全的考虑你也可以包OUTPUT链设置成DROP,那你添加的规则就多一些,就像上边添加
允许SSH登陆一样.照着写就行了.

下面写一下更加细致的规则,就是限制到某台机器
如:我们只允许192.168.0.3的机器进行SSH连接
[root@tp ~]# iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT
如果要允许,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP.
24表示子网掩码数.但要记得把 /etc/sysconfig/iptables 里的这一行删了.
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 因为它表示所有地址都可以登陆.
或采用命令方式:
[root@tp ~]# iptables -D INPUT -p tcp --dport 22 -j ACCEPT
然后保存,我再说一边,反是采用命令的方式,只在当时生效,如果想要重起后也起作用,那就要保存.写入到/etc/sysconfig/iptables文件里.
[root@tp ~]# /etc/rc.d/init.d/iptables save
这样写 !192.168.0.3 表示除了192.168.0.3的ip地址
其他的规则连接也一样这么设置.

在下面就是FORWARD链,FORWARD链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链,对正在转发链的监控.
开启转发功能,(在做NAT时,FORWARD默认规则是DROP时,必须做)
[root@tp ~]# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@tp ~]# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT
丢弃坏的TCP包
[root@tp ~]#iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP
处理IP碎片数量,防止攻击,允许每秒100个
[root@tp ~]#iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包.
[root@tp ~]#iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
我在前面只所以允许ICMP包通过,就是因为我在这里有限制.
二,配置一个NAT表放火墙
1,查看本机关于NAT的设置情况
[root@tp rc.d]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 192.168.0.0/24 anywhere to:211.101.46.235
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
我的NAT已经配置好了的(只是提供最简单的代理上网功能,还没有添加防火墙规则).关于怎么配置NAT,参考我的另一篇文章
当然你如果还没有配置NAT的话,你也不用清除规则,因为NAT在默认情况下是什么都没有的
如果你想清除,命令是
[root@tp ~]# iptables -F -t nat
[root@tp ~]# iptables -X -t nat
[root@tp ~]# iptables -Z -t nat

2,添加规则
添加基本的NAT地址转换,(关于如何配置NAT可以看我的另一篇文章),
添加规则,我们只添加DROP链.因为默认链全是ACCEPT.
防止外网用内网IP欺骗
[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP
[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP
[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP
如果我们想,比如阻止MSN,QQ,BT等的话,需要找到它们所用的端口或者IP,(个人认为没有太大必要)
例:

禁止与211.101.46.253的所有连接

[root@tp ~]# iptables -t nat -A PREROUTING -d 211.101.46.253 -j DROP

禁用FTP(21)端口
[root@tp ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -j DROP
这样写范围太大了,我们可以更精确的定义.
[root@tp ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -d 211.101.46.253 -j DROP
这样只禁用211.101.46.253地址的FTP连接,其他连接还可以.如web(80端口)连接.

按照我写的,你只要找到QQ,MSN等其他软件的IP地址,和端口,以及基于什么协议,只要照着写就行了.

最后:
drop非法连接
[root@tp ~]# iptables -A INPUT -m state --state INVALID -j DROP
[root@tp ~]# iptables -A OUTPUT -m state --state INVALID -j DROP
[root@tp ~]# iptables-A FORWARD -m state --state INVALID -j DROP
允许所有已经建立的和相关的连接
[root@tp ~]# iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@tp ~]# iptables-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@tp ~]# /etc/rc.d/init.d/iptables save

这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.

[root@tp ~]# service iptables restart

别忘了保存,不行就写一部保存一次.你可以一边保存,一边做实验,看看是否达到你的要求,
上面的所有规则我都试过,没有问题.
写这篇文章,用了我将近1个月的时间.查找资料,自己做实验,希望对大家有所帮助.如有不全及不完善的地方还请提出.
因为本篇文章以配置为主.关于IPTABLES的基础知识及指令命令说明等我会尽快传上,当然你可以去网上搜索一下,还是很多的.

----------------------------------------1111

Linux防火墙介绍
摘 要: 本文介绍了LINUX下常用的防火墙规则配置软件Iptables;从实现原理、配置方法以及功能特点的角度描述了LINUX防火墙的功能
关键字: LINUX防火墙 Iptables Ipchains 包过滤
一 前言:
Linux 为增加系统安全性提供了防火墙保护。防火墙存在于你的计算机和网络之间,用来判定网络中的远程用户有权访问你的计算机上的哪些资源。一个正确配置的防火墙可以极大地增加你的系统安全性。防火墙作为网络安全措施中的一个重要组成部分,一直受到人们的普遍关注。LINUX是这几年一款异军突起的操作系统,以其公开的源代码、强大稳定的网络功能和大量的免费资源受到业界的普遍赞扬。LINUX防火墙其实是操作系统本身所自带的一个功能模块。通过安装特定的防火墙内核,LINUX操作系统会对接收到的数据包按一定的策略进行处理。而用户所要做的,就是使用特定的配置软件(如iptables)去定制适合自己的“数据包处理策略”。
二 防火墙 包过滤:对数据包进行过滤可以说是任何防火墙所具备的最基本的功能,而LINUX防火墙本身从某个角度也可以说是一种“包过滤防火墙”。在LINUX防火墙中,操作系统内核对到来的每一个数据包进行检查,从它们的包头中提取出所需要的信息,如源IP地址、目的IP地址、源端口号、目的端口号等,再与已建立的防火规则逐条进行比较,并执行所匹配规则的策略,或执行默认策略。 值得注意的是,在制定防火墙过滤规则时通常有两个基本的策略方法可供选择:一个是默认允许一切,即在接受所有数据包的基础上明确地禁止那些特殊的、不希望收到的数据包;还有一个策略就是默认禁止一切,即首先禁止所有的数据包通过,然后再根据所希望提供的服务去一项项允许需要的数据包通过。一般说来,前者使启动和运行防火墙变得更加容易,但却更容易为自己留下安全隐患。通过在防火墙外部接口处对进来的数据包进行过滤,可以有效地阻止绝大多数有意或无意地网络攻击,同时,对发出的数据包进行限制,可以明确地指定内部网中哪些主机可以访问互联网,哪些主机只能享用哪些服务或登陆哪些站点,从而实现对内部主机的管理。可以说,在对一些小型内部局域网进行安全保护和网络管理时,包过滤确实是一种简单而有效的手段。
代理:LINUX防火墙的代理功能是通过安装相应的代理软件实现的。它使那些不具备公共IP的内部主机也能访问互联网,并且很好地屏蔽了内部网,从而有效保障了内部主机的安全。
IP伪装:IP伪装(IP Masquerade)是LINUX操作系统自带的又一个重要功能。通过在系统内核增添相应的伪装模块,内核可以自动地对经过的数据包进行“伪装”,即修改包头中的源目的IP信息,以使外部主机误认为该包是由防火墙主机发出来的。这样做,可以有效解决使用内部保留IP的主机不能访问互联网的问题,同时屏蔽了内部局域网。
Linux下的包过滤防火墙管理工具:
在2.0的内核中,采用ipfwadm来操作内核包过滤规则。
在2.2的内核中,采用ipchains来控制内核包过滤规则。
在2.4的内核中,采用一个全新的内核包过滤管理工具——iptables。
包过滤防火墙的工作原理:
使用过滤器。数据包过滤用在内部主机和外部主机之间,过滤系统是一台路由器或是一台主机。过滤系统根据过滤规则原则来决定是否让数据包通过。
过滤的实现。数据包过滤一般使用过滤路由器来实现,这种路由器与普通的路由器有所不同。

包过滤防火墙的工作层次:
应用层 应用层
传输层 传输层
网络层 数据 路由器 数据 网络层
数据链路层 数据链路层 数据链路层
物理层 物理层 物理层
包过滤器操作的基本过程:

包过滤技术的优缺点
优点:
对于一个小型的、不太复杂的站点,包过滤比较容易实现。
因为过滤路由器工作在IP层和TCP层,所以处理包的速度比代理服务器快。
过滤路由器为用户提供了一种透明的服务,用户不需要改变客户端的任何应用程序,也不需要用户学习任何新的东西。
过滤路由器在价格上一般比代理服务器便宜。
缺点:
一些包过滤网关不支持有效的用户认证。
规则表很快会变得很大而且复杂,规则很难测试。随着表的增大和复杂性的增加,规则结构出现漏洞的可能性也会增加。
这种防火墙最大的缺陷是它依赖一个单一的部件来保护系统。
在一般情况下,如果外部用户被允许访问内部主机,则他就可以访问内部网上的任何主机。
包过滤防火墙只能阻止一种类型的IP欺骗,即外部主机伪装内部主机的IP,对于外部主机伪装外部主机的IP欺骗却不可能被阻止,而且它不能防止DNS欺骗。
在Linux系统上,支持包过滤的核心中有三个规则列表,这些列表称为防火墙链。三个链分别称为输入链、输出链和转发链。当一个包通过以太网卡进来后,核心使用输入链决定该包的取舍。如果该包没有被丢弃,则核心要决定下面将向哪里发送包,称为包的路由。如果要发给另一个机器,核心通过转发链来决定。最后,在包要被发出之前,核心通过输出链来做决定。一个链是一些规则的列表。每个规则规定:如果包的包头与规则相匹配,那么对包进行相应的处理。如果该规则与包不匹配,则引入链中的下一个规则。最后,如果没有要引入的规则,核心根据内置链策略决定如何做。在一个有安全意识的系统中,该规则通常告诉核心将包拒绝或丢弃。
在这先介绍Ipchains,之后再介绍Iptables。
Ipchains:
Ipchains 经常使用的命令行格式如下:Ipchains –A chain [–i interface] [–p protocol] [[!] -y][–s source-ip [port]] [-d destination-ip [port]] –j policy [-l]对各选项的说明如下表:-A <chain> 添加一规则到链尾。chain可为input、output、forward。-i <interface> 指定本规则适用的网络接口。通常有eth0、eth1、lo等。-p <protocol> 指定本规则适用的IP协议,如tcp、udp、icmp等。[!] –y -y表明tcp握手中的连接请求标志位SYN; ! –y 表示对该请求的响应。-s src-ip [port] 指明数据包的源IP地址,port表示本规则适用的端口号。-d dst-ip [port] 指明数据包的目的IP地址及端口号。-j policy

; 指定本规则对匹配数据包的处理策略:ACCEPT、DENY或REJECT。-l 在系统日志/var/log/messages中记录与该规则匹配的数据包。
#ipchains –A input –s 201.202.203.58/32 www –p tcp –j DENY地址201.202.203.58送到www(HTTP)端口的任何TCP包都将被屏蔽。先创建一个名为check的新链,然后再把所有发送到输入链的包送到check链:#ipchains –N check#ipchains –A check –s 201.202.203.0/24 –j ACCEPT#ipchains –A check –s !201.202.203.0/24 –j DENY#ipchains –A input –j check系统会接受(只会接受)从201.202.203.0发送的所有软件包,式中感叹号(!)代表的意思是“非”,匹配“非201.202.203.0端口”。禁止telnet(端口23)连接:#ipchains –I forward –s 0.0.0.0 23 –j DENY
Iptables的规则要素:
指定表(table)
指定操作命令(command)
指定链(chains)
指定规则匹配器(matcher)
指定目标动作(target)
表。Iptables从其使用的3个表而得名,分别是filter、nat和mangle。对于包过滤防火墙只使用filter表。表filter是默认的表。
操作命令。包括添加、删除、更新等。
链。对于包过滤防火墙可操作filter表中的INPUT链、OUTPUT链和FORWARD链。也可以操作由用户自己定义的自定义链。
规则匹配器。可以指定各种规则匹配,如IP地址、端口、包类型等。
目标动作。当规则匹配一个包时,真正要执行的任务用目标标识。最常用的内置目标分别是:
ACCEPT表示允许包通过。
DROP表示被丢弃。
REJECT表示拒绝包,丢弃包的同时给发送者发送没有接受的通知。
LOG表示包的有关信息被记录入日志。
TOS表示改写包的ToS的值。
Iptables的语法通常可以简化为:iptables[-t table]CMD[chain][rule-matcher][-j target]其中:table为表名,CMD为操作命令,chain为链名,rule-matcher为规则匹配器,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 将指定链中所有的包字节记数器清零
规则匹配器:
-P,[!]protocol 指定要匹配的协议,可以是tcp、udp、icmp、all。协议名前缀“!”为逻辑非,表示除去该协议之外的所有协议。-s[!]address[/mask] 根据源地址或地址范围确定是否允许或拒绝数据包通过过滤器--sport[!]port[:port] 指定匹配规则的源端口或端口范围。可以用端口好,也可以用/etc/services文件中的文字-d[!]address[/mask] 根据目的地址或地址范围确定是否允许或拒绝数据包通过过滤器--dport[!]port[:port] 指定匹配规则的目的端口或端口范围。可以用端口号,也可以用/etc/services文件中的名字--icmp-type[1]typename 指定匹配规则的ICMP信息类型(可以使用iptables –p icmp –h 查看有效的icmp类型名)
Iptables软件包提供了两个命令分别用于保存和恢复规则集。可以使用命令转储在内存中的内核规则集。其中/etc/sysconfig/iptables是iptables守护进程调用的默认规则集文件:#/sbin/iptables-save>/etc/sysconfig/iptables要恢复原来的规则库,需使用命令:#/sbin/iptables-restore</etc/sysconfog/iptables为了使用得用iptables命令配置的规则在下次启动机器时还能被使用,有两种方法。
使用iptables得启动脚本实现。Iptables的启动脚本/etc/rc.d/init.d/iptables每次启动时都使用/etc/sysconfig/iptables所提供的规则进行规则恢复,并可以使用命令保存规则:#service iptables save
在自定义脚本中用iptables命令直接创建规则集。可以直接用iptables命令编写一个规则脚本,并在启动时执行这个脚本。若规则脚本的文件名为/etc/fw/rules,则可以在启动脚本/etc/rc.d/rc.local中加入的代码:if[-x /etc/fw/rules];then /etc/fw/rules;fi;如果使用此种方式,建议使用ntsysv命令关闭系统的iptables守护进程。

建立包过滤防火墙

  这个网络结构假设内部网有有效的Internet地址。为了将内部网段198.168.80.0/24与Internet隔离,在内部网络和 Internet之间使用了包过滤防火墙。防火墙的网接口是eth1(198.168.80.254),防火墙的Internet接口是eth0 (198.199.37.254)。加外,内网中有3台服务器对外提供服务。分别为:
WWW服务器:IP地址为198.168.80.251
FTP服务器:IP地址为198.168.80.252
E-mail服务器:IP地址为198.168.80.253
防火墙的建立过程
#!/sbin/bash在屏幕上显示信息:echo "Starting iptables rules..."#开启内核转发功能echo "1">;/proc/sys/net/

ipv4/ip_forward#定义变量IPT=/sbin/iptablesWWW-SERVER=198.168.80.251FTP-SERVER=198.168.80.252EMAIL-SERVER=198.168.80.253IP_RANGE="198.168.80.0/24"#刷新所有的链的规则$IPT –F#首先禁止转发任何包,然后再一步步设置允许通过的包#所以首先设置防火墙FORWARD链的策略为DROP$IPT -P FORWARD DROP#下面设置关于服务器的包过滤规则#由于服务器/客户机交互是双向的,所以不仅仅要设置数据包#出去的规则,还要设置数据包返回的规则
(1)WWW服务服务端口为80,采用tcp或udp协议规则为eth0=>;允许目的为内部网WWW服务器的包$IPT -A FORWARD -p tcp -d $WWW-SERVER-dport www -i eth0 -j ACCEPT(2)FTP服务服务端口为21,数据端口20FTP的传输模式有主动和被动之分,FTP服务采用tcp协议规则为:eth0=>;仅允许目的为内部网ftp服务器的包$IPT -A FORWARD -p tcp -d $FTP-SERVER -dport ftp -i eth0 -j ACCEPT(3)EMAIL服务包含两个协议,一个是smtp,另一个是pop3出于安全性考虑,通常只提供对内的pop3服务所以在这里我们只考虑对smtp的安全性问题smtp端口为25,采用tcp协议规则为etho=>;仅允许目的为E-mail服务器的smtp请求$IPT -A FORWARD -p tcp -d $EMAIL-SERVER-dport smtp -i eth0 -j ACCEPT
下面设置针对Internet客户的过滤规则:
本例中防火墙位于网关的位置,所以主要是防止来自Internet的攻击不能防止来自Intranet的攻击假如网络中的服务器都是基于Linux的,也可以在每一部服务器上设置相关的过滤规则来防止来自Internet的攻击
对于Internet对Intranet客户的返回包,定义如下规则:(1)允许Intranet客户采用被动模式访问Internet的FTP服务器$IPT -A FORWARD -p tcp -s 0/0 --sport ftp-data -d $IP_RANGE -i eth0 -j ACCEPT(2)接收来自Internet的非连接请求tcp包$IPT -A FORWARD -p tcp -d 198.168.80.0/24 ! --syn -i eth0 -j ACCEPT(3)接收所有udp包,主要是针对oicq等使用udp的服务$IPT -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT
然后接受来自整个Intranet的数据包过滤,我们定义如下规则$IPT -A FORWARD -s 198.168.80.0/24 -i eth1 -j ACCEPT处理ip碎片接受所有的ip碎片,但采用limit匹配扩展对其单位时间可以通过的ip碎片数量进行限制,以防止ip碎片攻击$IPT -A FORWARD -f -m limit-limit 100/s-limit-burst 100 -j ACCEPT说明:对不管来自哪里的ip碎片都进行限制,允许每秒通过100个ip碎片该限制触发的条件是100个ip碎片设置icmp包过滤ipmp包通常用于网络测试等,故允许所有的icmp包通过但是黑客常常采用icmp进行攻击,如ping of death等所以我们采用limit匹配扩展加以限制$IPT -A FORWARD -p icmp -m limit-limit 1/s-limit-burst 10 -j ACCEPT说明:对不管来自哪里的icmp包都进行限制,允许每秒通过一个包该限制触发的条件是10个包
三 结束语:
对防火墙的不当配置可能造成安全漏洞。如处理TCP分段时,Ipchains需要查看包头中的源端口、目的端口、ICMP代码或“TCP SYN”标志等信息,而这些信息只能在TCP分段的第一个IP包中才有。于是从第二个分段开始都不能匹配过滤规则。某些管理者将防火墙配置为仅对第一个分段进行处理。通常,一个TCP连接的第一个TCP分段被防火墙阻挡后,其他的TCP分段被认为不会产生安全性问题,因为在目的主机上由于缺少第一个分段而无法重新组装报文。然而,由于系统缺陷等原因,发送的分段可能使机器瘫痪,甚至人为精心设计的IP包可借此缺陷绕过防火墙。因此配置防火墙需要仔细分析过滤规则如何处理各种类型的分组。对分段的处理最好将系统内核编译为重新组装所有通过的分段,或在应用层另设安全机制。
对基于包过滤防火墙更常见的攻击是利用IP欺骗的方法。IP欺骗是指主机发送自称是另一个主机发送的包。防止IP欺骗的方法是使用源地址确认,它通过配置路由器识别路由代码实现,而不是防火墙。防火墙结合源地址确认能较好地增强系统的安全性

四 参考文献
《Red Hat Linux 9网络服务》机械工业出版社《Turbolinux 网络管理教程》《Turbolinux 系统管理教程》

参考:http://biyelunwen.yjbys.com/fanwen/jisuanji/368996_3.html

分类: Linux
标签: linux iptables
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: