标签归档:firewall

安利个新玩意-开源的WAF

简介

WAF-是Web Application Firewall的简称,工作在第7层。之前的iptables/nftables都是基于4层的,通过ip和端口来拦截未授权的访问,但是,不可能拦截http(s)所用的端口的是吧?放通了http(s)的访问之后,有坏东西通过http协议对你的系统搞东搞西,那iptables就无能为力了。但是,WAF,就能用来保护你的网站,不让这些坏东西来搞你。让你的系统更安全。

介绍

雷池WAF

上面就是这东西的官网,名字叫做雷池,口号是“不让黑客越雷池一步”,号称还能防0day漏洞,听起来还是挺厉害的,但实际上……完全防护所有的攻击是不可能的。他们自己报出来的测试结果里面,都没法100%拦截所有攻击的流量,误报的数据也不是0,只能说套个带80%闪避的甲,比裸奔高到不知道哪里去了。

部署效果

这个Blog是加了Cloudflare的,可以拦截很多奇奇怪怪的ip直连我服务器的80/443端口,之前也觉得说上了流量过滤,时不时也看到Cloudflare报告说拦截了多少多少攻击,还是觉得挺安全的。

于是我上了这玩意试试之后发现,Cloudflare漏掉的恶意访问还真不少啊。

雷池拦截记录
详细拦截日志

部署方式

官方网站提供了一个一键脚本,可以快速部署,系统是基于docker的,所以需要docker和docker compose。这里比较注意的是,软件需要CPU支持ssse3 指令集,如果在Proxmox上跑的话,记得需要调整CPU的类别,默认的kvm64是不支持这个指令集的,需要改成x86_64v2或者更高版本。

命令行安装完毕之后。在命令行会输出随机生成的密码。默认账号是admin。

使用

添加证书

首先,需要添加一个证书,添加方法有3种,分别是

  • 上传文件
  • 复制粘贴证书/密钥文本
  • 通过ACME(http)自动签署证书

如果是80端口没有被封的话,可以走自动签署。如果80端口不幸被封(比如国内),就只能走前两种方法了。目前雷池暂时没有更新证书的API,所以只能手动操作。

添加后端服务器

首先,添加一个默认的主机,用来匹配任意的SNI,证书啥的用默认的自签署的就行。然后再创建所需的站点,写上对应的host name,如此一来,只有访问正确的域名,才会访问到对应的网站。

需要配置的内容也不多,只需要写端口,算证书,和填一下后端的地址就行。

这样,配置就通了。

其他设置

剩下的就是代理设置之类的, 全部勾选上,源ip因为我套了一层cloudflare,就只读一层。

剩下的防护配置,保持默认就行,有兴趣可以继续探索一下,反正目前可以修改的配置也不多。

RouterOS上抵挡扫描的防火墙策略

背景

因为家里的宽带是找电信要了公网IP地址的,所以互联网可以直接访问到我作为出口的RouterOS,而众所周知,互联网上扫描机不知何几,被盯上了的话也是一件相当麻烦的事。

起因

之前在玩RouterOS上的防火墙的时候,发现有一个动作,叫做“add src to address list”,能够将包的源地址添加到某个列表中。俺寻思了一下,发现这能够很好的抵挡扫描机,思路是这样的:

防火墙策略

建立防火墙策略,指定一些经常被扫描的目的端口,然后,防火墙的动作是将包的源地址添加到一个叫做sniffer的地址列表中,设定有效时间为30天,然后,让防火墙直接丢弃来自这些地址的包,这样如果某个机器尝试扫描我的出口,触发了这个机制,那这个机器就会直接被ban掉30天。

命令行的话,添加起来是这样的:

/ip firewall filter add action=drop chain=input comment="drop sniffer" in-interface=China-Telecom src-address-list=sniffer
/ip firewall filter add action=add-src-to-address-list address-list=sniffer address-list-timeout=30d chain=input comment="mark sniffer" dst-port=22,23,876,3306,3389,137,139,445,5001,6379,27017 in-interface=China-Telecom log=yes log-prefix=sniffer protocol=tcp
/ip firewall filter add action=add-src-to-address-list address-list=sniffer address-list-timeout=30d chain=input comment="mark sniffer" dst-port=22,23,876,3306,3389,137,139,445,5001,6379,27017 in-interface=China-Telecom log=yes log-prefix=sniffer protocol=udp
/ip firewall filter add action=add-src-to-address-list address-list=sniffer address-list-timeout=30d chain=input comment="mark sniffer" dst-port=2323,5555,80,81,37215,8000,8080,8081,8291,8443,53 in-interface=China-Telecom log=yes log-prefix=sniffer protocol=tcp
/ip firewall filter add action=add-src-to-address-list address-list=sniffer address-list-timeout=30d chain=input comment="mark sniffer" dst-port=2323,5555,80,81,37215,8000,8080,8081,8291,8443 in-interface=China-Telecom log=yes log-prefix=sniffer protocol=udp
/ip firewall filter add action=drop chain=input comment="drop sniffer" in-interface=China-Telecom src-address-list=sniffer

然后放着一阵子,就会在address list里面看到大量的IP地址。

继续改进

如果想要更加全面的保护,可以选择在防火墙上添加允许一些正常的策略,比如说,允许每秒不超过20个echo-request的icmp包啊之类的,然后在防火墙的末尾,加一条策略,将其他未知的包,都当作扫描机处理,一律有杀错无放过。

但是有时候,ban了对方的ip,也就意味着无法访问对方的IP地址,因为回包会被防火墙丢弃。这时候就要额外的添加一条策略,插在丢弃sniffer的策略的前面:

action是accept就可以了。这样如果是主动对外访问的话,回的包要么是related,要么是established,这样就可以正常访问被ban掉的ip。至于说udp访问可能没有这个状态标记……先暂时忽略吧,出现问题再继续改进。