nftables - стук порта IPv6 - принять всю подсеть - PullRequest
0 голосов
/ 15 апреля 2020

Я бы хотел добавить стук портов на сервер, который уже работает. Мой клиент отправляет последовательность пакетов magi c, и сервер добавляет ее в набор разрешенных клиентов nftables в течение указанного c времени. Для этого клиентам разрешено пользоваться некоторыми услугами. Подробнее см. Мою конфигурацию ниже.

Теперь я хочу автоматически выбить порт из моего маршрутизатора. Для IPv4 это работает, но для IPv6 это не работает, потому что не задействован NAT, поэтому каждый клиент имеет уникальный адрес. Вот почему я хотел бы добавить весь su bnet (/ 56) клиента для стука в набор разрешенных клиентов.

Возможно ли это с помощью nftables? Я читал об «интервале флагов», но не понимаю, как динамически добавлять к нему клиентов su bnet.

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
}

1 Ответ

0 голосов
/ 27 апреля 2020

После успешного стука порта не добавляйте исходный 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
    }

}
...