linux iptables是由两个组件组成:Netfilter和Iptables组成:
Netfilter
Netfilter称为内核空间,是linux内核的一部分,用于拦截和操作数据的一套框架。框架内容包括三部分:
共有五个节点
- NF_IP_PRE_ROUTING,在报文作路由以前执行;
- NF_IP_FORWARD,在报文转向另一个NIC以前执行;(转发处理前)
- NF_IP_POST_ROUTING,在报文流出以前执行;(转发处理后)
- NF_IP_LOCAL_IN,在流入本地的报文作路由以后执行;(流入本地后)
- NF_IP_LOCAL_OUT,在本地报文做流出路由前执行。(本地要发送的数据流出前)
流程图:
Iptables用户空间工具
iptable是一种工具,也称用户空间。它使得插入/修改/删除表中规则变得容易。
Table 表
filter表
该表的作用主要用于包过滤。它在LOCAL_IN,FORWARD,LOCAL_OUT三处HOOK函数进行了注册。
Nat表
该表的作用主要用于地址转换。它在PRE_ROUTING,POST_ROUTING两处HOOK函数进行了注册。k8s中的kube-proxy就是基于此表做的k8s的基础原理
Mangle表
该表的作用是进行数据包内容的修改。它在Netfilter的所有5个HOOK函数进行了注册。
Chain 链
Chain链是实现hook函数调用的实现方式,
table | chain |
---|---|
Filter | INPUT |
Filter | FORWARD |
Filter | OUTPUT |
Nat | PREROUTING |
Nat | OUTPUT |
Nat | POSTOUTING |
Mangle | PREROUTING |
Mangle | INPUT |
Mangle | OUTPUT |
Mangle | FORWARD |
Mangle | POSTOUTING |
链INPUT=HOOK函数 LOCALIN
链OUTPUT=HOOK函数 LOCALOUT
链PREROUTING=HOOK函数 PREROUTING
链POSTROUTING=HOOK函数 POSTROUTING
链 FORWARD=HOOK函数 FORWARD
Target 目标
链的每个规则都会有一个目标,目标决定了该规则对数据包如何处理。
常用目标:
ACCEPT:允许
DROP:拒绝
REJECT:同DROP一样,不过它会向发送方返回个错误信息
iptables命令
常用命令
-
iptables -P INPUT DROP
:设置 INPUT 链默认策略为 DORP 其他链 -
~:显示详细信息
-
iptables -A INPUT -p tcp -d 192.168.175.7 --dport 22 -j ACCEPT
放行目标 ip 为 192.168.175.7 协议为 tcp 22 端口的入站流量 -
iptables -A INPUT -d 192.168.175.7 -p icmp -j ACCEPT
放行目标 ip 为 192.168.175.7 的 icmp 协议流量 -
iptables -t filter -A OUTPUT -p tcp -s 192.168.175.7 -j ACCEPT
放行源 ip 为 192.168.175.7 的出站流量 -
iptables -A INPUT -p icmp -d 192.168.175.7 --icmp-type 0 -j ACCEPT
放行 icmp 的 echo reply 入站流量 -
iptables -L -n --line-num
:查看链上的规则不反解并显示规则编号 -
iptables -D INPUT 1
:删除 INPUT 链上的第一条规则 -
iptables -R INPUT 2 -d 192.168.175.7 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT
-
iptables -R INPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
-
iptables -A INPUT –p icmp -m limit –limit 10/second -j ACCEPT
-
-t table:
filter,nat,mangle,raw(省略时为 filter)
-
链管理
-F:flush,清空规则链,省略链表示清空指定表上的所有的链(不指定链则默认为 filter)
-N:new,创建自定义规则链
-X:drop,删除用户自定义的空的规则链
-Z:zero,置零规则计数器
-P:policy,为指定链设置默认策略,对 filter 表中的链而言,默认策略通常有 ACCEPT,DROP,REJECT;
-E:rename,重命名自定义链,引用计数不为 0 的自定义链无法改名,也无法删除
- L:显示规则
-
规则管理:
-A:append,将新规则追加于指定链的尾部
-I:insert,将新规则插入指定链的指定位置
-D:delete,删除指定链上的指定规则,有两种指定方式(1)指定匹配条件(2)指定规则的编号
-R:replace,替换指定链上的指定规则
-
查看
-L:list,列出指定链上所有规则
-n:numberic
,以数字格式显示地址和端口号,不反解
-v:verbose
,显示详细信息
--line-numbers
:显示规则编号
-x:exactly
:显示计数器计数结果的精确值 -
目标
-j TARGET:jump 至指定的 TARGET
ACCEPT:接受
REJECT:拒绝
DROP:丢弃
RETURN:返回调用链
REDIRECT:端口重定向
LOG:记录日志
MARK:做防火墙标记
SNAT: 源地址转化
DNAT:目标地址转换
MASQUERADE:地址伪装
….
自定义链:由自定义链上的规则进行匹配检查
-
基本匹配:
[!] -s,--src,--source IP | Netaddr
:检查报文中的源 IP 地址是否符合此处指明的地址范围[!] -d,--dst,--destination IP | Netaddr
: 检查报文中源 IP 地址是否符合此处指定的地址范围[!] -p,--protocol {tcp|udp|icmp}
: 检查报文中的协议,即 IP 首部中的 protocols 所标识的协议[!] -i,--in-interface INTERFACE
:数据报文的流入接口,仅能用于 PREROUTING,INPUT 及 FORWARD 链上[!] -o,--out-interface INTERFACE
:数据报文的流出接口,仅能用于 FORWARD,OUTPUT 及 POSTROUTING 上
参考和引用
- blog.51cto.com/whyxx/56091…
- my.oschina.net/u/4256145/b…