Defina algumas portas de firewall para aceitar apenas conexões de rede local?

17

Como configuro o firewall em um sistema em uma LAN para que algumas portas estejam abertas apenas para conexões da rede local e não do mundo externo?

Por exemplo, eu tenho uma caixa rodando Scientific Linux 6.1 (uma distro baseada no RHEL), e eu quero seu servidor SSH para aceitar apenas conexões de localhost ou LAN. Como faço isso?

    
por hpy 30.08.2011 / 22:28

4 respostas

23

Com os iptables do kernel completamente vazios ( iptables -F ), isso fará o que você perguntar:

# 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 diz que todos os endereços da LAN têm permissão para falar com a porta TCP 22, que localhost recebe a mesma consideração (sim, 127. * não apenas 127.0.0.1) e pacotes de todos os outros endereços que não correspondem às duas primeiras regras. caíram sem a menor cerimônia no depósito de bits . Você pode usar REJECT em vez de DROP se quiser uma rejeição ativa (TCP RST) em vez de tornar a porta TCP 22 um buraco negro para pacotes.

Se a sua rede local não usa o bloco 192.168.0. *, você naturalmente precisará alterar o IP e a máscara na primeira linha para corresponder ao esquema de IP da sua LAN.

Estes 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 pega os pacotes que você está tentando filtrar, de modo que o acréscimo de novas regras não tenha efeito. Embora você possa usar -I em vez de -A com o comando iptables para unir 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 modificá-las processe para que suas novas regras sempre sejam instaladas na ordem correta.

RHEL 7 +

Em sistemas de tipo RHEL recentes, a melhor maneira de fazer isso é usar firewall-cmd ou seu equivalente na GUI. Isso informa ao daemon firewalld do SO o que você deseja, que é o que realmente preenche e manipula o que você vê via iptables -L .

RHEL 6 e anteriores

Em sistemas de tipo RHEL mais antigos, a maneira mais fácil de modificar cadeias de firewall ao fazer pedidos é editar /etc/sysconfig/iptables . As ferramentas de firewall GUI e TUI do sistema operacional são bastante simplistas, portanto, assim que você começar a adicionar regras mais complexas como essa, é melhor voltar aos bons arquivos de configuração antigos. Cuidado, uma vez que você começar a fazer isso, você se arrisca a perder suas alterações se usar as ferramentas de firewall do sistema operacional para modificar a configuração, pois pode não saber como lidar com regras artesanais como essas.

Adicione algo assim ao 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, é o bit complicado. Se você encontrar uma linha nesse arquivo falando sobre --dport 22 , simplesmente substitua-a pelas três linhas acima. Caso contrário, provavelmente deve ir antes da primeira linha existente que termina em -j ACCEPT . Geralmente, você precisará adquirir alguma familiaridade com a forma como o iptables funciona, ponto no qual 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 logado no console, no caso de você fat-finger as edições! Você não quer se trancar fora de sua máquina enquanto estiver conectado via SSH.

A semelhança com os comandos acima não é coincidência. A maior parte desse arquivo consiste em argumentos para o comando iptables . As diferenças relativas ao acima são que o comando iptables é descartado e o nome da cadeia INPUT se torna a cadeia RH-Firewall-1-INPUT específica do RHEL. (Se você se interessar em examinar o arquivo com mais detalhes, verá mais cedo no arquivo em que eles essencialmente renomearam a cadeia INPUT . Por quê? Não foi possível dizer.)

    
por 31.08.2011 / 00:25
4

A ferramenta de baixo nível para configuração de firewall no Linux é iptables . Existem também ferramentas de nível superior disponíveis. Não sei se o Scientific Linux tem uma ferramenta de firewall recomendada.

De acordo com esta página da web (não verifiquei que ela se aplica a 6.1), service iptables save salvará as regras atuais do firewall e essas regras salvas serão carregadas no momento da inicialização. Portanto, você precisa configurar as regras que deseja por meio dos comandos iptables (ou qualquer outro meio) e, em seguida, executar service iptables save para tornar sua configuração persistente.

Postagem do blog de Scott Pack é um começo para lançar pacotes “excêntricos” que geralmente não são necessários e têm um alto risco de fazer parte de um ataque. Além disso, você desejará fechar todas as portas de entrada e abrir apenas as que precisar. Algo parecido com isto:

# Accept everything on the loopback interface
iptables -A INPUT -i lo -j ACCEPT
# Accept ICMP
iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
# Drop oddball packets
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -f -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# Accept packets that are part of established connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accept selected incoming connections, e.g. ssh from 10.0.42.x
iptables -A INPUT -p tcp --dport 22 -s 10.0.42.0/24 -j ACCEPT
# Reject incoming connections that aren't explicitly accepted
iptables -A INPUT -j REJECT
    
por 31.08.2011 / 00:29
1

A maneira preferida de fazer isso é com iptables . Parece que isso foi adequadamente coberto pelos outros, então, só por completude, vou apontar um método de controle de acesso alternativo que está disponível para muitos daemons na maioria das distribuições Linux. Esse método de controle de acesso é fornecido pela biblioteca libwrap .

Para verificar se seu daemon favorito tem libwrap support, tente executar o seguinte:

ldd 'which sshd' | grep libwrap

Se você obtiver um resultado não vazio, como

libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f84e7b0e000)

então você está definitivamente pronto para ir.

É quase certo que o daemon sshd tem libwrap support e, portanto, deve consultar os arquivos /etc/hosts.allow e /etc/hosts.deny para controle de acesso. Supondo que sua rede LAN local é 192.168.100.0/24 , você pode negar acesso a sshd a todos os clientes exceto aqueles no host local ou na LAN local, colocando o seguinte no seu arquivo /etc/hosts.deny :

sshd: ALL EXCEPT 127.0.0.0/255.0.0.0, [::1]/128, 192.168.100.0/255.255.255.0

Observe que esse método não na verdade abre ou fecha portas, por si só. Ele simplesmente diz aos daemons que usam esse método de controle de acesso para aceitar ou rejeitar tentativas de conexão de clientes que correspondam ao (s) padrão (s) especificado (s).

Para detalhes completos, confira as man pages, começando com hosts_access(5) .

    
por 31.08.2011 / 01:04
1

Se você tiver seu próprio firewall baseado em Linux, é melhor configurar iptables , como os outros descrevem aqui. Se não e o firewall for o seu roteador, provavelmente a configuração padrão já impedirá o acesso de fora, a menos que você habilite explicitamente o encaminhamento de porta (como descrevi recentemente em answer para esta questão ).

Para segurança adicional acima, você pode usar uma sub-rede separada para conexões na rede local. Para fazer isso, para cada computador, adicione um segundo endereço IP que seria usado somente na LAN e não no roteador. Digamos que toda a LAN agora esteja usando 192.168.0.xxx endereços e o roteador (gateway, firewall) seja 192.168.0.1 . Então adicione um segundo endereço para cada computador - por exemplo:

ifconfig eth0:0 192.168.5.1/24

Em seguida, edite a configuração sshd para usar somente esse endereço (para que não permita conexões chegando em 192.168.0.xxx ) - edite /etc/ssh/sshd_config e modifique ListenAddress para a 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 da sub-rede, ela deverá ser separada do lado de fora.

    
por 31.08.2011 / 01:08