Netfilter编程系列(二):Iptables

Introduction

Netfilter编程系列(一):Netfilter介绍中我们提到过iptables,接下来我们将详细介绍。

Iptable

Netfilter在Linux Kernel中做了一些监测点/Hook点,并将Hook的位置定义为表/Table。
每一张表中,定义了链/Chain,每一个在Linux Kernel中的数据表,经过不同Hook点时,根据Table中的Chain的规则,进行包处理。

Filter

Filter表主要用于数据包转发,同时也是iptables默认使用的表,可以在Filter表中使用三种链,即INPUT、FORWARD和OUTPUT链。可以在不同的位置对数据包进行处理。

NAT

NAT表主要用于地址转换,可以在NAT表中使用三个链,即PREROUTING、OUTPUT和POSTROUTING链。可以在不同的位置对数据包进行处理。

Mangle

Mangle表主要用于处理数据包内容,可以在Mangle表中使用五种链,即PREROUTING、INPUT、FORWARD、OUTPUT和POSTROUTING链。可以在不同的位置对数据包进行处理。

Raw

Raw表主要用于处理异常,如配置异常,可以在Raw表中使用两种链,即PREROUTING和OUTPUT。可以在不同的位置对数据包进行处理。

Security

Security表用于根据安全策略处理数据包,可以配置Mandatory Access Control(MAC)的网络安全策略,可以在Security表中使用三种链,即INPUT、FORWARD和OUTPUT链。可以在不同的位置对数据包进行处理。

Chain

可以把Chain理解为多个策略/Rule/Policy的集合,不同的Chain只是Hook的位置不同。

PREROUTING

PREROUTING链在数据包进入路由选择之前进行Hook,Hook点位于刚接收到数据包之后。常用于路由器、防火墙开发使用。

INPUT

INPUT链在数据包将要在本地交付出去之前进行Hook,Hook点位于数据包的目的地是本地socket端口这一截。常用于数据包过滤、防火墙开发使用。

FORWARD

FORWARD链在数据包将要进行路由之前进行Hook,Hook点位于数据包目的地是本地路由表这一截。常用于数据包转发、劫持和过滤。

OUTPUT

OUTPUT链在数据包将要发出本地之前进行Hook,Hook点位于数据包的被封装成一个完整的网络包之后。常用于防火墙开发。

POSTROUTING

POSTROUTING链在路由决定之后,从本地网卡发出之前进行Hook,Hook点位于数据包将被发送出网卡之前。作为网络链路的最后一个Hook点。

Command

上面从概念上讲述了iptables。要想熟练使用iptabls工具,光有概念是不够的,还需要需要熟悉它的命令和使用方法,进行规则的配置。

Append

添加规则到指定Chain中,如:

$ sudo iptables -A INPUT -p udp --dport 53 -j REJECT

将规则添加到默认的Filter表的INPUT chain中,规则是拒绝所有目的端口是53的udp数据包。

Check

检查一个规则是否在指定Chain中,不存在则返回错误信息,如:

$ sudo iptables -C INPUT -p udp --dport 53 -j REJECT
$ sudo iptables -C INPUT -p udp --dport 52 -j REJECT
iptables: No chain/target/match by that name.

53端口的规则我们之前添加了,所以返回正常。但是52端口的返回表明没有配置这样的规则。

Delete

删除指定Chain中的规则,如:

$ sudo iptables -D INPUT -p udp --dport 53 -j REJECT

Insert

将规则插入到指定Chain中的指定位置,如:

$ sudo iptables -I INPUT 1 -p udp --dport 53 -j REJECT

将在默认的Filter表的Input chain的首部插入规则。

Replace

将规则插入到指定Chain中的指定位置,如:

$ sudo iptables -R INPUT 1 -p udp --dport 52 -j REJECT

将把默认的Filter表中的首部规则替换为拒绝52端口的udp数据包。

List

列出指定Chain中的所有规则,如:

$ sudo iptables -L INPUT
Chain INPUT (policy ACCEPT)
target    prot opt source    destination
REJECT    udp  --  anywhere  anywhere     udp:dpt:52 reject-with icmp-port-unreachable

Flush

删除指定Chiain中的所有规则,如:

$ sudo iptables -F INPUT

New chain

新建一个用户自定义的Chain,如:

$ sudo iptables -F USER
$ sudo iptables -L
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 USER (0 references)
target    prot opt source    destination

Delete chain

删除用户自定义的Chain,删除的前提条件是Chain上没有references,如:

$ sudo iptables -X USER

Policy

给指定的Chain设置默认规则,合法的规则是接收/ACCPET,丢弃/DROP以及返回/RETURN,如:

$ sudo iptables -P INPUT DROP
$ sudo iptables -L INPUT
Chain INPUT (policy DROP)
target    prot opt source    destination

Rename chain

重命名Chain,如:

$ sudo iptables -E USER ANOTHER_USER

Parameters

部分命令还可以包含参数,如在添加规则的时候可以进一步细化规则。

IPV4/IPV6

可以指定包类型为ipv4或者ipv6的数据包,如:

$ sudo iptables -A INPUT -4
$ sudo iptables -L INPUT
Chain INPUT (policy ACCEPT)
target    prot opt source    destination
          all  --  anywhere  anythere

Protocol

可以指定包协议,包括tcp,udp,udplite,icmp,icmpv6等,如:

$ sudo iptables -A INPUT -p tcp
$ sudo iptables -L INPUT
Chain INPUT (policy ACCEPT)
target    prot opt source    destination
          tcp  --  anywhere  anythere

可以加感叹号!来表示除某个协议外,如:

$ sudo iptables -A INPUT ! -p tcp
$ sudo iptables -L INPUT
Chain INPUT (policy ACCEPT)
target    prot opt source    destination
         !tcp  --  anywhere  anythere

Source/Destination

可以指定源地址和目的地址,如:

$ sudo iptables -A INPUT -s 1.1.1.1 ! -d 255.255.255.0
$ sudo iptables -L INPUT
Chain INPUT (policy ACCEPT)
target    prot opt source    destination
          all  --  1.1.1.1  !255.255.255.0

IP地址支持感叹号!的非逻辑,以及支持掩码。

Match

根据用户编写的Kernel Module进行匹配,这个后续介绍。

Jump

对符合规则的包做出跳转规则,跳转可以是别的Chain,也可以是内建的目的地ACCEPT,DROP,RETURN等,如:

$ sudo iptables -A INPUT -j RETURN
$ sudo iptables -L INPUT
Chain INPUT (policy ACCEPT)
target    prot opt source    destination
RETURN    all  --  anywhere  anywhere

Goto

和Jump类似,唯一不同的是对于RETURN的处理逻辑。

Summary

详细的介绍了iptables工具是使用方法,相信现在你已经可以通过iptables配置包过滤的规则了。

(本文出自csprojectedu.com,转载请注明出处)