在阿里云上申请的机器默认所有端口都对公网开放,这个非常不安全,需要做一些限制措施。

首先,从整体上来说:

  1. 只有一台机器可以ssh直接登录,这台机器俗称跳转机
  2. 所有线上机器只有80、443端口可以对外访问,其余端口都屏蔽掉,屏蔽时使用DROP
  3. 其他开发测试机按需打开有限的端口,其他端口屏蔽,屏蔽时使用REJECT
  4. 所有机器内网互通,暂不做限制(这个不安全,因为跳转机的ssh端口密码泄露后,相当于真个系统都暴露了)

这里DROP和REJECT的主要区别是:REJECT比DROP多返回一个ICMP错误信息包,DROP节省资源更安全、REJECT排查问题方便

要实现上面的功能,有两个途径,一是阿里云提供的安全组;二是手动配置iptables;经过测试,安全组规则应该是在更外面一层。

安全组

  1. 安全组可以添加规则和添加机器,同一个组内的机器共享所有规则
  2. 每台机器加入的安全组数量受限,每个安全组的规则数量受限

官方链接:安全组说明

iptables

好像也没什么写的,网上的文章已经写的很详细了,参考:

从实践的角度,其实主要从两个方面学习:

  • 一是原理,了解iptables是一个应用层协议,它主要也是依赖于操作系统内核的支持,以hook的形式,让用户可以对网络数据进行处理、过滤等,理解这个也是为了更好地使用命令,知道iptables位于操作系统的哪个层面或位置
  • 规则配置,也就是命令的含义,熟悉命令才能配置更好的规则,实践的时候不容易出错

基本上我目前需要用到的场景:

  • 规则只对公网有效 指定网卡 -i eth1
  • 随时都有添加、删除、插入和修改规则内容的需求,分别对应 -A(add) -D(delete) -I(insert) -R(replace),这里添加不需要指定规则号,但其他几个都需要指定规则号,查看规则号使用 –line-number,插入的时候,是在指定位置插入新的规则,该位置及其他所有规则往后顺移
  • 规则指定端口 –dport 22,为了更简单,在同一条命令中指定多个规则,-m multiport –dports 22,80,注意这个命令最多默认指定15个端口,这个数字是在iptables程序编译的时候指定的
  • REJECT的时候指定返回错误信息 -j REJECT –reject-with icmp-port-unreachable
  • 指定协议,原IP,目的IP
  • 规则如何匹配,执行的顺序: 从前往后执行,匹配成功则不再往后继续执行

踩过的坑

  • 不小心把其中一台机器的22端口给禁掉了,使用的命令

    iptables -A INPUT -p tcp --dport 22  -j REJECT --reject-with icmp-port-unreachable

    这个命令发出之后,直接导致我没法登录机器了,我用命令的原因是因为之前使用 iptables –list INPUT 查看显示出来的规则信息就这么多,于是也就只配置了这些规则,但这条命令会禁止所有对22端口的访问,包括公网和内网(这个时候找同事帮忙,才知道阿里云可以从浏览器直接登录命令行,试了一下,果然可以,想了一下,阿里云这里是使用了VNC远程登录,因为是LINUX,所以就直接进的命令行,而VNC的端口肯定不是22,如果真的不小心把外网的所有端口都封了,那估计只能找客服了)。而实际上只需要禁止公网就够了,正确的命令应该是

    iptables -A INPUT -i eth1 -p tcp --dport 22  -j REJECT --reject-with icmp-port-unreachable

    配置好之后,怎么看每条规则是对应的哪个网卡,最好使用最详细的查看命令 iptables -nvL –line-number,这个命令就会显示网卡信息

  • 扫描端口的时候漏了部分端口

开始所有工作前,我先安装了nmap yum install nmap,扫描机器目前对外开放的所有端口:

nmap 127.0.0.1

这个默认只扫描一部分端口,扫描所有端口需要使用:

nmap -p 1-65535 127.0.0.1