一.iptables 简介
iptables防火墙是由Netfilter项目开发的,iptables提供了全面的协议状态跟踪、数据包的应用层检查、速率限制、指定策略过滤等。而iptables使用Netfilter框架进行过滤。Netfilter本身不对数据包进行过滤---它只是允许可以过滤数据包的函数挂接到内核的位置。
二.iptables的过滤策略
iptables策略是由一组有序的规则建立的。其中体现在五表五链(其中security表是新加入的)
表:1.filter(主要功能是过滤)
2.nat(用于网络转换SNAT和DNAT)
3.mangle(修改分组数据的特定规则)
4.raw(独立于Netfilter连接跟踪子系统起作用的规则)
链:
每个表都有自己的一组内置链,而链就在数据包流经的必经之路上,上图可见。
1.INPUT链:当数据包要由内核流向Linux系统中必将经过INPUT链的检查,当然检查的规则是各个表上的规则。
2.OUTPUT链:linux 系统自己生成的数据包流出本机。
3.FORWARD链:管理经过Linux系统路由的数据包。
4.PREROUTING链:在进行路由判断之前要进行的规则(DNAT,REDIRECT)
5.POSTROUTING链:在进行路由判断之后要进行的规则(SNAT,MASQUERADE)
匹配:
匹配是指数据包满足所有的匹配条件时,iptables才能根据处理该数据包。
一般的匹配如下:
1. --source (-s) ----- 匹配源IP地址。
2. --destination (-d) ----- 匹配目的IP地址。
3. --protocol (-p) ----- 匹配协议。
4. --in-interface (-i) ----- 匹配流入接口(如eth0)
5. --out-interface (-o) ----- 流出接口
6. --state ------ 匹配一组连接状态
7. --string ------ 匹配应用层数据字节序列
8. --comment ------ 在内核内存中为一个规则关联多达256个字节的注释数据
目标:
这指的是当匹配数据包后触发的一个动作。
1.ACCEPT ----- 允许数据包通过
2.DROP ------ 丢弃数据包,不对该数据包做进一步处理,对接收栈而言,相当于对该数据包从没有接收过。
3.LOG ------ 将数据包记录到syslog
4.REJECT ------ 丢弃数据包,并且作出适当的回应包文
5.RETURN ----- 在调用链中继续处理数据包
iptables的运行时基于模块的,加载模块可以实现更复杂的匹配。如ip_conntrack,iptable_nat,ip_nat_ftp。具体一会讲到。其次iptables是基于网络层的,也就是说它只能过滤IP层及其以上的数据包,所以iptables不能过滤ARP报文。
下图是内核加载的iptables相关的模块。
这里介绍一下ip_conntrack 模块。先看看ip_conntrack 实现的状态追踪实现。
# iptables -A INPUT -m state --state INVALID -j LOG --log-prefix "DROP INVALID" --log-ip-options --log-tcp-options
# iptables -A INPUT -m state --state INVALID -j DROP
# iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
上面的命令是指 遇到非法的连接(INVALID) 会用日志记录起来,再忽律该非法数据包,最后一行是指 NEW,ESTABLISHED,RELATED 状态的可以通过。
那什么属于INVALID的数据包呢,INVALID数据包指的是一个不能被识别为属于一个已有连接的数据包---例如,突如其来的一个TCP FIN 数据包(不属于任何TCP连接)就是一个非法连接。而ESTABLLISHED是指一个已经建立的连接。RELATED状态指的是再Netfilter连接跟踪子系统中打开的一个新的连接,且这个连接和现有的连接是相关的,如当数据包发送给一个没有绑定UDP套接字的时候,服务器将返回一个ICMP端口不可达。而NEW呢,当然是指一个新的连接了。看下面的命令。
# iptables -A OUTPUT -m state --state NEW -j DROP
# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
^C
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 999ms
从本机发起的请求全部被DROP了。也就是不能发起一个新的请求了。那状态追踪有什么意义呢?假设这样一个场景。一台处于内网的服务器是不允许自己向外发出tcp连接的,它只被允许客户端向它发起连接请求,那么就需要追踪状态了。因为正常情况下服务器不会主动向外请求,如果这个情况真的突然发生了,那么只可能是服务器中病毒了,做这样的状态追踪还可以防止中毒服务器向外发请求,但是有一个问题,追踪状态是十分消耗资源的,当加载了ip_conntrack 模块去追踪连接的话,这样会限制当前的连接数量,这个具体要修改内核参数 net.ipv4.ip_conntrack_max ,在sysctl.conf 中。
当然iptables还可以出色的实现地转转换,通过 --to-destination 等参数,可以实现目的地址转化。MASQUERADE 可以实现地址伪装,算是SNAT的一种,是一种自动化的SNAT,为了防止ADSL导致的IP地址乱变。
# iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o enp0s3 -j MASQUERADE