我想为已经工作的服务器添加端口敲门。我的客户端发送神奇的数据包序列,服务器会将其添加到特定时间内允许的客户端的nftables集合中。因此,允许客户端使用一些服务。有关详细信息,请参阅下面的配置。
现在我想从我的路由器上自动敲端口。对于IPv4,这是有效的,但对于IPv6,这不起作用,因为没有涉及NAT,所以每个客户端都有一个唯一的地址。这就是为什么我想将敲门客户端的整个子网(/56(添加到允许的客户端集。
这可能使用nftables吗?我读过关于"标志间隔"的文章,但我不知道如何动态地将客户端子网添加到其中
chain input {
...
jump port_knocking
...
}
set knock_v6_1 {
type ipv6_addr
flags timeout
}
set knock_v6_2 {
type ipv6_addr
flags timeout
}
set knock_v6_success {
type ipv6_addr
flags timeout
}
chain port_knocking {
ip6 nexthdr icmpv6 ip6 length 100 set update ip6 saddr @knock_v6_1
ip6 saddr @knock_v6_1 ip6 nexthdr icmpv6 ip6 length 101 set update ip6 saddr timeout 10s @knock_v6_2
ip6 saddr @knock_v6_2 ip6 nexthdr icmpv6 ip6 length 102 set update ip6 saddr timeout 10s @knock_v6_success
}
成功敲端口后,不要添加客户端的源ip,而是使用port_knock_netmask_v6
屏蔽它。在检查成功敲门后新连接是否源自客户端时,也使用port_knock_netmask_v6
屏蔽它。
define port_knock_netmask_v6 = ffff:ffff:ffff:ff::
table inet filter {
chain input {
...
jump port_knocking
tcp dport 22 ip6 saddr & $port_knock_netmask_v6 @knock_v6_success accept
...
}
set knock_v6_1 {
type ipv6_addr
flags timeout
}
set knock_v6_2 {
type ipv6_addr
flags timeout
}
set knock_v6_success {
type ipv6_addr
flags timeout
}
chain port_knocking {
ip6 nexthdr icmpv6 ip6 length 100 set update ip6 saddr timeout 10s @knock_v6_1
ip6 saddr @knock_v6_1 ip6 nexthdr icmpv6 ip6 length 101 set update ip6 saddr timeout 10s @knock_v6_2
ip6 saddr @knock_v6_2 ip6 nexthdr icmpv6 ip6 length 102 set update ip6 saddr & $port_knock_netmask_v6 timeout 1h @knock_v6_success
}
}