nftables - IPv6 端口敲门 - 接受整个子网
nftables - IPv6 port knocking - accept whole subnet
我想向已经工作的服务器添加端口敲门。我的客户端发送了神奇的数据包序列,服务器将在特定时间将其添加到允许客户端的 nftables 集中。因此允许客户使用一些服务。有关详细信息,请参阅下面我的配置。
现在我想从我的路由器自动敲端口。对于 IPv4 这可行,但对于 IPv6 这不起作用,因为不涉及 NAT,因此每个客户端都有一个唯一的地址。这就是为什么我想将敲门客户端的整个子网 (/56) 添加到允许的客户端集。
这可以使用 nftables 吗?我读过 "flags interval",但我不明白如何向其中动态添加客户端子网。
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
}
}
我想向已经工作的服务器添加端口敲门。我的客户端发送了神奇的数据包序列,服务器将在特定时间将其添加到允许客户端的 nftables 集中。因此允许客户使用一些服务。有关详细信息,请参阅下面我的配置。
现在我想从我的路由器自动敲端口。对于 IPv4 这可行,但对于 IPv6 这不起作用,因为不涉及 NAT,因此每个客户端都有一个唯一的地址。这就是为什么我想将敲门客户端的整个子网 (/56) 添加到允许的客户端集。
这可以使用 nftables 吗?我读过 "flags interval",但我不明白如何向其中动态添加客户端子网。
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
}
}