Dicas e truques de Linux: servidor, abra-se

Para quem precisa garantir acesso aos seus servidores de qualquer lugar do mundo via SSH/RDP ou outro — um pequeno RTFM/atalho.

Precisamos evitar VPNs e outros complicadores, a partir de qualquer dispositivo à mão.

E que não seja necessário muito esforço com o servidor.

Tudo o que você precisa para isso é — knockd, mãos habilidosas e 5 minutos de trabalho.

"Na internet você encontra tudo", claro (até mesmo no Habr), mas quando se trata de uma implementação específica — é aí que começa…

Vamos praticar com o exemplo do Fedora/CentOS, mas isso não importa.

O atalho é adequado tanto para iniciantes quanto para veteranos, portanto haverá comentários, mas mais curtos.

1. Servidor

  • instale o knock-server:
    yum/dnf install knock-server

  • configure-o (por exemplo, para ssh) — /etc/knockd.conf:

    [options]
        UseSyslog
        interface = enp1s0f0
    [SSHopen]
        sequence        = 33333,22222,11111
        seq_timeout     = 5
        tcpflags        = syn
        start_command   = iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        cmd_timeout     = 3600
        stop_command    = iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    [SSHclose]
        sequence        = 11111,22222,33333
        seq_timeout     = 5
        tcpflags        = syn
        command         = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

    A parte "abrir" está configurada para auto-fechamento em 1 hora. Por qualquer eventualidade…

  • /etc/sysconfig/iptables:

    ...
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 11111 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 22222 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 33333 -j ACCEPT
    ...

  • seguindo em frente:

    service iptables restart
    service knockd start

  • é possível adicionar RDP em um Windows Server virtual (./etc/knockd.conf; ajuste o nome da interface conforme preferir):

    [RDPopen]
        sequence        = 44444,33333,22222
        seq_timeout     = 5
        tcpflags        = syn
        start_command   = iptables -t nat -A PREROUTING -s %IP% -i enp1s0f0 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.0.2
        cmd_timeout     = 3600
        stop_command    = iptables -t nat -D PREROUTING -s %IP% -i enp1s0f0 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.0.2
    [RDPclose]
        sequence        = 22222,33333,44444
        seq_timeout     = 5
        tcpflags        = syn
        command         = iptables -t nat -D PREROUTING -s %IP% -i enp1s0f0 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.0.2

    Todos os nossos eventos do cliente são monitorados no servidor com o comando iptables -S.

2. Guia sobre armadilhas

knockd.conf:

Nos manuais também tem tudo (mas isso não é certo), no entanto, o knockd é um companheiro bastante avesso a mensagens, então é preciso ficar bem atento.

  • versão
    Nos repositórios do Fedora/CentOS, a versão mais recente do knockd até hoje é 0.63. Quem quiser UDP — procure por pacotes 0.70.
  • interface
    Na configuração padrão do Fedora/CentOS, essa linha é inexistenteprecisa ser adicionada manualmente, caso contrário não vai funcionar.
  • timeout
    Aqui escolha conforme sua preferência. É necessário que o cliente tenha tempo suficiente para todos os pings — e que o bot de varredura de portas seja impedido (e eles vão escanear 146%).
  • start/stop/command.
    Se a equipe é única — então command, se são duas — então start_command+stop_command.
    Se você errar — knockd ficará em silêncio, mas não funcionará.
  • proto
    Teoricamente, é possível usar UDP. Na prática, eu misturei tcp e udp, e o cliente na praia em Bali conseguiu abrir o portão apenas na quinta tentativa. Pois o TCP chegou quando necessário, enquanto o UDP — não é bem certo. Mas isso é uma questão de gosto, novamente.
  • sequência
    As armadilhas implícitas são que as sequências não devem se sobrepor... como dizer...

Por exemplo, assim:

open: 11111,22222,33333
close: 22222,11111,33333

Pelo empurrão 11111 open vai esperar o próximo empurrão em 22222. No entanto, pelo (22222) esse empurrão começará a funcionar fechar e tudo quebrará. Isso depende do delay do cliente também. Assim são as coisas ©.

iptables

Se em /etc/sysconfig/iptables estiver isso:

*nat
:PREROUTING ACCEPT [0:0]

não nos atrapalha muito, mas isso aqui:

*filter
:INPUT ACCEPT [0:0]
...
-A INPUT -j REJECT --reject-with icmp-host-prohibited

definitivamente atrapalha.

Como o knockd adiciona regras ao final da cadeia INPUT, teremos um reject.

Desabilitar esse reject significa abrir a máquina a todos os ventos.

Para não complicar nos iptables sobre o que colocar antes do que (como as pessoas sugerem), vamos simplificar: o padrão

  • no CentOS/Fedora a primeira regra (‘o que não é proibido é permitido’) será substituída pela inversa, e a última regra será removida.
  • No final, deve resultar em:

*filter :INPUT DROP [0:0] ... #-A INPUT -j REJECT --reject-with icmp-host-prohibited

Pode-se, é claro, em vez de DROP fazer REJECT, mas com DROP os bots terão uma vida mais fácil.

3. Cliente

Neste ponto, o mais interessante (na minha opinião), pois precisa funcionar não apenas de qualquer praia, mas de qualquer dispositivo.

Basicamente, uma série de clientes estão listados no

projeto, mas isso é da mesma série ‘tudo na internet existe’. Por isso, listarei o que aqui e agora funciona para mim. site Ao escolher um cliente, é necessário garantir que ele suporte a opção de delay entre pacotes. Sim, praia é diferente de praia e 100 megabits não garantem a chegada dos pacotes na ordem e no tempo corretos deste lugar.

E sim — ao configurar o cliente, o delay deve ser ajustado manualmente. Muito timeout — bots atacarão, pouco — o cliente não terá tempo. Muito delay — o cliente não terá tempo ou haverá conflito de toques (veja ‘armadilhas’), pouco — os pacotes se perderão na internet.

Com timeout=5s, um delay=100..500ms é uma opção perfeitamente funcional.

Por mais engraçado que pareça, encontrar um cliente knock adequado para esta plataforma é bastante complicado. Um que seja CLI, suporte delay, TCP — e sem firulas.

Windows

Como soa engraçado, mas encontrar um cliente knock decente para essa plataforma é bem desafiador. Um que seja CLI, suporte delay, TCP — e sem frescuras.

Como alternativa, você pode tentar isto aqui. Aparentemente, meu Google não é tão bom assim.

Linux

Aqui tudo é simples:

dnf install knock -y
knock -d   11111 22222 33333

MacOS

O mais fácil é instalar o port a partir do homebrew:
brew install knock
e criar os seus scripts de comando no formato:

#!bin/sh
knock -d <delay> <dst_ip> 11111 22222 33333

iOS

Opção funcional — KnockOnD (gratuito, da loja).

Android

«Knock on Ports». Não é publicidade, mas ele realmente funciona. E os desenvolvedores são bastante receptivos.

P.S. o markdown no Habr, claro, que Deus o abençoe algum dia…

UPD1: graças a uma boa pessoa apareceu um cliente funcional para Windows.
ATUALIZAÇÃO 2: mais uma boa pessoa lembrou que adicionar novas regras ao final do iptables nem sempre é útil. Mas — depende.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster