Com o iptables do kernel completamente vazio ( iptables -F
), isso fará o que você pede:
# iptables -A INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j DROP
Isso indica que todos os endereços da LAN podem conversar com a porta TCP 22, que o host local recebe a mesma consideração (sim, 127. * não apenas 127.0.0.1), e os pacotes de todos os outros endereços que não correspondam às duas primeiras regras ficam sem cerimônia o balde de bits . Você pode usar em REJECT
vez de DROP
se desejar uma rejeição ativa (TCP RST) em vez de tornar a porta TCP 22 um buraco negro para pacotes.
Se a sua LAN não usar o bloco 192.168.0. *, Naturalmente você precisará alterar o IP e a máscara na primeira linha para corresponder ao esquema de IP da LAN.
Esses comandos podem não fazer o que você deseja se o seu firewall já tiver algumas regras configuradas. (Diga iptables -L
como root para descobrir.) O que acontece com frequência é que uma das regras existentes captura os pacotes que você está tentando filtrar, para que o acréscimo de novas regras não tenha efeito. Embora você possa usar, em -I
vez de -A
com o iptables
comando, emendar novas regras no meio de uma cadeia, em vez de anexá-las, geralmente é melhor descobrir como as cadeias são preenchidas na inicialização do sistema e modificar esse processo para que suas novas regras sempre sejam instaladas. a ordem correta.
RHEL 7+
Em sistemas recentes do tipo RHEL, a melhor maneira de fazer isso é usar firewall-cmd
ou sua GUI equivalente. Isso informa ao firewalld
daemon do sistema operacional o que você deseja, que é o que realmente preenche e manipula o que você vê via iptables -L
.
RHEL 6 e anteriores
Em sistemas mais antigos do tipo RHEL, a maneira mais fácil de modificar cadeias de firewall ao fazer pedidos é editar /etc/sysconfig/iptables
. As ferramentas de firewall da GUI e da TUI do sistema operacional são bastante simplistas; portanto, quando você começar a adicionar regras mais complexas como essa, é melhor voltar aos bons e antigos arquivos de configuração. Cuidado, uma vez que você começa a fazer isso, corre o risco de perder as alterações se usar as ferramentas de firewall do sistema operacional para modificar a configuração, pois ele pode não saber como lidar com regras artesanais como essas.
Adicione algo parecido com esse arquivo:
-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -j DROP
Onde você adiciona é a parte complicada. Se você encontrar uma linha nesse arquivo --dport 22
, substitua-a pelas três linhas acima. Caso contrário, provavelmente deve ocorrer antes da primeira linha existente terminar em -j ACCEPT
. Geralmente, você precisará adquirir alguma familiaridade com o modo como o iptables funciona; nesse ponto, o ponto de inserção correto será óbvio.
Salve esse arquivo e diga service iptables restart
para recarregar as regras do firewall. Certifique-se de fazer isso enquanto estiver conectado ao console, caso você gole as edições! Você não deseja sair da máquina enquanto estiver conectado por SSH.
A semelhança com os comandos acima não é coincidência. A maior parte desse arquivo consiste em argumentos para o iptables
comando. As diferenças em relação ao acima são que o iptables
comando é descartado e o INPUT
nome da cadeia se torna a RH-Firewall-1-INPUT
cadeia específica específica do RHEL . (Se você quiser examinar o arquivo com mais detalhes, verá anteriormente no arquivo onde eles renomearam a INPUT
cadeia. Por quê? Não sei dizer.)
A maneira preferida de fazer isso é com
iptables
. Parece que isso foi coberto adequadamente por outras pessoas; portanto, apenas para completar, mostrarei um método alternativo de controle de acesso que está disponível para muitos daemons na maioria das distribuições Linux. Esse método de controle de acesso é fornecido pelalibwrap
biblioteca.Para verificar se o seu daemon favorito tem
libwrap
suporte, tente executar o seguinte:Se você obtiver um resultado não vazio, como
então você está definitivamente pronto para ir.
É quase certo que seu
sshd
daemon temlibwrap
suporte e, portanto, deve consultar os arquivos/etc/hosts.allow
e/etc/hosts.deny
para controle de acesso. Supondo que sua rede LAN local seja192.168.100.0/24
, você pode negar o acesso asshd
todos os clientes, exceto aqueles no host local ou na LAN local, colocando o seguinte em seu/etc/hosts.deny
arquivo:Observe que esse método não abre ou fecha portas, por si só. Simplesmente informa aos daemons que usam esse método de controle de acesso se aceitam ou rejeitam tentativas de conexão de clientes que correspondem aos padrões especificados.
Para detalhes completos, confira as páginas de manual, começando com
hosts_access(5)
.fonte
Se você possui seu próprio firewall baseado em Linux, é melhor configurá-lo
iptables
, como outros descrevem aqui. Caso contrário, e o firewall é o seu roteador, provavelmente a configuração padrão já impede o acesso externo, a menos que você ative explicitamente o encaminhamento de porta (como descrevi recentemente na resposta a esta pergunta ).Para segurança adicional acima disso, você pode usar uma sub-rede separada para conexões na LAN. Para fazer isso, adicione para cada computador um segundo endereço IP que seria usado apenas na LAN e não pelo roteador. Digamos que toda a LAN agora esteja usando
192.168.0.xxx
endereços e o roteador (gateway, firewall) esteja192.168.0.1
. Portanto, adicione um segundo endereço para cada computador - por exemplo:Em seguida, edite a
sshd
configuração para usar apenas esse endereço (para que não permita conexões chegando192.168.0.xxx
) - edite/etc/ssh/sshd_config
e modifiqueListenAddress
para o de sua nova sub-rede (192.168.5.1
no exemplo acima). É isso aí! Se você não configurar o gateway para rotear a comunicação dessa sub-rede, ele deverá ser separado da parte externa.fonte