firewalld 实战:给年轻人的第一个坑
1. 起因
在家庭网络中,我在一台 Gen 8 设备上部署了 transmission-deamon 服务,以便通过 BitTorrent 网络进行下载。在刚刚过去的周末里,我在下载某个热门资源时,发现一个奇怪现象。
有一组形如 122.224.33.xxx
的 IP,分走了大部分上传带宽,并且 transmission 显示其 Client 一致,且非常怪异。
通过 ss -tunp | grep 122.224.33
会到详细连接信息:
ESTAB 0 65588 192.168.1.175:53007 122.224.33.53:20826 users:(("transmission-da",pid=743,fd=59)) ESTAB 0 961224 192.168.1.175:39625 122.224.33.45:5546 users:(("transmission-da",pid=743,fd=62)) ESTAB 0 0 192.168.1.175:56411 122.224.33.56:20826 users:(("transmission-da",pid=743,fd=73)) ESTAB 0 0 192.168.1.175:60235 122.224.33.54:20826 users:(("transmission-da",pid=743,fd=57)) ESTAB 0 0 192.168.1.175:43077 122.224.33.52:20826 users:(("transmission-da",pid=743,fd=63)) ESTAB 0 1015474 192.168.1.175:50017 122.224.33.47:5546 users:(("transmission-da",pid=743,fd=64)) ESTAB 0 62588 192.168.1.175:33449 122.224.33.57:20826 users:(("transmission-da",pid=743,fd=71))
BitTorrent 网络里本地设备要进行上传,这本身是再很正常不过的事情。但是挤占带宽、IP 集中、客户端相同,这几个特征凑在一起,就显得不那么正常了。
果不其然,找到有网友反馈这是一种新型的刷流量的流氓行为:关于近期anacrolix等无限下载的BT工具的说明与对策、关于最近BT吸血事件的防范方法图文教程。
原来在 PCDN 这种商业模式下,滋生出一种的怪异的逻辑:参与者的上传流量异常大,以致于“触怒” ISP ,于是根据上传/下载之比来判断这部分人群是否合规。但上有政策,下有对策,他们想到了通过 BitTorrent 网络大量下载,以拉高下载流量,使得比值看起来正常。这种恶心别人的玩法,实属猥琐。
2. 第一次操作:阻断进站(Ingress)请求
虽然相关资料显示这部分人群还不小,但这次就先把恶心到我的 122.224.33.0/24
阻断起来。
安装 firewalld 的过程就先在这里赘述了,直接使用 firewall-cmd 添加 CIDR (无类域间路由,Classes Inter-Domain Routing):
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='122.224.33.0/24' reject" firewall-cmd --reload
其中,所使用到的参数如下:
--permanent
- 表示将规则永久保存,如果不加这个选项,规则只会临时生效,重启防火墙或系统后规则会丢失。
--add-rich-rule
- 用于添加一条富规则(rich rule),其中:
rule family='ipv4'
- 这指定了规则的地址族为IPv4。这意味着规则仅适用于IPv4流量。
source address='122.224.33.0/24'
- 这指定了规则的源地址范围。
reject
- 规则的动作,表示拒绝来自指定源地址的流量。
执行完上述命令后,发现并不起到作用,连接仍然存在,甚至重启也不起作用,非常奇怪。第一次操作,失败!
3. 第二次操作:阻断出站(Egress)请求
一计不成再生一计,无法阻断来自 122.224.33.0/24
的入站,那就想办法阻断发往 122.224.33.0/24
的出站:
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' destination address='122.224.33.0/24' reject" firewall-cmd --reload
再次查看网络连接,发现问题依旧。第二次操作,失败!
4. 第三次操作:阻断出站(Egress)请求
连续两次失败后,赶紧查阅资料,才发现在缺少对 firewalld(以及 iptables 和 nftables)的基本认知下,前面的操作都是盲目的。它们主要使用三条链,即 INPUT、OUTPUT、FORWARD 链(Chain) 来管理不同流量方向的规则。
--add-rich-rule
操作的是 INPUT 链,而第一次操作不起作用,是因为连接是由本地设备,也就是 Gen 8 (192.168.1.175)主动发起的,不归 INPUT 链管理。
第二次操作失败,就更是荒谬了,因为对于入站请求来说,~destination address~ 是“我”,–不能望文生义,以为是出站流量。
要阻断 Transmission 向目标 IP 发起请求,要靠操作 OUTPUT 链:
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -d 122.224.33.0/24 -j REJECT firewall-cmd --reload
其中所用到的选项说明如下:
--direct
- 告诉 firewalld :直接向底层的 nftables 添加规则,绕过 firewalld 默认的 zone 和服务规则。
--add-rule
- 添加规则:
ipv4
- 指定了该规则是针对 IPv4 流量的。
filter
- 指 nftables 中的默认链(chain)即 INPUT、OUTPUT、FORWARD。
OUTPUT
- 指该规则应用于 OUTPUT 链,即控制从设备发出的流量
0
- 表示规则的优先级。规则的数字越小,优先级越高。0 表示这个规则是最优先的,优先处理。
还有两个选项,就更简单明了些:
-d 122.224.33.0/24
- 目标地址。
- -j REJECT
- 即动作(Action),REJECT 表示拒绝该流量,并发送一个拒绝响应给源主机。也可以考虑
DROP
,表示直接丢弃流量,不给源主机任何响应。
这一次,终于网络清净了!
5. 总结
很久以来,我都认为防火墙是服务器才需要配置的,个人计算机使用这个纯属自找苦吃。其实不然,服务器固然需要可靠的安全防护,个人计算机也是如此。
以往可以躲在 IPv4 NAT 下,减少很多攻击,现在随着 IPv6 普及开来,即便是局域网下的个人计算机也越来越多地使用公网 IP 访问因特网,也就使得它们更多地暴露在未知的网络攻击下。
firewalld 是 Linux 下的一款常用防火墙,尽管已经很简化使用方法了,但像我这样的普通用户,如果对防火墙一知半解,也是无法有效地构建起网络防护的。所以,如果有网络安全意识的用户,应该尽早熟悉起它。