netfilter与iptables

基础功能

Netfilter是Linux操作系统核心层内部的一个数据包处理模块

它有如下三个主要的功能:

  • NAT - 网络地址转换
  • MANGLE - 数据包内容修改
  • FILTER - 数据包过滤的防火墙功能

Netfilter 平台中制定了数据包的五个挂载点(Hook Point,我们可以理解为回调函数点,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包路由的时候改变它们的方向、内容),这5个挂载点分别是PRE_ROUTINGINPUTOUTPUTFORWARDPOST_ROUTING

Netfilter 所设置的规则是存放在内核内存中的,而 iptables 是一个应用层的应用程序,它通过 Netfilter 放出的接口来对存放在内核内存中的 XXtables(Netfilter的配置表)进行修改。这个XXtables由表tables链chains规则rules组成,iptables在应用层负责修改这个规则文件。

filter表

因为NATMANGLE在网络路由中会比较多,这里就重点说下FILTER

主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG)。filter 表对应的内核模块为iptable_filter,包含三个规则链:

  • INPUT链 - INPUT针对那些目的地是本地的包
  • FORWARD链 - FORWARD过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的包
  • OUTPUT链 - OUTPUT是用来过滤所有本地生成的包

通过以上分析,在实际操作中,linux服务器上基本用不到forward链。

防火墙处理数据包的方式(规则):
  • ACCEPT:允许数据包通过
  • DROP:直接丢弃数据包,不给任何回应信息
  • REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息。
  • LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则

除去最后一个LOG,前3条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编写的规则顺序极其关键。

iptables编写规则

命令格式:

  • [-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等

链管理命令

  • -P :设置默认策略的(设定默认门是关着的还是开着的)

    默认策略一般只有两种
    iptables -P INPUT (DROP|ACCEPT) 默认是关的/默认是开的
    比如:
    iptables -P INPUT DROP 这就把默认规则给拒绝了。
    并且没有定义哪个动作,所以关于外界连接的所有规则包括Xshell连接之类的,远程连接都被拒绝了。

  • -F: FLASH,清空规则链的(注意每个链的管理权限)

    iptables -t nat -F PREROUTING
    iptables -t nat -F 清空nat表的所有链

  • -N:NEW 支持用户新建一个链

    iptables -N inbound_tcp_web 表示附在tcp表上用于检查web的。

  • -X: 用于删除用户自定义的空链

    使用方法跟-N相同,但是在删除之前必须要将里面的链给清空昂了

  • -E:用来Rename chain主要是用来给用户自定义的链重命名

    -E oldname newname

  • -Z:清空链,及链中默认规则的计数器的(有两个计数器,被匹配到多少个数据包,多少个字节)

    iptables -Z :清空

规则管理命令

  • -A:追加,在当前链的最后新增一个规则
  • -I num : 插入,把当前规则插入为第几条。

    -I 3 :插入为第三条

  • -R num:Replays替换/修改第几条规则

    格式:iptables -R 3 …………

  • -D num:删除,明确指定删除第几条规则

查看管理命令 “-L”

附加子命令

  • -n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名
  • -v:显示详细信息
  • -vv
  • -vvv :越多越详细
  • -x:在计数器上显示精确值,不做单位换算
  • –line-numbers : 显示规则的行号

iptables常用实例

参考资料:

iptables防火墙原理详解
iptables常用操作实例