网络安全策略如何实现?

2022-01-11 09:25:27 浏览数 (1)

前言

上一篇记录了内容分发网络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 链。
  1. 数据包进入的时候,先进 mangle 表的 PREROUTING 链。在这里可以根据需要,改变数据包头内容之后,进入 nat 表的 PREROUTING 链,在这里可以根据需要做 Dnat,也就是目标地址转换。
  2. 进入路由判断,要判断是进入本地的还是转发的。
  3. 如果是进入本地的,就进入 INPUT 链,之后按条件过滤限制进入。
  4. 之后进入本机,再进入 OUTPUT 链,按条件过滤限制出去,离开本地。
  5. 如果是转发就进入 FORWARD 链,根据条件过滤限制转发。
  6. 之后进入 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

在云平台上,一般允许一个或者多个虚拟机属于某个安全组,而属于不同安全组的虚拟机之间的访问以及外网访问虚拟机,都需要通过安全组进行过滤

0 人点赞