您的位置:首页 > 其它

iptables

2016-04-30 12:44 351 查看
一、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:发送到网卡接口之前。





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

二、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的日志输出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iptables