1 iptables的原理以及命令
首先linux集成了netfilter库,netfilter工作在tcp/ip协议栈网络层(可以看到tcp头,ip头,mac地址等信息)。然后提供五个hook点,用其他内核模块注册使用,对于iptables内核模块,就注册了这写hook函数,进行工作,iptables工具是提供的操作iptables操作内核模块的工具,前者提供机制,后者指定策略。讲策略写入内核模块,下面是五个hook点的示意图
这五个点就是一个数据包进入主机后要经过的路径,一种是发给本机的包,另一种是需要forward的包,流程图如下所示
iptables正式在这五个点根据用户配置的规则进行数据包的处理。大概就是这个原理。
对于数据包的处理可以分为三种类型
1 nat 转发(改变目标地址或源地址)
2 mangle 修改
3 filter 过滤
所以提供了三张表用于保存这些规则,三张表的名字分别是nat,filter和mangle,当请求进入主机的时候,经过的处理流程大致如吐下
三张默认的表中包含一些规则链,默认的链有INPUT OUTPUT PREROUTING POSTROUTING FORWARD,分别用于保存五个hook点所执行的操作。
明白了大致流程后就可以进行规则编写了,就要说说iptables的基本命令
命令大致格式如下
iptables [-t table] command [match] [target/jump]
1 table
-t指定table,默认filter表
2 Commands 名令
表示要执行的操作,如添加链,增删改规则等
-A 追加
-D 删除
-R 替换(链中根据编号)
-I 指定序号插入,默认序号是1 也就是插入到最前面,注意规则执行时是按照链中规则的顺序执行的
-L 列出
-F 清楚
-Z 计数清0
-X 删除链(保证不被引用)
-P 默认的target(不符合规则默认的target,见后面target节)
3 match 匹配条件,满足匹配条件的包会执行后面的target,其他的走下链中下一个规则,否则返回父链
-p 协议
-s 源地址
-d 目的地址
-i 进入网卡
-o 出去网卡
-f 分片
-sport 源端口
-dport 目的端口
--tcp-flags
--limit 限制条件 如每小时三个请求
--limit-burst
--mac-source
--uid-owner
--gid-owner
--pid-owner
--state (INVALID,ESTABLISHED,NEW 和 RELATED)
--tos
4 Targets/Jumps 后面有不同的参数,请查表
ACCEPT 之后不会匹配这个链的其他
DROP 直接丢弃
REJECT 拒绝,不直接丢弃,返回错误给对方
DNET | SNET 转发
ULOG| NFLOG|LOG
MARK
MASQUEREAD
QUEUE
REJECT
REDIRECT
RETURN
TOS
TTL
日志记录,iptables提供三种方式,取决于编译选项。包括LOG(打印打/proc/dmesg)
ULOG 通过netlinker将log从内核发送给用户空间,单项
NFLOG通过netlinker将log从内核发送给用户空间,双向
netlinker在内核和用户空间创建socket通信,通过多播的形式将内核log送往用户空间。
对于android中的iptables只提供了ulog和nflog的方式读取log。需要写一个程序从nflog中读取数据,参考
http://www.netfilter.org/projects/libnetfilter_log/doxygen/nfulnl__test_8c_source.html