#iptables研究
iptables是基于内核模块netfilter的hook函数实现的一个用户态接口程序。
iptables有5个表,其中最常用的有3个分别是 (就像netty,表就好比有5个channel,链就好比每个channel都有读写handler方法够成的Pipeline, 规则就好handler. 也是一样可以交织成一个路由过滤网络)
filter过滤, nat地址转换, mangle修改
每个表都表示一个namespace,它所关注的链都不一样,就好比他们侧重的领域不一样
filter只能操作 input,output,forward (默认表)
nat关注 preroutine, postroutine, output
mangle 可以操作所有链
链就是类似 设计模式中的责任链模式。每一个节点都有2个属性,匹配的规则和-j跳转策略,所有规则命中才会触发跳转策略。
从程序的运行的角度来看
节点就好像一个if判断代码块,-j跳转策略就好像 以contine命令和break命令或者goto命令或者return命令结束的业务代码块,每一个链就一个带有数组迭代器变量的函数,
void chain() {
for(record : linkedlist ) {
if(匹配规则) {
// 这里调用其他-j到自定义链就是嵌套调用了
策略代码或者其他chain()
contine/break/return
}
}
}
用户可以通过iptables对链表的节点进行增删查改。
我们常用的
- ACCEPT 将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则炼(nat:postrouting)goto;
- REJECT 拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接 中断过滤程序。 范例如下:return;
iptables -A FORWARD -p TCP ——dport 22 -j REJECT ——reject-with tcp-reset
- DROP 丢弃封包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。break;
- REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将 会继续比对其它规则。 这个功能可以用来实作通透式 porxy 或用来保护 web 服务器。例如:
iptables -t nat -A PREROUTING -p tcp ——dport 80 -j REDIRECT ——to-ports 8080
- MASQUERADE 改写封包来source IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则炼(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE ——to-ports 1024-31000
- LOG 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组态档,进行完此处理动作后,将会继续比对其它规则。例如:
iptables -A INPUT -p tcp -j LOG ——log-prefix “INPUT packets”
- SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则炼(mangle:postrouting)。范例如下:
iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT ——to-source 194.236.50.155-194.236.50.160:1024-32000
- DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规则炼(filter:input 或 filter:forward)。范例如下:
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 ——dport 80 -j DNAT ——to-destination 192.168.1.1-192.168.1.10:80-100
-
MIRROR 镜射封包,也就是将来源 IP 与目的地 IP 对调后,将封包送回,进行完此处理动作后,将会中断过滤程序。(跟 REJECT 很像)
-
QUEUE 中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费用……等。
-
RETURN 结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。
-
MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下:
iptables -t mangle -A PREROUTING -p tcp ——dport 22 -j MARK ——set-mark 2
引用 http://arthurchiao.art/blog/deep-dive-into-iptables-and-netfilter-arch-zh/
总结
上面这些都是一些比较细碎的知识点和笔记,之后进一步梳理各个功能点的设计意图以及用法,尤其是关于【链接状态跟踪】以及【各个表的链怎么流转(流转的先后顺序)以及意图】