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 é — , mãos habilidosas e 5 minutos de trabalho.
"Na internet você encontra tudo", claro (até mesmo no ), 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-serverconfigure-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 ACCEPTA 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.2Todos 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,33333Pelo 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-prohibiteddefinitivamente 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 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. 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 . Aparentemente, meu Google não é tão bom assim.
Linux
Aqui tudo é simples:
dnf install knock -y
knock -d 11111 22222 33333MacOS
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 33333iOS
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 apareceu para Windows.
ATUALIZAÇÃO 2: mais uma lembrou que adicionar novas regras ao final do iptables nem sempre é útil. Mas — depende.
Fonte: habr.com
