前言
上一篇记录了内容分发网络CDN
今天来记录一下日常能接触到的iptables
在部署一台服务器的时候,我们总是希望只是开放特定的端口,其它端口都不提供访问
此时,只要通过安全措施守护好这个唯一的入口就可以了
采用的方式是ACL(Access Control List 访问控制列表) 来控制IP和端口
设置好这些规则,只有指定的IP段能访问指定的开放接口,这些规则的集合称为安全组
iptables
当一个网络包进入一台机器的时候,会做什么事情?
首先取下MAC查看是否是本机的,如果是,则取下IP头
得到目标IP后,就开始进行路由判断,这个节点称为PREROUTING
如果发现IP是本机的,就发给传输层,这个节点叫做INPUT
如果IP不是本机的,就需要转发出去,称为FORWARD
上层处理完后,会将处理结果发出去,称为OUTPUT
无论是FORWARD还是OUTPUT,都是路由判断之后发生的,最后一个节点是POSTROUTING
五个节点重点节点
在 Linux 内核中,有一个框架叫 Netfilter。它可以在这些节点插入 hook 函数。
这些函数可以截获数据包,对数据包进行干预。
例如做一定的修改,然后决策是否接着交给 TCP/IP 协议栈处理;或者可以交回给协议栈,那就是 ACCEPT;或者过滤掉,不再传输,就是 DROP;还有就是 QUEUE,发送给某个用户态进程处理。
一个著名的实现,就是内核模块 ip_tables。
它在这五个节点上埋下函数,从而可以根据规则进行包的处理。
按功能可分为四大类:
- 连接跟踪(conntrack)
- 数据包的过滤(filter)
- 网络地址转换(nat)
- 数据包的修改(mangle)
其中连接跟踪是基础功能,被其他功能所依赖。其他三个可以实现包的过滤、修改和网络地址转换。
在用户态,还有一个客户端程序 iptables,用命令行来干预内核的规则。内核的功能对应 iptables 的命令行来讲,就是表和链的概念。
iptables 的表分为四种:raw–>mangle–>nat–>filter。这四个优先级依次降低,raw 不常用,所以主要功能都在其他三种表里实现。每个表可以设置多个链。
filter 表处理过滤功能,主要包含三个链:
- INPUT 链:过滤所有目标地址是本机的数据包;
- FORWARD 链:过滤所有路过本机的数据包;
- OUTPUT 链:过滤所有由本机产生的数据包。
nat 表主要是处理网络地址转换,可以进行 Snat(改变数据包的源地址)、Dnat(改变数据包的目标地址),包含三个链:
- PREROUTING 链:可以在数据包到达防火墙时改变目标地址;
- OUTPUT 链:可以改变本地产生的数据包的目标地址;
- POSTROUTING 链:在数据包离开防火墙时改变数据包的源地址。
mangle 表主要是修改数据包,包含:
- PREROUTING 链;
- INPUT 链;
- FORWARD 链;
- OUTPUT 链;
- POSTROUTING 链。
- 数据包进入的时候,先进 mangle 表的 PREROUTING 链。在这里可以根据需要,改变数据包头内容之后,进入 nat 表的 PREROUTING 链,在这里可以根据需要做 Dnat,也就是目标地址转换。
- 进入路由判断,要判断是进入本地的还是转发的。
- 如果是进入本地的,就进入 INPUT 链,之后按条件过滤限制进入。
- 之后进入本机,再进入 OUTPUT 链,按条件过滤限制出去,离开本地。
- 如果是转发就进入 FORWARD 链,根据条件过滤限制转发。
- 之后进入 POSTROUTING 链,这里可以做 Snat,离开网络接口。
有了 iptables 命令,我们就可以在云中实现一定的安全策略。例如可以处理前面的偷窥事件。首先我们将所有的门都关闭。
代码语言:javascript复制iptables -t filter -A INPUT -s 0.0.0.0/0.0.0.0 -d X.X.X.X -j DROP
-s 表示源 IP 地址段,-d 表示目标地址段,DROP 表示丢弃,也即无论从哪里来的,要想访问这台机器,全部拒绝,谁也黑不进来。
但是会发现出问题,ssh 也进不来了,都不能远程运维了,可以打开一下。
代码语言:javascript复制iptables -I INPUT -s 0.0.0.0/0.0.0.0 -d X.X.X.X -p tcp --dport 22 -j ACCEPT
在云平台上,一般允许一个或者多个虚拟机属于某个安全组,而属于不同安全组的虚拟机之间的访问以及外网访问虚拟机,都需要通过安全组进行过滤