The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Раздел полезных советов: Пример правил nftables с реализацией port knoсking для открытия доступа к SSH"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Раздел полезных советов: Пример правил nftables с реализацией port knoсking для открытия доступа к SSH"  +/
Сообщение от auto_tips (ok), 01-Апр-23, 08:03 
Общий набор правил для nftables с реализацией техники "port knoсking", позволяющей организовать временное открытие сетевого порта к SSH только после предварительной попытки соединения к определённой последовательности портов (порты задаются в параметрах "define ssh_port_knock_[1234]").


   #!/usr/bin/env -S bash -c 'nft -cof "${0}" && nft -f "${0}"'

   flush ruleset

   table inet filter {

       define sshd_port = 2299;

       set ssh_bad_ipv4_set {
           type ipv4_addr;
           flags dynamic;
           timeout 15m;
       }

       set ssh_bad_ipv6_set {
           type ipv6_addr;
           flags dynamic;
           timeout 15m;
       }

       set ssh_clients_ipv4_set {
           type ipv4_addr;
           flags dynamic;
           timeout 3s;
       }

       set ssh_clients_ipv6_set {
           type ipv6_addr;
           flags dynamic;
           timeout 3s;
       }

       set ssh_clients_candidates_ipv4_set {
           type ipv4_addr . inet_service;
           flags dynamic;
           timeout 1s;
       }

       set ssh_clients_candidates_ipv6_set {
           type ipv6_addr . inet_service;
           flags dynamic;
           timeout 1s;
       }

       ### printf %d\\n 0x$(openssl rand -hex 2)
       define ssh_port_knock_1 = changeme1;
       define ssh_port_knock_2 = changeme2;
       define ssh_port_knock_3 = changeme3;
       define ssh_port_knock_4 = changeme4;

       ### opened ports
       set serving_tcp_ports_set {
           type inet_service;
           flags constant;
   #        elements = {
   #            http,
   #            https,
   #        };
       }

       set trusted_ipv4_set {
           type ipv4_addr;
           flags constant, interval;
           elements = {
               169.254.169.254,
               10.0.0.0/8,
               192.168.0.0/16,
           };
       }

       set trusted_ipv6_set {
           type ipv6_addr;
           flags constant, interval;
           elements = {
               fd00:ec2::254,
           };
       }

       define dns_resolvers = {
           0.0.0.0/0,
       }

       define allowed_icmp_types_input = {
           echo-reply,
           echo-request,
           destination-unreachable,
       }

       define allowed_icmp_types_output = {
           echo-reply,
           echo-request,
           destination-unreachable,
       }

       ### rfc4890; assist mobility candidate codes: 144, 145, 146, 147
       define allowed_icmpv6_types_input = {
           echo-reply,
           echo-request,
           destination-unreachable,
           packet-too-big,
           time-exceeded,
           parameter-problem,
           nd-router-solicit,
           nd-router-advert,
           nd-neighbor-solicit,
           nd-neighbor-advert,
           ind-neighbor-solicit,
           ind-neighbor-advert,
           mld-listener-query,
           mld-listener-report,
           mld-listener-done,
           mld2-listener-report,
       }

       ### rfc4890; assist mobility candidate codes: 144, 145, 146, 147
       define allowed_icmpv6_types_output = {
           echo-reply,
           echo-request,
           destination-unreachable,
           packet-too-big,
           time-exceeded,
           parameter-problem,
           nd-router-solicit,
           nd-router-advert,
           nd-neighbor-solicit,
           nd-neighbor-advert,
           ind-neighbor-solicit,
           ind-neighbor-advert,
           mld-listener-query,
           mld-listener-report,
           mld-listener-done,
           mld2-listener-report,
       }

       chain INPUT {
           type filter hook input priority filter + 20; policy drop;

           iif lo accept comment "accept input connections via loopback";
           iif != lo ip saddr 127.0.0.0/8 counter drop comment "drop loopback connections not coming from loopback";
           iif != lo ip daddr 127.0.0.0/8 counter drop comment "drop loopback connections not coming from loopback";
           iif != lo ip6 saddr ::1/128 counter drop comment "drop loopback connections not coming from loopback";
           iif != lo ip6 daddr ::1/128 counter drop comment "drop loopback connections not coming from loopback";

           ### as little rules as possible for trusted hosts
           ip saddr @trusted_ipv4_set accept comment "accept trusted hosts";
           ip6 saddr @trusted_ipv6_set accept comment "accept trusted hosts";

           ### before ct
           meta l4proto icmp icmp type $allowed_icmp_types_input limit rate 10/second burst 20 packets counter accept comment "accept icmp with limits";
           meta l4proto icmpv6 icmpv6 type $allowed_icmpv6_types_input limit rate 10/second burst 20 packets counter accept comment "accept icmpv6 with limits";
           meta l4proto { icmp, icmpv6 } counter drop comment "drop icmp over limit";

           ct state vmap { established : accept, related : accept, invalid : drop };

           tcp dport @serving_tcp_ports_set ct state new counter accept comment "accept connections to serving tcp ports";

           ### port knocking
           #tcp dport $ssh_port_knock_1 add @ssh_clients_candidates_ipv4_set { ip saddr . $ssh_port_knock_2 };
           #tcp dport $ssh_port_knock_1 add @ssh_clients_candidates_ipv6_set { ip6 saddr . $ssh_port_knock_2 };
           #tcp dport $ssh_port_knock_2 ip saddr . tcp dport @ssh_clients_candidates_ipv4_set add @ssh_clients_candidates_ipv4_set { ip saddr . $ssh_port_knock_3 };
           #tcp dport $ssh_port_knock_2 ip6 saddr . tcp dport @ssh_clients_candidates_ipv6_set add @ssh_clients_candidates_ipv6_set { ip6 saddr . $ssh_port_knock_3 };
           #tcp dport $ssh_port_knock_3 ip saddr . tcp dport @ssh_clients_candidates_ipv4_set add @ssh_clients_candidates_ipv4_set { ip saddr . $ssh_port_knock_4 };
           #tcp dport $ssh_port_knock_3 ip6 saddr . tcp dport @ssh_clients_candidates_ipv6_set add @ssh_clients_candidates_ipv6_set { ip6 saddr . $ssh_port_knock_4 };
           #tcp dport $ssh_port_knock_4 ip saddr . tcp dport @ssh_clients_candidates_ipv4_set add @ssh_clients_ipv4_set { ip saddr } counter log prefix "ssh port knocked : ";
           #tcp dport $ssh_port_knock_4 ip6 saddr . tcp dport @ssh_clients_candidates_ipv6_set add @ssh_clients_ipv6_set { ip6 saddr } counter log prefix "ssh port knocked : ";
           #tcp dport $sshd_port ip saddr @ssh_clients_ipv4_set counter accept;
           #tcp dport $sshd_port ip6 saddr @ssh_clients_ipv6_set counter accept;

           ### rate limits
           tcp dport $sshd_port ct state new, untracked meter ssh_conns_ratemeter4 { ip saddr timeout 5m limit rate over 1/minute burst 7 packets } counter update @ssh_bad_ipv4_set { ip saddr } comment "update ssh bruteforce set with saddr of attacker; hint: nft list meter inet filter ssh_conns_ratemeter4";
           tcp dport $sshd_port ct state new, untracked meter ssh_conns_ratemeter6 { ip6 saddr timeout 5m limit rate over 1/minute burst 7 packets } counter update @ssh_bad_ipv6_set { ip6 saddr } comment "update ssh bruteforce set with saddr of attacker; hint: nft list meter inet filter ssh_conns_ratemeter6";
           tcp dport $sshd_port ip saddr @ssh_bad_ipv4_set counter drop comment "drop ssh bruteforce; hint: nft list set inet filter ssh_bad_ipv4_set";
           tcp dport $sshd_port ip6 saddr @ssh_bad_ipv6_set counter drop comment "drop ssh bruteforce; hint: nft list set inet filter ssh_bad_ipv6_set";
           tcp dport $sshd_port counter accept comment "accept ssh connections";

           ### new rules place here:

           counter comment "count dropped packets";
           #log prefix "nft drop IN : " comment "log dropped packets";
       }

       chain OUTPUT {
           type filter hook output priority filter + 20; policy drop;

           oif lo accept comment "accept input connections via loopback";
           oif != lo ip saddr 127.0.0.0/8 counter drop comment "drop loopback connections not coming from loopback";
           oif != lo ip daddr 127.0.0.0/8 counter drop comment "drop loopback connections not coming from loopback";
           oif != lo ip6 saddr ::1/128 counter drop comment "drop loopback connections not coming from loopback";
           oif != lo ip6 daddr ::1/128 counter drop comment "drop loopback connections not coming from loopback";

           ### as little rules as possible for trusted hosts
           ip daddr @trusted_ipv4_set accept comment "accept trusted hosts";
           ip6 daddr @trusted_ipv6_set accept comment "accept trusted hosts";

           ### before ct
           meta l4proto icmp icmp type $allowed_icmp_types_output limit rate 10/second burst 20 packets counter accept comment "accept icmp with limits";
           meta l4proto icmpv6 icmpv6 type $allowed_icmpv6_types_output limit rate 10/second burst 20 packets counter accept comment "accept icmpv6 with limits";
           meta l4proto { icmp, icmpv6 } counter drop comment "drop icmp over limit";

           ct state vmap { established : accept, related : accept, invalid : drop };

           meta skuid { root, uadm, chrony } meta skgid { root, uadm, chrony } counter accept comment "accept connections from specified users";
           meta skuid postfix meta skgid postfix tcp dport { smtp, smtps, submission } counter accept comment "accept connections from postfix user";
           meta l4proto { tcp, udp } th dport 53 ip daddr $dns_resolvers counter accept comment "accept dns; for paranoia specify comma separated list of resolvers in $dns_resolvers";

           ### new rules place here:

           counter comment "count dropped packets";
           log prefix "nft drop OUT : " comment "log dropped packets";
       }

       chain FORWARD {
           type filter hook forward priority filter + 20; policy drop;

           log prefix "nft drop FWD : " comment "log dropped packets";
       }

   }

URL:
Обсуждается: http://www.opennet.me/tips/info/3219.shtml

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по ответам | RSS]

1. Сообщение от sabitov (ok), 01-Апр-23, 08:03   +1 +/
"chain OUTPUT" -- комментарии при обработке лупбека неправильные. Понятно, что копипаста рулит, но не до такой же степени! :)
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #4

2. Сообщение от sabitov (ok), 01-Апр-23, 08:19   +/
Ну, и если тешить паранойю, то icmpv6 лучше проверять отдельным правилом, т.к. он реально нихрена непростой :(

У меня так:

add rule  inet fw input_icmpv6 \
        ip6 saddr @lan_list_6 \
        icmpv6 type echo-request \
                accept

add rule  inet fw input_icmpv6 \
        ip6 nexthdr icmpv6 \
        icmpv6 type echo-request \
                limit rate 15/minute \
                accept

#Router Solicitation
add rule  inet fw input_icmpv6 \
        ip6 saddr { fe80::/10, 2001:db8::/48, ::0/128 } \
        ip6 daddr { ff02::2 } \
        ip6 hoplimit 255 \
        icmpv6 type 133 \
        icmpv6 code 0 \
                accept

#Neighbor Solicitation
add rule  inet fw input_icmpv6 \
        ip6 saddr { fe80::/10, 2001:db8::/48, ::0/128 } \
        ip6 daddr { fe80::/10, 2001:db8::/48, ff02::0001:ff00:0/104 } \
        ip6 hoplimit 255 \
        icmpv6 type 135 \
        icmpv6 code 0 \
                accept

#Router Advertisement
#Neighbor Advertisement
add rule  inet fw input_icmpv6 \
        ip6 saddr { fe80::/10, 2001:db8::/48 } \
        ip6 daddr { ff02::1, fe80::/10, 2001:db8::/48 } \
        ip6 hoplimit 255 \
        icmpv6 type { 134, 136 } \
        icmpv6 code 0 \
                accept

add rule  inet fw input_icmpv6 \
        ip6 nexthdr icmpv6 \
        icmpv6 type { 1, 2, 3, 4 } \
                accept

Не настаиваю, но вдруг пригодится :)

Ответить | Правка | Наверх | Cообщить модератору
Ответы: #5

3. Сообщение от anonymous (??), 01-Апр-23, 13:18   +/
Для включения port knocking нужно закомментировать правила в ### rate limits и раскомментировать - в ### port knocking.

И конечно, заменить changeme[1-4] номерами портов.

Ответить | Правка | Наверх | Cообщить модератору

4. Сообщение от umask (?), 02-Апр-23, 01:04   +/
Так лучше? :)

Я, если честно, думал что возникнет вопрос, прежде всего, про iif daddr/oif saddr пары в правилах input/output для loopback. Но мне это не кажется избыточным.


   #!/usr/bin/env -S bash -c 'nft -cof "${0}" && nft -f "${0}"'

   flush ruleset

   table inet filter {

       define sshd_port = 2299;

       set ssh_bad_ipv4_set {
           type ipv4_addr;
           flags dynamic;
           timeout 15m;
       }

       set ssh_bad_ipv6_set {
           type ipv6_addr;
           flags dynamic;
           timeout 15m;
       }

       set ssh_clients_ipv4_set {
           type ipv4_addr;
           flags dynamic;
           timeout 3s;
       }

       set ssh_clients_ipv6_set {
           type ipv6_addr;
           flags dynamic;
           timeout 3s;
       }

       set ssh_clients_candidates_ipv4_set {
           type ipv4_addr . inet_service;
           flags dynamic;
           timeout 1s;
       }

       set ssh_clients_candidates_ipv6_set {
           type ipv6_addr . inet_service;
           flags dynamic;
           timeout 1s;
       }

       ### printf %d\\n 0x$(openssl rand -hex 2)
       define ssh_port_knock_1 = changeme1;
       define ssh_port_knock_2 = changeme2;
       define ssh_port_knock_3 = changeme3;
       define ssh_port_knock_4 = changeme4;

       ### opened ports
       set serving_tcp_ports_set {
           type inet_service;
           flags constant;
   #        elements = {
   #            http,
   #            https,
   #        };
       }

       set trusted_ipv4_set {
           type ipv4_addr;
           flags constant, interval;
           elements = {
               169.254.169.254,
               10.0.0.0/8,
               192.168.0.0/16,
           };
       }

       set trusted_ipv6_set {
           type ipv6_addr;
           flags constant, interval;
           elements = {
               fd00:ec2::254,
           };
       }

       define dns_resolvers = {
           0.0.0.0/0,
       }

       define allowed_icmp_types_input = {
           echo-reply,
           echo-request,
           destination-unreachable,
       }

       define allowed_icmp_types_output = {
           echo-reply,
           echo-request,
           destination-unreachable,
       }

       ### rfc4890; assist mobility candidate codes: 144, 145, 146, 147
       define allowed_icmpv6_types_input = {
           echo-reply,
           echo-request,
           destination-unreachable,
           packet-too-big,
           time-exceeded,
           parameter-problem,
           nd-router-solicit,
           nd-router-advert,
           nd-neighbor-solicit,
           nd-neighbor-advert,
           ind-neighbor-solicit,
           ind-neighbor-advert,
           mld-listener-query,
           mld-listener-report,
           mld-listener-done,
           mld2-listener-report,
       }

       ### rfc4890; assist mobility candidate codes: 144, 145, 146, 147
       define allowed_icmpv6_types_output = {
           echo-reply,
           echo-request,
           destination-unreachable,
           packet-too-big,
           time-exceeded,
           parameter-problem,
           nd-router-solicit,
           nd-router-advert,
           nd-neighbor-solicit,
           nd-neighbor-advert,
           ind-neighbor-solicit,
           ind-neighbor-advert,
           mld-listener-query,
           mld-listener-report,
           mld-listener-done,
           mld2-listener-report,
       }

       chain INPUT {
           type filter hook input priority filter + 20; policy drop;

           iif lo accept comment "accept input connections via loopback";
           iif != lo ip saddr 127.0.0.0/8 counter drop comment "drop loopback connections not coming from loopback";
           iif != lo ip daddr 127.0.0.0/8 counter drop comment "drop loopback connections not coming from loopback";
           iif != lo ip6 saddr ::1/128 counter drop comment "drop loopback connections not coming from loopback";
           iif != lo ip6 daddr ::1/128 counter drop comment "drop loopback connections not coming from loopback";

           ### as little rules as possible for trusted hosts
           ip saddr @trusted_ipv4_set accept comment "accept trusted hosts";
           ip6 saddr @trusted_ipv6_set accept comment "accept trusted hosts";

           ### before ct
           meta l4proto icmp icmp type $allowed_icmp_types_input limit rate 10/second burst 20 packets counter accept comment "accept icmp with limits";
           meta l4proto icmpv6 icmpv6 type $allowed_icmpv6_types_input limit rate 10/second burst 20 packets counter accept comment "accept icmpv6 with limits";
           meta l4proto { icmp, icmpv6 } counter drop comment "drop icmp over limit";

           ct state vmap { established : accept, related : accept, invalid : drop };

           tcp dport @serving_tcp_ports_set ct state new counter accept comment "accept connections to serving tcp ports";

           ### port knocking
           #tcp dport $ssh_port_knock_1 add @ssh_clients_candidates_ipv4_set { ip saddr . $ssh_port_knock_2 };
           #tcp dport $ssh_port_knock_1 add @ssh_clients_candidates_ipv6_set { ip6 saddr . $ssh_port_knock_2 };
           #tcp dport $ssh_port_knock_2 ip saddr . tcp dport @ssh_clients_candidates_ipv4_set add @ssh_clients_candidates_ipv4_set { ip saddr . $ssh_port_knock_3 };
           #tcp dport $ssh_port_knock_2 ip6 saddr . tcp dport @ssh_clients_candidates_ipv6_set add @ssh_clients_candidates_ipv6_set { ip6 saddr . $ssh_port_knock_3 };
           #tcp dport $ssh_port_knock_3 ip saddr . tcp dport @ssh_clients_candidates_ipv4_set add @ssh_clients_candidates_ipv4_set { ip saddr . $ssh_port_knock_4 };
           #tcp dport $ssh_port_knock_3 ip6 saddr . tcp dport @ssh_clients_candidates_ipv6_set add @ssh_clients_candidates_ipv6_set { ip6 saddr . $ssh_port_knock_4 };
           #tcp dport $ssh_port_knock_4 ip saddr . tcp dport @ssh_clients_candidates_ipv4_set add @ssh_clients_ipv4_set { ip saddr } counter log prefix "ssh port knocked : ";
           #tcp dport $ssh_port_knock_4 ip6 saddr . tcp dport @ssh_clients_candidates_ipv6_set add @ssh_clients_ipv6_set { ip6 saddr } counter log prefix "ssh port knocked : ";
           #tcp dport $sshd_port ip saddr @ssh_clients_ipv4_set counter accept;
           #tcp dport $sshd_port ip6 saddr @ssh_clients_ipv6_set counter accept;

           ### rate limits
           tcp dport $sshd_port ct state new, untracked meter ssh_conns_ratemeter4 { ip saddr timeout 5m limit rate over 1/minute burst 7 packets } counter update @ssh_bad_ipv4_set { ip saddr } comment "update ssh bruteforce set with saddr of attacker; hint: nft list meter inet filter ssh_conns_ratemeter4";
           tcp dport $sshd_port ct state new, untracked meter ssh_conns_ratemeter6 { ip6 saddr timeout 5m limit rate over 1/minute burst 7 packets } counter update @ssh_bad_ipv6_set { ip6 saddr } comment "update ssh bruteforce set with saddr of attacker; hint: nft list meter inet filter ssh_conns_ratemeter6";
           tcp dport $sshd_port ip saddr @ssh_bad_ipv4_set counter drop comment "drop ssh bruteforce; hint: nft list set inet filter ssh_bad_ipv4_set";
           tcp dport $sshd_port ip6 saddr @ssh_bad_ipv6_set counter drop comment "drop ssh bruteforce; hint: nft list set inet filter ssh_bad_ipv6_set";
           tcp dport $sshd_port counter accept comment "accept ssh connections";

           ### new rules place here:

           counter comment "count dropped packets";
           #log prefix "nft drop IN : " comment "log dropped packets";
       }

       chain OUTPUT {
           type filter hook output priority filter + 20; policy drop;

           oif lo accept comment "accept input connections via loopback";
           oif != lo ip saddr 127.0.0.0/8 counter drop comment "drop loopback connections not coming to loopback";
           oif != lo ip daddr 127.0.0.0/8 counter drop comment "drop loopback connections not coming to loopback";
           oif != lo ip6 saddr ::1/128 counter drop comment "drop loopback connections not coming to loopback";
           oif != lo ip6 daddr ::1/128 counter drop comment "drop loopback connections not coming to loopback";

           ### as little rules as possible for trusted hosts
           ip daddr @trusted_ipv4_set accept comment "accept trusted hosts";
           ip6 daddr @trusted_ipv6_set accept comment "accept trusted hosts";

           ### before ct
           meta l4proto icmp icmp type $allowed_icmp_types_output limit rate 10/second burst 20 packets counter accept comment "accept icmp with limits";
           meta l4proto icmpv6 icmpv6 type $allowed_icmpv6_types_output limit rate 10/second burst 20 packets counter accept comment "accept icmpv6 with limits";
           meta l4proto { icmp, icmpv6 } counter drop comment "drop icmp over limit";

           ct state vmap { established : accept, related : accept, invalid : drop };

           meta skuid { root, uadm, chrony } meta skgid { root, uadm, chrony } counter accept comment "accept connections from specified users";
           meta skuid postfix meta skgid postfix tcp dport { smtp, smtps, submission } counter accept comment "accept connections from postfix user";
           meta l4proto { tcp, udp } th dport 53 ip daddr $dns_resolvers counter accept comment "accept dns; for paranoia specify comma separated list of resolvers in $dns_resolvers";

           ### new rules place here:

           counter comment "count dropped packets";
           log prefix "nft drop OUT : " comment "log dropped packets";
       }

       chain FORWARD {
           type filter hook forward priority filter + 20; policy drop;

           log prefix "nft drop FWD : " comment "log dropped packets";
       }

   }

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #1

5. Сообщение от umask (?), 02-Апр-23, 01:11   +/
>[оверквотинг удален]
>         icmpv6 code 0 \
>            
>     accept
> add rule  inet fw input_icmpv6 \
>         ip6 nexthdr icmpv6 \
>         icmpv6 type { 1,
> 2, 3, 4 } \
>            
>     accept
> Не настаиваю, но вдруг пригодится :)

Спасибо.

А можно увидеть ваш rule set полностью?

Думаю, здесь можно попробовать упросить правила через virdict map (vmap). Но нужно пробовать, насколько это будет удобно в итоге.

Ещё бы проэкспериментировать, что ядро думает на advertisement/solicitation на не link-local адреса. Возможно, что по стандарту icmp и вовсе не уйдёт дальше маршрутизатора. Да, icmp6 не прост.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #2

6. Сообщение от OpenEcho (?), 02-Апр-23, 08:01   +1 +/
Вообще сурово так, для такой задачи то...

Не проще URL knocking?
Курлишь секретный линк с клиента, мониторишь лог веб сервера с tail -f и если есть запрос по секретному линку тo просто открываешь порт для айпишника застуканного вебсервером... и простота спасет от ошибок

Ответить | Правка | Наверх | Cообщить модератору
Ответы: #10, #11

7. Сообщение от Anonx (?), 02-Апр-23, 10:06   +/
set trusted_ipv4_set {
       169.254.169.254,

Зачем метадату то в трастед?

Ответить | Правка | Наверх | Cообщить модератору

8. Сообщение от Tron is Whistling (?), 04-Апр-23, 09:51   +1 +/
Вообще из всей этой портяны неплохо бы было выделить только собственно port knocking, и его и опубликовать.
Ответить | Правка | Наверх | Cообщить модератору

9. Сообщение от Tron is Whistling (?), 04-Апр-23, 09:55   +3 +/
На iptables/recent или iptables/ipset/SET сие кстати выглядит куда читабельнее.
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #19

10. Сообщение от Tron is Whistling (?), 04-Апр-23, 09:56   +/
Есть маленькая незадачка - вёбсервер к тому времени может лечь, а чтобы поднять - надо SSH :D
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #6 Ответы: #12

11. Сообщение от Tron is Whistling (?), 04-Апр-23, 09:57   +/
Впрочем никто не мешает сделать вместо port knocking просто u32 knocking - и посылать "секретный" UDP с определённым ключом. Вот только после каждой посылки ключ менять за***ься.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #6 Ответы: #13

12. Сообщение от OpenEcho (?), 04-Апр-23, 19:31   –1 +/
> Есть маленькая незадачка - вёбсервер к тому времени может лечь, а чтобы
> поднять - надо SSH :D

И как часто веб сервера "ложаться"? И ни какого мониторинга который автоматически рестартуют, а только все ручками? Для URL-knocking можно вообще отдельный веб сервис держать на нестандартных портах и простейших веб серверах, хоть на busybox. Зато открыть SSH порт можно будет без "спец" програм стучащих по портам (особенно актуально в комадировках)

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #10 Ответы: #16, #33

13. Сообщение от OpenEcho (?), 04-Апр-23, 19:36   +/
> Впрочем никто не мешает сделать вместо port knocking просто u32 knocking -
> и посылать "секретный" UDP с определённым ключом. Вот только после каждой
> посылки ключ менять за***ься.

Это будет явный засвет для MITM (в смысле что используется какая-то технология, а значит субьект для исследования), в случае же с HTTPS секретный линк не засвечивается и в общем потоке запросов затерян

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #11 Ответы: #14, #15

14. Сообщение от Tron is Whistling (?), 05-Апр-23, 09:14   –1 +/
Ну, ещё раз повторюсь - HTTPS к тому времени может лежать, и чего делать? Ехать?
В принципе засвет кнокинга не критичен, можно даже часто не менять, потому что далее ещё SSH.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #13

15. Сообщение от Tron is Whistling (?), 05-Апр-23, 09:16   +/
Ну и опять же - можно не засвечивать. UDP бывает разный. На порт 53 например отправить традиционный DNS-запрос к некому похожему на реальный домен. И усё. Или на порт 443 инициацию квака с добавочкой.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #13

16. Сообщение от Tron is Whistling (?), 05-Апр-23, 09:19   +3 +/
Ещё раз: SSH нужен для доступа к системе в т.ч. в критических случаях. Подвязывать его на дополнительный сервис - так себе затея, но если ССЗБ - why not?

В принципе я ниже всё написал. Можно UDP отправить. Можно даже TCP SYN с единственно правильным sequence - это вообще не засвет ни разу :D

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #12 Ответы: #17

17. Сообщение от Tron is Whistling (?), 05-Апр-23, 09:21   +/
SYN кстати прикольная тема. На тот же порт, где и SSH. Выглядеть будет просто как retry.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #16

18. Сообщение от Аноним (19), 05-Апр-23, 18:32   +/
>  Автор: umask

Ложь.

Это стырено с nftables manual.

Ответить | Правка | Наверх | Cообщить модератору
Ответы: #20

19. Сообщение от Аноним (19), 05-Апр-23, 18:33   +2 +/
И примерно в 3 раза короче.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #9

20. Сообщение от Pensia2077 (?), 05-Апр-23, 23:50   +/
O_o

Ничего себе!

Весь ruleset сп*****ли?

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #18 Ответы: #21

21. Сообщение от Аноним (19), 06-Апр-23, 13:19   –1 +/
Ваш мусор до и после стыренных правил ничего не меняет.

Ссылки на оригиналы оставлять надо.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #20

22. Сообщение от Страдивариус (?), 06-Апр-23, 15:26   +/
А со стороны клиента как стучаться в это нужно и чем?
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #25

23. Сообщение от pashev.ru (?), 09-Апр-23, 00:06   –1 +/
Не надо так мудрить с шибангом.
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #24

24. Сообщение от Pensia2077 (?), 12-Апр-23, 01:26   +/
Why not?
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #23

25. Сообщение от Pensia2077 (?), 12-Апр-23, 01:27   +/
> А со стороны клиента как стучаться в это нужно и чем?

knockd/knock

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #22

26. Сообщение от Hui (?), 15-Апр-23, 12:02   +6 +/
Что за шизики пишут эти статьи....

Для создания правила port-knocking с использованием nftables для открытия порта 22 после нока на порту 1122, вы можете использовать следующую команду:

nft add rule ip filter input tcp dport 22 ct state new,untracked meta nftrace set 1 reject with tcp reset

nft add rule ip filter input tcp dport 1122 tcp flags syn meta nftrace set 1 ct state new,untracked tcp dport 22 accept


Это создаст два правила. Первое правило запрещает входящий трафик на порт 22, если он не соответствует заданным условиям. Второе правило открывает порт 22 после успешного нока на порту 1122. Важно понимать, что это только пример и вы можете изменить порты и условия в зависимости от своих потребностей.

Ответить | Правка | Наверх | Cообщить модератору

28. Сообщение от Пряник (?), 12-Май-23, 09:55   +1 +/
Никогда не понимал, зачем port knocking для SSH? Там итак где-то 1 попытка в секунду, с такой скоростью брутфорс не сработает. Лучше для уязвимых сервисов, типа RDP/VNC/SMB/IPMI. Попытка сменить SSH порт вообще забавляет. Может ещё порт SMTP/IMAP смените на 2525? Мало ли ваш postfix взломают и начнут спам слать.
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #32, #36

29. Сообщение от pavlinux (ok), 13-Июн-23, 13:49   +/
Можно traceroute/tracepath в студию, где ICMPv6 без искажений проходит?
Ответить | Правка | Наверх | Cообщить модератору

30. Сообщение от Аноним (30), 16-Июн-23, 22:49   +1 +/
Сложно очень. Я бы примерно так действовал для последовательности 1111, 2222, 3333, 4444.

# Закрыть доступ к SSH
nft add rule filter input tcp dport 22 ct state new reject

# Определить последовательность портов для порт-нокинга
nft add chain filter port_knocking { type filter hook prerouting priority 0 \; }
nft add rule filter port_knocking tcp dport 1111 tcp flags syn counter accept
nft add rule filter port_knocking tcp dport 2222 tcp flags syn recent set policy timeout seconds 15 name "knock2" counter accept
nft add rule filter port_knocking tcp dport 3333 tcp flags syn recent set policy timeout seconds 15 name "knock3" counter accept
nft add rule filter port_knocking tcp dport 4444 tcp flags syn recent set policy timeout seconds 15 name "knock4" counter accept

# Добавить временное правило на открытие доступа к SSH
nft add rule filter input tcp dport 22 ct state new ip saddr <клиент> recent check seconds 15 name "knock4" counter accept

# Установить таймер на закрытие доступа к SSH
nft add rule filter input tcp dport 22 ct state established,related,untracked counter accept

Ответить | Правка | Наверх | Cообщить модератору

31. Сообщение от Аноним (31), 26-Июн-23, 17:01   +/
Такая простыня... проще надо быть.

iptables -A INPUT -p tcp -m tcp --dport 1111 -m recent --set --name SSH0 --mask 255.255.255.255 --rsource -m comment --comment "knock-knock port for SSH" -j DROP
iptables -A INPUT -p tcp -m tcp --dport 22 -m recent --rcheck --seconds 60 --name SSH0 --mask 255.255.255.255 --rsource -m comment --comment "60 seconds for SSH connect" -j ACCEPT

Ответить | Правка | Наверх | Cообщить модератору

32. Сообщение от Страдивариус (?), 05-Июл-23, 21:19   +/
Логи засираются.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #28

33. Сообщение от Аноним (33), 06-Июл-23, 17:04   +/
Вот это и будет как раз именно тот самый день. Когда сильно пожалеешь о усложнении добавлением +1 сервиса веб-сервера и процессов разбора логов. Память там, лимиты на число файлов/соединений, прочие сложности упрощающего решения через добавление сложных процессов.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #12

34. Сообщение от Аноним (34), 10-Июл-23, 17:29   –1 +/
nftables - фаервол курильщика
iptables + ipset - фаервол здорового человека
Ответить | Правка | Наверх | Cообщить модератору

35. Сообщение от daWSL (?), 21-Июл-23, 21:08   +2 +/
Коллеги, прошу прощения если я чего-то "матёро недогоняю", но вот реально, эта "простыня" правда сильно "православнее" 6-ти строчек в iptables?
Ответить | Правка | Наверх | Cообщить модератору

36. Сообщение от xen (??), 28-Июл-23, 15:00   +1 +/
4 гига логов по сравнению с 20 мегабайт. Если места хватает, то не страшно, но на небольших машинках имеет вполне смысл
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #28 Ответы: #37

37. Сообщение от Пряник (?), 28-Июл-23, 15:50   +/
Вспоминаем про RateLimit логов.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #36 Ответы: #38

38. Сообщение от mikhailnov (ok), 01-Авг-23, 20:29   +/
Ага, чтобы успешный вход злоумышленника вообще не был залогирован?
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #37

39. Сообщение от лохпидр (?), 05-Авг-23, 13:21   +/
port knocking это своего рода пароль... но зачем? есть же сертификаты
Ответить | Правка | Наверх | Cообщить модератору


Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру