0%

Iptables详解-快速从理论到实践

本篇文章整理了 Iptables 的基本概念及入门知识,旨在帮助大家快速了解和使用 iptables。

1 什么是Iptables

认识Netfilter

在讲Iptables之前我们必须要先认识一下Netfilter;

Netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活,
可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。

Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:

​- 网络地址转换(Network Address Translate)
- 数据包内容修改
- 数据包过滤防火墙

 Netfilter 平台中制定了数据包的五个挂载点,这5个挂载点分别是PRE_ROUTINGINPUTOUTPUTFORWARDPOST_ROUTING

Netfilter 所设置的规则是存放在内核内存中的,通过 Netfilter 放出的接口来对存放在内核内存中的 XXtables(Netfilter的配置表)进行修改。这个XXtables由表tables,链chains,规则rules组成。

认识Iptables

Iptables 是 Linux 防火墙工作在用户空间的管理工具,用来设置、维护和检查 Linux 内核的 IP 数据包过滤规则.

那么Iptables和Netfilter到底什么关系;

简单来说就是Iptables配置规则,而Netfilter执行规则。

Iptables会把配置好的防火墙策略交给内核层的Netfilter网络过滤器来处理.

2 iptables主要特点

iptables主要特点

- 列出数据包过滤器规则集的内容
- 添加 / 删除 / 修改数据包过滤器规则集中的规则
- 列出 / 清零数据包过滤器规则集的每个规则计数器

基本概念

iptables 可以检测、修改、转发、重定向和丢弃 IP 数据包。
其代码已经内置于内核中,并且按照不同的目的被组织成表(table)的集合。表由一组预先定义的链 (chain) 组成,链包含遍历顺序规则。

每一条规则包含条件匹配和相应的动作(称为目标),如果条件匹配为真,该动作会被执行。

下图简要描述了网络数据包通过 iptables 的过程

当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去.

如果数据包是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它。
本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROUTING链输出.

如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出.

3 四表五链

表(tables)

iptables 包含 4 张表(优先级为:raw > mangle > nat > filter):

   filter 表:用于存放所有有防火墙相关操作的默认表。

   nat 表:用于网络地址转换(例如:DNAT 和 SNAT)

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

   raw 表:用于配置数据包,raw 中的数据包不会被系统跟踪。

在大多数情况下仅需要使用 filter 和 nat,不会用到 raw,mangle,这2张表用于更复杂的情况——包括多路由和路由判定。

链(chains)

链就是位置:共有五个

进路由(PREROUTING)

进系统(INPUT)

转发(FORWARN)

出系统(OUTPUT)

出路由(POSTROUTING)

表由链组成,链是一些按顺序排列的规则的列表。Iptables 一共包含 5 条链:

INPUT 链:用于处理进入本机的数据包

OUTPUT 链:用于处理从本机输出的数据包

FORWARD 链:用于转发数据包

PREROUTING 链:用于在路由决策前对数据包做相关操作,经常用来做 DNAT

POSTROUTING 链:用于在路由决策后对数据包做相关操作,经常用来做 SNAT

filter 表包含 INPUT、OUTPUT 和 FORWARD 3 条内建的链,

nat 表包含 PREROUTING、POSTROUTING 和 OUTPUT 链。

mangle 表包含 PERROUTING、POSTROUTING、INPUT、OUTPUT 和 FORWARD 链。raw 表包含 PREROUTING 和 OUTPUT 链。

默认情况下,任何链中都没有规则。可以向链中添加自己想用的规则。

四表五链之间的关系如图

4 规则

规则(rules)

数据包的过滤基于规则。规则由一个目标(数据包包匹配所有条件后的动作)和很多匹配(导致该规则可以应用的数据包所满足的条件)指定。

一个规则的典型匹配事项是数据包进入的端口(例如:eth0 或者 eth1)、数据包的类型(ICMP、TCP 或者 UDP)和数据包的目的端口。

数据包通过防火墙的时候是按顺序匹配规则的,从上往下依次匹配,一个包不符合某条规则,就会由后面的规则来处理,如果都不符合,就由缺省的规则处理。

规则注意事项:

规则表示一条链上某个表的一些匹配条件,比如拒绝某个 IP 访问

一个链上某个表可以设置多条规则

规则的顺序很重要,一旦有一个规则匹配成功了,后面的规则将会被忽略

如果所有规则没有匹配,那么会有一个默认规则

修改规则的逻辑最好是先删除某条规则,再加入新的规则

iptables 所有的规则都保存在 /etc/sysconfig/iptables

设置了新的规则后,必须使用 service iptables save 进行保存或者使用iptable-save > /etc/sysconfig/iptables,否则重启后,新设置的规则将失效

一个规则中存在多个匹配条件时,这些条件默认规则是与的关系,比如端口,IP必须满足才算匹配

5 处理动作

处理动作(target)

ACCEPT:允许数据包通过。

DROP:直接丢弃数据包,不给任何回应信息。

REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。

REDIRECT:在本机做端口映射。

SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。

MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。

DNAT:目标地址转换。

LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。

6 iptables命令格式

命令格式(options)

iptables -t filter -I INPUT -d 192.168.1.100 -p tcp --dport 80 -j ACCEPT 

语法选项(options)

[-t 表名]:该规则所操作的哪个表,可以使用filter、nat等,如果没有指定则默认为filter

-A:新增一条规则,到该规则链列表的最后一行

-I:插入一条规则,原本该位置上的规则会往后顺序移动,没有指定编号则为1

-D:从规则链中删除一条规则,要么输入完整的规则,或者指定规则编号加以删除

-R:替换某条规则,规则替换不会改变顺序,而且必须指定编号。

-P:设置某条规则链的默认动作

-nL:-L、-n,查看当前运行的防火墙规则列表

chain名:指定规则表的哪个链,如INPUT、OUPUT、FORWARD、PREROUTING等

[规则编号]:插入、删除、替换规则时用,–line-numbers显示号码

[-i|o 网卡名称]:i是指定数据包从哪块网卡进入,o是指定数据包从哪块网卡输出

[-p 协议类型]:可以指定规则应用的协议,包含tcp、udp和icmp等

[-s 源IP地址]:源主机的IP地址或子网地址

[--sport 源端口号]:数据包的IP的源端口号

[-d目标IP地址]:目标主机的IP地址或子网地址

[--dport目标端口号]:数据包的IP的目标端口号

-m:extend matches,这个选项用于提供更多的匹配参数,如:

-m state --state ESTABLISHED,RELATED

-m tcp --dport 22

-m multiport --dports 80,8080

-m icmp --icmp-type 8

<-j 动作>:处理数据包的动作,包括ACCEPT、DROP、REJECT等

ACCEPT:允许数据包通过

DROP:直接丢弃数据包,不给任何回应信息

REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息。

SNAT:源地址转换。在进入路由层面的route之后,出本地的网络栈之前,改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。

MASQUERADE,是SNAT的一种特殊形式,适用于像adsl这种临时会变的ip上

DNAT:目标地址转换。和SNAT相反,IP包经过route之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。

REDIRECT:是DNAT的一种特殊形式,将网络包转发到本地host上(不管IP头部指定的目标地址是啥),方便在本机做端口转发。

LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则

7 常见实例

保存防火墙规则

iptables-save 
#保存防火墙规则

默认查看 filter 表

iptables –nvL –t [filter|nat|mangle|raw]         
#默认查看 filter 表

cat /etc/sysconfig/iptables
#查看已保存的防火墙规则

重启iptables

service iptables restart
#重启iptables

清除 iptables 规则

iptables -F -t [filter|nat|mangle|raw]             
#默认清除 filter 表
清空规则链中的数据包计算器和字节计数器

iptables -Z -t [filter|nat|mangle|raw]             
#默认清除 filter 表

定义规则链中的默认目标(动作)

iptables -P INPUT DROP               
#定义 filter 表的 INPUT 链默认目标为 DROP

iptables -P FORWARD ACCEPT           
#定义 filter 表的 FORWARD 链默认目标为 ACCEPT

iptables -P OUTPUT ACCEPT            
#定义 filter 表的 OUTPUT 链默认目标为 ACCEPT

开放 IP / 协议 / port

iptables -A INPUT -s 192.168.1.100 -j ACCEPT     
#允许源 192.168.1.100 的数据包进入本机

iptables -A INPUT -p ospf -j ACCEPT            
#允许所有 ospf 协议数据包进入本机

iptables -A INPUT -p icmp -j ACCEPT            
#允许所有 icmp 协议数据包进入本机

iptables -A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT      
#允许本地回环

iptables -A INPUT -p tcp --dport 22 -j ACCEPT    
#允许访问 22 端口

iptables -A INPUT -p tcp --dport 80 -j ACCEPT    
#允许访问 80 端口

记录日志

iptables -A PREROUTING -s 172.1.0.0/16 -i eth0 -j LOG  
#所有从 eth0 网卡进入的源 172.1.0.0/16 的数据包记录在 log 日志中

启动网络转发规则

iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127      
#让内网192.168.188.0/24使用公网 IP 210.14.67.127上网

限速

iptables -I INPUT -p tcp -s 192.168.1.100 -m limit --limit=5000/s --limit-burst=100  -j ACCEPT
iptables -I INPUT -p tcp -s 192.168.1.100 -j DROP

参考文章