概述介绍
iptables 是 Linux 内核中的防火墙软件 netfilter 的管理工具,位于用户空间,同时也是 netfilter 的一部分。Netfilter 位于内核空间,不仅有网络地址转换的功能,也具备数据包内容修改、以及数据包过滤等防火墙功能。
安全实践
本文不进行iptables实现原理和功能介绍,着重在几个安全防护侧方面展开具体实践使用。而标题提到的低成本,则是由于大部分Linux发行版自带iptables工具,即使未带也可以很简单无版权风险进行一键安装。下文将以X86-64架构Linux 3.10.0内核的Centos 7.6 下开展(对文中敏感信息如主机名、IP等进行了脱敏)。
洪泛防护
洪泛攻击大致理解为通过恶意请求造成服务资源满负荷消耗,无法及时应答正常用户请求。下面是iptables应用防护限制每IP连接数(类似原理可限制每源IP每秒新建TCP连接)。
服务侧:
[root@VM-xx-3-centos ~]# iptables -A INPUT -p tcp --dport 800 -m connlimit --connlimit-above 2 -j REJECT --reject-with tcp-reset
[root@VM-xx-3-centos ~]# nc -klv 0.0.0.0 800
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on 0.0.0.0:800
Ncat: Connection from xxx.xx.xx.xx.
Ncat: Connection from xxx.xx.xx.xx:43912.
Ncat: Connection from xxx.xx.xx.xx.
Ncat: Connection from xxx.xx.xx.xx:43946.
^C
[root@VM-xx-3-centos ~]# nc -klv 0.0.0.0 900
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on 0.0.0.0:900
Ncat: Connection from xxx.xx.xx.xx.
Ncat: Connection from xxx.xx.xx.xx:53798.
Ncat: Connection from xxx.xx.xx.xx.
Ncat: Connection from xxx.xx.xx.xx:53880.
Ncat: Connection from xxx.xx.xx.xx.
Ncat: Connection from xxx.xx.xx.xx:53946.
客户侧:
(1)
[root@instance-xx ~]# nc xxx.xx.xx.xx 800
^C
[root@instance-xx ~]# nc xxx.xx.xx.xx 900
^C
(2)
[root@instance-xx ~]# nc xxx.xx.xx.xx 800
^C
[root@instance-xx ~]# nc xxx.xx.xx.xx 900
^C
(3)
[root@instance-xx ~]# nc xxx.xx.xx.xx 800
^C
[root@instance-xx ~]# nc xxx.xx.xx.xx 900
^C
Ncat: Connection refused.
以上可以见到,受到防护的800端口,同一IP最多只能有2个活跃连接,而另外900端口则不被拦截限制。
访问控制
在实现软件安全设计时,安全设计有一个最小权限原则,求计算环境中的特定抽象层的每个模組如进程、用户或者计算机程序只能访问当下所必需的信息或者资源。Linux常见的运维SSH端口,则可以通过iptables完成IP白名单完成对指定IP用户开放。
服务侧:
[root@VM-xx-3-centos ~]# ipset create whitelist hash:net
[root@VM-xx-3-centos ~]# ipset add whitelist xxx.xx.xx.xx
[root@VM-xx-3-centos ~]# ipset add whitelist 127.0.0.1
[root@VM-xx-3-centos ~]# iptables -I INPUT -m set --match-set whitelist src -p tcp --destination-port 800 -j ACCEPT
[root@VM-xx-3-centos ~]# iptables -A INPUT -p tcp --destination-port 800 -j REJECT
客户侧:
(1) xxx IP
[root@instance-xx ~]# nc xxx.xx.xx.xx 800
^C
(2) yyy IP
[root@instance-xx ~]# nc xxx.xx.xx.xx 800
^C
Ncat: Connection refused.
以上可看到服务侧对指定端口进行了白IP限制,而使用ipset,可动态进行多IP的扩缩。
另外,结合其他分析工具产出黑IP,联动iptables也是一种经济的事件响应处置方式。
端口隐藏
端口隐藏作用很多,比如不想暴露真实服务端口、临时开放端口对外、定期修改端口等,通过iptables很好满足这些需求。具体操作示例如下。
服务侧:
[root@VM-xx-3-centos ~]# echo 1 >/proc/sys/net/ipv4/ip_forward
[root@VM-xx-3-centos ~]# sysctl -w net.ipv4.conf.eth0.route_localnet=1
[root@VM-xx-3-centos ~]# sysctl -w net.ipv4.conf.default.route_localnet=1
[root@VM-xx-3-centos ~]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 800 -j DNAT --to-destination 127.0.0.1:900
[root@VM-xx-3-centos ~]# nc -klv 0.0.0.0 900
客户侧:
[root@instance-xx ~]# nc xxx.xx.xx.xx 800
验证访问成功;后续通过iptables调整完成端口的更换、不对外等;另外及时iptables端口转发开启,对应外部端口无法通过netstat等工具检测到,也可以让合规工具巡检通过。
以上简单列举几个防护示例,iptables能做的更多。
参考文献
(1) https://man7.org/linux/man-pages/man8/iptables.8.html
(2) https://zhuanlan.zhihu.com/p/441089738
(3) https://morven.life/posts/iptables-wiki/