iptables/netfilter 详解
netfilter与iptables
基础功能
Netfilter是Linux操作系统核心层内部的一个数据包处理模块
它有如下三个主要的功能:
- NAT - 网络地址转换
- MANGLE - 数据包内容修改
- FILTER - 数据包过滤的防火墙功能
Netfilter 平台中制定了数据包的五个挂载点(Hook Point,我们可以理解为回调函数点,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包路由的时候改变它们的方向、内容),这5个挂载点分别是PRE_ROUTING
、INPUT
、OUTPUT
、FORWARD
、POST_ROUTING
。
Netfilter 所设置的规则是存放在内核内存中的,而 iptables 是一个应用层的应用程序,它通过 Netfilter 放出的接口来对存放在内核内存中的 XXtables(Netfilter的配置表)进行修改。这个XXtables由表tables
、链chains
、规则rules
组成,iptables在应用层负责修改这个规则文件。
filter表
因为
NAT
和MANGLE
在网络路由中会比较多,这里就重点说下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等-j>
链管理命令
-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常用实例
参考资料: