iptables入门到放弃

iptables简介

iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables。

真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构。

4表5链

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

4个表

filter:一般的过滤功能(默认表是filter,没有指定表的时候就是filter表)。

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

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

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

5个链

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

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

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

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

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

规则表

1.filter表

三个链:INPUT、FORWARD、OUTPUT
作用:过滤数据包

内核模块:iptables_filter


2.Nat表

三个链:PREROUTING、POSTROUTING、OUTPUT
作用:用于网络地址转换(IP、端口)

内核模块:iptable_nat


3.Mangle表

五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS

内核模块:iptable_mangle

4.Raw表

两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理

内核模块:iptable_raw

规则链

1.INPUT——进来的数据包应用此规则链中的策略

2.OUTPUT——外出的数据包应用此规则链中的策略

3.FORWARD——转发数据包时应用此规则链中的策略

4.PREROUTING——对数据包作路由选择前应用此链中的规则
(记住!所有的数据包进来的时侯都先由这个链处理)

5.POSTROUTING——对数据包作路由选择后应用此链中的规则
(所有的数据包出来的时侯都先由这个链处理)

优先级

规则表之间的优先顺序:
Raw——mangle——nat——filter


规则链之间的优先顺序(分三种情况):

第一种情况:入站数据流向
    从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。

第二冲情况:转发数据流向
    来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

第三种情况:出站数据流向
     防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

引用马哥的一张图:

语法

iptables [-t TABLE] 命令CHAIN [num] 匹配条件 -j 处理办法

命令

查看类

-L:显示指定表中的规则。

-L的选项:

-n:以数字格式显示主机的地址和端口号。

-v:显示链及规则的详细信息。

-vvv:更详细的显示链和规则的信息。

-x:显示计数器的精确值。

--line-numbers:显示规则号码。

管理规则类

-A:附加一条规则,添加在链的尾部。

-I CHAIN [num]:插入一条规则,插入为对应CHAIN上的第num条。

-D CHAIN [num]:删除指定链中的第num条规则。

-R CHAIN [num]:替换指定链中的第num条规则。

管理链类

-F [CHAIN]:flush,清空指定规则链,如果省略CHAIN,则清空对应表中的所有链。

-P CHAIN:设定指定链的默认策略,一般我们会设置默认策略为DROP。

-N:自定义一个新的空链。

-X:删除一个自定义的空链。

-Z:置零指定链中所有规则的计数器。

-E:重命名自定义链。

匹配条件

通用匹配

-s,--src:指定源地址

-d,--dst:指定目标地址

-p  {tcp|udp|icmp}:指定协议

-i  INTERFACE:指定数据报文流入的接口。例如:-i eth0

  可用于定义标准的链:PREROUTING,INPUT,FORWARD

-o  INTERFACE:指定数据报文流出的接口。

  可用于定义标准的链:OUTPUT,POSTROUTING,FORWARD

扩展匹配

隐含扩展

不用特别指明由哪个模块进行的扩展,因为此时使用-p {tcp|udp|icmp}。

-p tcp

  --sport PORT:源端口

  --dport PORT:目标端口

  --tcp-flags mask comp:

只检查mask指定的标志位,是逗号分隔的标志位列表;

comp:此列表中出现的标记位必须为1;

cmp中没出现,而mask中出现的,必须为0;

例如:--tcp-flags  SYN,ACK,PIN,RST  SYN  意思是匹配SYN为1,其他的ACK,PIN,RST为0的包,即三次握手中第一次握手的包。

  --syn:匹配三次握手中第一次握手的包。

-p udp

  --sport PORT:源端口

  --dport PORT:目标端口

-p icmp

  --icmp-type

    0:echo-reply,应答包

    8:echo-request,请求包

显示扩展

必须指定由哪个模块进行的扩展,在iptables中使用-m选项可以完成此功能。

格式:

-m EXTESTION --spe-option

-m state:状态扩展

结合ip_conntrack追踪会话的状态

--state

  NEW:新连接请求

  ESTABLISHED:已建立的连接

  INVALID:非法连接(SYN=1,FIN=1)

  RELATED:相关联的(用命令激活的连接,例如:ftp)

例如:-m state --state NEW,ESTABLISHED -j ACCEPT

-m multiport:多端口扩展

--source-ports:源端口

--destination-ports:目标端口

--ports:源或者目标端口

例如:-m multiport --destination-ports 21,22,80 -j ACCEPT

-m iprange:ip地址范围

--src-range:源ip地址范围

--dst-range:目标ip地址范围

-m connlimit:连接数限制

--connlimit-above  n:链接数上限,一般结合!使用,标识不能超过n个连接数。

-m limit:速率限制

--limit RATE:连接数的速率。例如:3/second意思是限制每秒钟3个连接,3/minute每分钟3个连接。

--limit-burst N:蜂拥而至的连接数上限为N。

-m string:匹配字符串

--algo {bm|kmp}:算法,二选一即可。

--string “string”:匹配的字符串。

-m time

--datestart:开始日期

--datestop:结束日期

--timestart:开始时间

--timestop:结束时间

未完待补充。。。

处理办法

ACCEPT:放行

DROP:丢弃

REJECT:拒绝

DNAT:目标地址转换

  --to-destination IP[:port]:目的地址转换

SNAT:源地址转换

  --to-source IP/iprange:源地址转换

REDIRECT:端口重定向

MASQUERADE:地址伪装

LOG:日志

  --log-level N:log级别

  --log-prefix “指定log的前缀”:指定log的前缀。

  --log-tcp-sequence:记录tcp序列号。

  --log-tcp-options:记录tcp的选项。

  --log-ip-options:记录ip的选项。

  --log-uid:记录用户的ID。

MARK:打标记

持久化

Iptables重启的时候,默认会清空所有的规则。

我们需要把iptables的规则保存到文件里去。

执行service iptables save就能自动保存到/etc/sysconfig/iptables文件中,然后再重启。

也可以自定义保存到指定的文件中:iptables-save > PATH

然后从指定文件读取iptables规则:iptables-restore < PATH

例子

首先修改filter表的3条链默认策略为DROP:

不写-t 表名,即默认为filter表:

例1

开放80端口

有进来,就要考虑出去。写iptables规则的时候,一定要考虑进来和出去。

例2

允许自己ping自己。

例3

允许本机ping任何地址,但不允许别人ping自己。

Ping使用的是icmp协议;

--icmp-type 8 代表的是ping请求

--icmp-type 0 代表的是ping应答

放行ftp

ftp协议比较特殊,所以单独拿出来说。

首先需要装载两个模块:ip_conntrack_ftp,ip_nat_ftp

modprobe ip_conntrack_ftp

modprobe ip_nat_ftp

然后添加两条规则:

Iptables -A INPUT -d 172.16.100.7 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

Iptables -A OUTPUT-s 172.16.100.7 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

优化

减少重复规则

Iptables规则是从上往下命中的,假如命中了第一条,后面就不会再命中了。

所以,规则是可以优化的,以至于规则不会重复和累赘。

改成以下:

多端口匹配

用1条规则,代替多条规则,也算是一种优化。

条件取反

感叹号:!

例如:

-s ! 192.168.1.12

意思是除了192.168.1.12的源地址。

recent模块抵御dos攻击

这种办法的抵御还是有限的。

iptables之Layer7

iptables默认工作在osi模型中的2/3/4层上。

我们可以通过打补丁,使得iptables支持7层。

这里引入layer7扩展。

安装layer7的步骤这里省略,网上能找到很多文档。

语法:

Iptables -A FORWARD -s 192.168.10.0/24 -m layer7 --l7proto qq -j REJECT


版权声明:本文为qq_29518275原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。