我在用扭曲者在我的 Android 手机上在我的 Linux 机器和手机之间传输文件。
该应用程序使用端口进行42001
初始连接和42000
数据传输。我相信它使用 TCP。
我使用 nftables 作为我的防火墙,我最近从firewalld 切换过来。我还没能完全掌握nftables。
我想在开始应用程序之前暂时允许我的电脑上的这两个端口42000,42001
,并在完成后关闭这些端口。
我希望我现有的规则继续下去,临时添加这些规则,如果可能的话,他们会使用 bash/nft 脚本删除它们。
是否可以。
我很欣赏任何有洞察力的指导。
我的系统中有以下简单的默认配置/etc/nftables.conf
#!/usr/bin/nft -f
# vim:set ts=2 sw=2 et:
# IPv4/IPv6 Simple & Safe firewall ruleset.
# More examples in /usr/share/nftables/ and /usr/share/doc/nftables/examples/.
table inet filter
delete table inet filter
table inet filter {
chain input {
type filter hook input priority filter
policy drop
ct state invalid drop comment "early drop of invalid connections"
ct state {established, related} accept comment "allow tracked connections"
iifname lo accept comment "allow from loopback"
ip protocol icmp accept comment "allow icmp"
meta l4proto ipv6-icmp accept comment "allow icmp v6"
tcp dport ssh accept comment "allow sshd"
pkttype host limit rate 5/second counter reject with icmpx type admin-prohibited
counter
}
chain forward {
type filter hook forward priority filter
policy drop
}
}
预先感谢
答案1
在这种情况下我要做的是为您的临时访问配置一个链:
在下面,“表”是“过滤器”(基于您的示例),我使用“warpinator”作为这些规则的标识符。 (例如,表名实际上并不重要,而且我总是发现以这种方式使用“保留字”非常令人困惑)
# Create a new chain and counter for this purpose.
create chain inet filter warpinator
add counter inet filter warpinator
# add a rule to the chain
add rule inet filter warpinator tcp dport { 42000, 42001 } log prefix "WARPINATOR: " counter name "warpinator" accept
# insert a 'jump' condition to your input chain to inspect traffic
add rule inet filter input jump warpinator
这将使入站流量能够从任何源到这些端口。
您可能想通过以下方式更积极地限制这一点:
add rule inet filter warpinator tcp dport { 42000, 42001 } ip saddr 192.168.0.0/24 ....
这会将其限制为该地址范围内的地址(192.168.0.1-192.168.0.255) - 也许选择您的“家庭”网络范围?
将其保存为 nft 脚本(也许在 /etc/nftables 中?),然后您可以:
- 将其包含在您的
main.nft
一行中include
。 - 临时运行它
nft -f <script>
因为您的“nft”配置包含delete table inet filter
您可以重新加载它以再次删除规则。nft -f <main policy>
或者,您可以保留定义的链(在 main.nft 中),并启用:
add rule inet filter input jump warpinator
当你需要它的时候。
如果您愿意,您可以从策略中删除规则,但这并不像您需要“规则 ID”那么简单。
例如运行:
nft -a list ruleset
查找“跳转”规则的“处理 ID”,然后通过处理编号将其删除。所以我认为重新加载“基线”来关闭端口就是正确的方法。
答案2
该应用程序使用 42001 端口进行初始连接,使用 42000 端口进行数据传输。我相信它使用 TCP。
在开始应用程序之前,我想在我的电脑上暂时允许这两个端口 42000,42001,完成后,我想关闭这些端口。
暂时允许端口不可能自动完成,唯一的方法是根据需要手动添加和删除特定规则,但可能很快就会变得无聊。
此问题的标准解决方案是创建基于状态过滤的限制性规则。
由于端口42000
用于数据传输,这意味着它必须仅允许用于established
连接,因此始终启用该规则不会有什么害处,因为端口42000
将为新连接关闭。
只有端口42001
被认为是有问题的,解决方案是将其仅应用于new
连接并且仅应用于足够安全的本地子网。
例子:
首先为established
和new
连接创建自定义链:
nft add chain inet filter established_in {
comment "Established input traffic"
}
nft add chain inet filter new_in {
comment "New input traffic"
}
下一步是与这些链关联related
并进行流量:new
nft add rule filter input ct state established goto established_in
nft add rule filter input ct state new goto new_in
这将使established
流量被established_in
链过滤,new
流量被new_in
链过滤。
这些链被“添加”到input
链中,该链将重定向过滤到基于状态的链established_in
。new_in
接下来我们向那些允许Warpinator
连接的链添加规则,您只需将saddr
下面的地址更新为您的本地子网,以便只允许您本地网络上的设备。
或者,您可以将其限制为您的 Android IP 地址!
add rule filter new_in ip saddr 192.168.1.0/24 tcp dport 42001 accept
add rule filter established_in ip saddr 192.168.1.0/24 tcp dport 42000 accept
下一步是添加input
您已经允许的所有其他规则established
以及new
与这些链的连接。
这些是(根据您的样本):
iifname lo accept comment "allow from loopback"
ip protocol icmp accept comment "allow icmp"
meta l4proto ipv6-icmp accept comment "allow icmp v6"
tcp dport ssh accept comment "allow sshd"
pkttype host limit rate 5/second counter reject with icmpx type admin-prohibited counter
将这些规则添加到自定义链后,最后一步是阻止这些链中的其他所有内容,因此我们添加默认的阻止规则:
nft add rule filter established_in drop
nft add rule filter new_in drop
input
然后,您的其他规则也会添加到基础链中,这些规则是:
ct state invalid drop comment "early drop of invalid connections"
iifname lo accept comment "allow from loopback"
ip protocol icmp accept comment "allow icmp"
meta l4proto ipv6-icmp accept comment "allow icmp v6"
tcp dport ssh accept comment "allow sshd"
pkttype host limit rate 5/second counter reject with icmpx type admin-prohibited counter
重要的是要知道,established
连接(由established_in
链处理)是单独处理的,而new
连接(由new_in
链处理)也是单独处理的,其他所有内容related
和invalid
流量都是由input
链处理的,链也重定向established
和new
连接到相应的链。
这种方法的好处是,42000
除非首先访问端口,否则端口不会打开42001
,只有安全的本地网络才能访问该端口。