nftables 如何临时允许应用程序使用端口

nftables 如何临时允许应用程序使用端口

我在用扭曲者在我的 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连接并且仅应用于足够安全的本地子网。

例子:

首先为establishednew连接创建自定义链:

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_innew_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链处理)也是单独处理的,其他所有内容relatedinvalid流量都是由input链处理的,链也重定向establishednew连接到相应的链。

这种方法的好处是,42000除非首先访问端口,否则端口不会打开42001,只有安全的本地网络才能访问该端口。

相关内容