一 实验目的
掌握如何设计防火墙的高级过滤策略以抵御各种类型的攻击。
二 实验内容
- 防止端口扫描;
- 防止 ping 攻击;
- 防止 ip 碎片攻击;
- 丢弃坏的 TCP包;
- 防止 SYN攻击。
三 实验原理
参见 网安技术与应用(3)——Linux防火墙iptables的使用
四 实验条件
1、仪器设备条件:PC 及其网络环境;
2、物质条件:Linux(kernel 2.6包含 Iptables);
3、相关文献资料:教学网站所提供的电子文档
五 实验过程
1、默认规则
# 启动防火墙
modprobe ip_tables
sudo ufw enable
sudo ufw reload
#清除规则
sudo iptables -F
#设置默认规则为丢弃一切报文
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT DROP
sudo iptables -P FORWARD DROP
2、防止端口扫描和Ping攻击
OUTPUT是关于虚拟机ping主机的设置,INPUT是关于主机ping虚拟机的设置。
1/s 10就是一秒钟不能发超过10个,1/m 10就是1分钟不能发超过10个,ping操作的通信1秒钟不可能达到发送10个,最多来回2-3次,但1分钟10次消息传输是完全有可能的
所以,只要OUTPUT或INPUT有一方设置了1/m 10,就会在发送10条消息后停止;如果2个都是1/s 10,就会永远ping下去
因为是双方的通信,所以output和input都要打开【accept】
sudo iptables -A INPUT -i eth0 -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# 用于测试
sudo iptables -A OUTPUT -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
# sudo iptables -A OUTPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT
# 防止 ping 攻击,允许每秒和每分钟一个包,触发条件是10个包
# sudo iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
sudo iptables -A INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT
- windows去ping虚拟机:
ping -l 65500 -t 192.168.85.128
ping -l 10 -t 192.168.85.128
3、IP碎片控制
对于不管来自哪里的 ip 碎片都进行控制,允许每秒通过 100 个碎片 (触发条件是100个包)
sudo iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
4、丢弃坏的TCP
sudo iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP
5、防止SYN攻击
防止 SYN攻击,限制SYN的请求速度为3个/s,触发条件为6个tcp报文
sudo iptables -N syn-flood
sudo iptables -A INPUT -p tcp --syn -j syn-flood
sudo iptables -A syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN
sudo iptables -A syn-flood -j REJECT
6、屏蔽指定IP
有时候我们发现某个ip不停的往服务器发包,这时我们可以使用以下命令,将指定ip发来的包丢弃
sudo iptables -F
BLOCK_THIS_IP="192.168.85.1"
sudo iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP
7、配置服务项
利用iptables,我们可以对日常用到的服务项进行安全管理,比如设定只能通过指定网段、由指定网口通过SSH连接本机
sudo iptables -A INPUT -i eth0 -p tcp -s 192.168.85.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
sudo iptables -L
8、网口转发配置
对于用作防火墙或网关的服务器,一个网口连接到公网,其他网口的包转发到该网口实现内网向公网通信,假设eth0连接内网,eth1连接公网,配置规则如下:
sudo iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
六 思考题解答
(1)如何限制WPS联网服务? 如何限制网易云音乐的联网服务?
网易云限制
-
下载网易云
sudo dpkg -i netease-cloud-music_1.2.1_amd64_ubuntu_20190428.deb
-
打开网易云,播放一首歌,并查看其占据的进程号
netstat -anp | grep netease
-
将涉及到的服务器IP在IPtables中禁止
-
modprobe ip_tables sudo iptables -I INPUT -s 59.111.181.52 -p tcp -j DROP sudo iptables -I INPUT -s 117.167.98.146 -p tcp -j DROP sudo iptables -I INPUT -s 120.226.29.35 -p tcp -j DROP sudo iptables -I INPUT -s 59.111.181.35 -p tcp -j DROP sudo iptables -I INPUT -s 59.111.19.33 -p tcp -j DROP sudo iptables -I INPUT -s 36.158.208.102 -p tcp -j DROP sudo iptables -I INPUT -s 36.158.208.101 -p tcp -j DROP sudo iptables -I INPUT -s 59.111.160.195 -p tcp -j DROP sudo iptables -I INPUT -s 117.167.98.147 -p tcp -j DROP sudo iptables -I INPUT -s 111.45.68.154 -p tcp -j DROP sudo iptables -I INPUT -s 36.158.208.105 -p tcp -j DROP
-
设置后发现已经断网
-
WPS限制
-
下载WPS
sudo dpkg -i wps-office_11.1.0.10920_amd64.deb
-
查看WPS占据的进程号
netstat -anp | grep wps
-
将涉及到的服务器IP在IPtables中禁止
modprobe ip_tables sudo iptables -I INPUT -s 110.43.89.138 -p tcp -j DROP sudo iptables -I INPUT -s 120.92.103.226 -p tcp -j DROP sudo iptables -I INPUT -s 120.241.92.117 -p tcp -j DROP sudo iptables -I INPUT -s 120.232.170.41 -p tcp -j DROP sudo iptables -I INPUT -s 183.214.1.252 -p tcp -j DROP sudo iptables -I INPUT -s 120.131.2.130 -p tcp -j DROP sudo iptables -I INPUT -s 111.31.36.189 -p tcp -j DROP sudo iptables -I INPUT -s 121.36.23.203 -p tcp -j DROP sudo iptables -I INPUT -s 111.31.36.189 -p tcp -j DROP sudo iptables -I INPUT -s 120.92.74.246 -p tcp -j DROP sudo iptables -I INPUT -s 120.92.34.89 -p tcp -j DROP sudo iptables -I INPUT -s 39.156.80.78 -p tcp -j DROP sudo iptables -I INPUT -s 120.92.106.21 -p tcp -j DROP sudo iptables -I INPUT -s 110.43.67.230 -p tcp -j DROP sudo iptables -I INPUT -s 120.232.170.41 -p tcp -j DROP sudo iptables -I INPUT -s 183.214.1.252 -p tcp -j DROP sudo iptables -I INPUT -s 120.131.2.130 -p tcp -j DROP sudo iptables -I INPUT -s 111.31.36.189 -p tcp -j DROP sudo iptables -I INPUT -s 121.36.23.203 -p tcp -j DROP sudo iptables -I INPUT -s 111.31.36.189 -p tcp -j DROP sudo iptables -I INPUT -s 120.92.74.246 -p tcp -j DROP sudo iptables -I INPUT -s 110.43.89.138 -p tcp -j DROP
-
(2)在过滤规则条数很多的情况下,应该如何设计规则链表,来提高 Iptables的过滤效率?
iptables的规则匹配是按顺序匹配的,这就会造成随着规则数量的增加,效率会下降的问题,解决方向和方案如下:
① 管理IP
-
ipset:通过IP集合的方式管理itables,集合可以动态修改
#创建一个名为myipset的集合,timeout 0允许新增IP带时间参数,最大存储IP数量是1000000 ipset create -exist myipset hash:net family inet hashsize 1024 maxelem 1000000 timeout 0 #添加一个关于ipset myipset的 iptables规则, iptables -I INPUT -m set --match-set myipset src -j DROP #添加IP 1.2.3.4到myset中,并且timeout是3600秒 ipset -exist add myipset 1.2.3.4 timeout 3600
② 管理规则
另一个方向是如何设置规则匹配数据包,使得大多数的不可能匹配的数据包不用去一一匹配每一条规则。基本上这种想法有两套方案:
- 手动分类–自定义链:
- 优点:可以自由定义规则筛选地址,拥有更大的灵活性
- 缺点:需要配置者对本网络的流量类型很熟悉。比如说你想开放几个不连续的地址访问80端口,使用ipset有点大材小用了,但是你也不必写下如下的规则:
iptables -A FORWARD -s ip1 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s ip2 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s ip3 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s ip4 -p tcp --dport 80 -j ACCEPT
如果你这么写了,那么每一个数据包都要匹配所有的规则,你要这么写:
iptables -N SB_FORWARD
iptables -A SB_FORWARD -s ip1 -j ACCEPT
iptables -A SB_FORWARD -s ip2 -j ACCEPT
iptables -A SB_FORWARD -s ip3 -j ACCEPT
iptables -A SB_FORWARD -s ip4 -j ACCEPT
iptables -A FORWARD -p tcp --dport 80 -j SB_FORWARD
如此一来,大多数数据包仅仅需要匹配一个规则即可,那就是最后的那条规则,一旦不匹配就不需要继续了。这实际上是将共同的东西抽象了出来,将线形的规则进行了分类。Netfilter提供了自定义链的机制来使用户可以将一维链表存储的规则放到多维链表中。
-
自动分类–借助hipac算法:将报文分类抽象为多维的范围匹配问题,让内核自己分类数据包
使用一个Netfilter新的包分类机制完成的,它自动进行包分类,使用多维的树来维护规则而不是使用一维链表,在匹配方式上不是用规则来匹配数据包,而是用基于多维树分类的数据包来匹配存于多维树的规则,在存在大量离散规则的情况下,效果显著
(3)分析若干种现有流行的攻击方法,如何有针对性地设计 Iptables 的高级过滤规则?
-
SYN攻击
-
限制syn的请求速度:需要调节一个合理的速度值,不然会影响正常用户的请求
iptables -N syn-flood iptables -A INPUT -p tcp --syn -j syn-flood iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN iptables -A syn-flood -j DROP
-
限制单个ip的最大syn连接数
iptables –A INPUT –i eth0 –p tcp --syn -m connlimit --connlimit-above 15 -j DROP
-
-
DOS攻击:利用recent模块抵御DOS攻击
-
单个IP最多连接3个会话
iptables -I INPUT -p tcp -dport 22 -m connlimit --connlimit-above 3 -j DROP
-
新的连接请求加入到SSH列表
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
-
5分钟内你的尝试次数达到3次,就拒绝提供SSH列表中的这个IP服务。被限制5分钟后即可恢复访问
Iptables -I INPUT -p tcp --dport 22 -m state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
-
-
单个IP过度访问
-
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j DROP
-
-
木马反弹
-
iptables –A OUTPUT –m state --state NEW –j DROP
-
-
ping攻击
-
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/m -j ACCEPT
-
参考链接: