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 下的一款常用防火墙,尽管已经很简化使用方法了,但像我这样的普通用户,如果对防火墙一知半解,也是无法有效地构建起网络防护的。所以,如果有网络安全意识的用户,应该尽早熟悉起它。

Leave a comment

Your comment