iptables常用使用场景分析

0x 01 前言

iptables功能丰富,应用场景多样,本文介绍5种常用场景。


0x 02 准备工作

1.删除旧表和规则

在配置新的iptables规则前,最好先将旧的配置和规则清除:

iptables -F
清除filter表规则
iptables -X 
清除自定义链

2.设置默认的chain策略


默认ACCEPT

iptables默认的chain策略为ACCEPT,放通所有流量,如果需要限制某些路径,再按需设置策略。

之前我一直觉得这样与ACL精神相违背,后来发现iptables的规则比我想象还要灵活很多,安全和易用可以兼得。下面的配置既可以保证安全,也可以避免起初在设置DROP策略时候,可能会由于人为失误等产生的无法连接的情况,维护起来也更为方便,删除策略不会对连通性产生风险。
具体策略如下:

如果是远程连接,需要先保证远程的shell的正常通信,在此默认使用ssh,且端口为22号,使用stateful防火墙特有的状态监测:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

放通ping的流量和本地回环流量
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

禁止其他的流量和流量转发
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited

默认DROP

这种设计与ACL的deny all 精神相符合,不过用起来确实会麻烦一点,为了完成基础通信,需要更多的配置。具体配置如下。

如果是远程连接,需要先保证远程的shell的正常通信,在此默认使用ssh,且端口为22号:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

为了保证yum或者apt的正常使用,正常连接各个镜像源,需要将DNS服务端口53和HTTP的默认80端口打开:
iptables -A INPUT -p udp -m udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT

iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

关闭filter三条默认链的所有流量,包括接收、转发和发出。
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

另外,在chain中要特别注意每条规则的上下顺序,默认是由上往下匹配。而且如果你的target是ACCEPT或者DROP,那么匹配上该规则后,就不会再匹配下面的规则了,而如果是其他target,则会继续向下匹配。


0x 03 场景分析

场景一,屏蔽风险源IP

当因为合规或者安全风险考虑,我们需要将某个或者某段IP的输入进行屏蔽,这时我们可以使用以下命令,将指定网卡中的ip源的包丢弃:

iptables -A INPUT -i eth0 -p tcp -s 192.168.8.0/24 -j DROP

以上命令设置将源地址段为192.168.8.0/24,且经过eth0的网卡的tcp的流量包丢弃。当然我们还可以设定源目端口或者限定特定IP,同样我们也可以限定本地发往的目的IP。

####场景二,网络地址转换(DNAT or SNAT)

在多网卡的场景下,我们经常需要将IP地址进行转换,以满足不同网络之间跨网络访问需求。iptables的nat表可以完成此类转换工作:

在此之前我们需要将Linux系统的转发功能打开:

echo "1">/proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp -d 192.168.0.1 --dport 33 -j DNAT --to 10.1.1.1:22
以上命令将192.168.0.1的33端口的包转发到10.1.1.1的22端口,因而我们可以通过192.168.0.1的33端口连接到10.1.1.1上的ssh服务,这种场景多见于堡垒机或者反向代理。

iptables  -t nat  -A POSTROUTING -p tcp -s 192.168.0.1  --sport 80 -j SNAT --to 10.1.1.1:8080
以上命令将源地址为192.168.0.1的80端口的流量转换为10.1.1.1的8080端口的流量,以达到源地址改变的效果,这种场景多见于内外网转换。

注:在进行DNAT时候,要保证后端的机器要有到Client的回程路由,且网关指向iptables所在机器,不然也无法完成。

场景三,DDoS攻击的防护

利用iptables的limit模块,可以实现轻量的DDoS攻击防护。利用connlimit模块,可以防护CC攻击(一种低流量高连接的DDoS攻击)

  • 通过自定义链的方式防止大流量攻击
iptables -N syn-flood
新建syn-flood自定义链
iptables -A INPUT -p tcp --syn -j syn-flood
将所有进入本机的流量全部使用自定义链tcp-syn去匹配
iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN 
--limit 3/s表示每秒钟可以释放3个包的链接配额。
--limit-burst 6的意思是本机最多可存在6个封包。注意:这与session的概念是不同,一个session可以有无限个包。
iptables -A syn-flood -j DROP
当超过上个规则的限定的包,将被丢弃。该规则与上一个规则的关系类似以if,else的关系。
  • 使用系统默认链的方式防止大流量攻击
iptables -A INPUT  -p tcp --syn -m limit --limit 3/s --limit-burst 6 -j ACCEPT
iptables -A INPUT  -p tcp --syn -j DROP
这里涉及到的参数与自定义链的参数的意思相同,效果也一致。
  • 使用connlimit模块来防护CC攻击
iptables -A INPUT -i -p tcp --syn -m connlimit --connlimit-above 15 -j DROP 
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
允许每个IP最多15个初始连接,超过的丢弃 
connlimit模块为扩展模板,需要另外编译安装

场景四,按需管理iptables的日志

iptables提供灵活的日志记录功能,我们可以为每一个规则设置不同的日志标识。

  • 为了方便,建议将iptables的日志与系统日志分开。
   vim /etc/rsyslog.conf
   kern.* /var/log/iptables.log
   systemctl   restart  rsyslog
  • 记录所有进入本机的80端口的日志
iptables -I INPUT -p tcp --dport 80 -j LOG 
  • 为日志添加级别,并添加标记
    iptables使用 --log-level定义生成的日志级别,使用–log-prefix为每条规则添加标记。
iptables -A INPUT -s 192.168.10.0/24 -j LOG --log-prefix '**http-test**'  --log-level 4

注:日志级别如下
6)info
5)notice
4)warning
3)error
2)crit
1)alert
0)emerg或panic:导致系统几乎要死机

场景五,过滤包中的字符

如果想要对包中的内容做检查,我们可以使用-m中的string模块,比如我们想要禁止内部员工登录淘宝,可以使用如下规则:

iptables -A OUTPUT -m string --algo bm --string "taobao.com" -j DROP

如果想对数据包中的某个字段进行匹配,比如打日志什么的,也可以使用string模块。不过该模块会对包中的所有内容都进行匹配,所以很容易“误杀”。
下面是官方文档的描述:
This patch by Emmanuel Roger [email protected] adds a new match that allows you to match a string anywhere in the packet.
点击这里,可以查看官方文档的详细描述。


0x 04 规则表的保存

iptables规则与路由规则类似,如果是用命令敲入的规则,只会保存到内存中,再开机的时候,规则都会消失。由于Ubuntu/Debian的发行版和RHEL/CentOS/fedora不同。在此也分成两类。

Ubuntu/Debian类

  • Ubuntu默认没有iptables配置文件,需通过如下命令保存并生成配置文件
iptables-save > /etc/network/iptables.up.rules
  • iptables配置文件路径及文件名建议为/etc/network/iptables.up.rules,因为执行iptables-apply默认指向该文件,也可以通过-w参数指定文件
  • 在/etc/network/interfaces里写入如下配置
pre-up iptables-restore < /etc/network/iptables.up.rules

RHEL/CentOS/fedora类

  • 首先开启iptables开机启动
systemctl  enable iptables

  • 由于centos7之后,redhat推荐使用firewalld,因此需要stop和disable firewalld
systemctl  stop firewalld
systemctl  disable firewalld
另,如果出现发现不了iptables的unit的话,重新安装即可
yum install  iptables-services 
  • centos7系统在安装完iptables之后,就会自动生成配置文件/etc/sysconfig/iptables
service iptables  save  
将配置保存到配置文件/etc/sysconfig/iptables
或者使用如下命令也可以
iptables-save >  /etc/sysconfig/iptables 

这样就将当前的配置全部导入到配置文件中,下次开机重启的时候,就会将iptables的规则生效。


0x 05 参考

http://seanlook.com/2014/02/26/iptables-example/
http://www.cnblogs.com/bangerlee/archive/2013/02/27/2935422.html
http://blog.chinaunix.net/uid-20152246-id-1974690.html
https://www.howtoing.com/enable-logging-in-iptables-on-linux
http://blog.51cto.com/babyshen/1966077
https://blog.csdn.net/foreverfriends/article/details/70227791
http://blog.51cto.com/qiangsh/1978835
https://blog.csdn.net/xiaocao12/article/details/54729887

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章