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

18

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 executando o Scientific Linux 6.1 (uma distribuição baseada em RHEL) e quero que o servidor SSH aceite apenas conexões de host local ou LAN. Como eu faço isso?

hpy
fonte

Respostas:

24

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 REJECTvez de DROPse 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 -Lcomo 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 -Ivez de -Acom o iptablescomando, 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-cmdou sua GUI equivalente. Isso informa ao firewallddaemon 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 restartpara 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 iptablescomando. As diferenças em relação ao acima são que o iptablescomando é descartado e o INPUTnome da cadeia se torna a RH-Firewall-1-INPUTcadeia específica específica do RHEL . (Se você quiser examinar o arquivo com mais detalhes, verá anteriormente no arquivo onde eles renomearam a INPUTcadeia. Por quê? Não sei dizer.)

Warren Young
fonte
4

A ferramenta de baixo nível para configuração de firewall no Linux é iptables . Também existem 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 (eu não verifiquei que se aplica à 6.1), service iptables saveas regras de firewall atuais serão salvas e essas regras salvas serão carregadas no momento da inicialização. Portanto, você precisa definir as regras que deseja através de iptablescomandos (ou qualquer outro meio) e, em seguida, executar service iptables savepara tornar sua instalação persistente.

A publicação no blog de Scott Pack é um começo para a eliminação de pacotes "estranhos" que geralmente não são necessários e que correm um alto risco de fazer parte de um ataque. Além disso, convém fechar todas as portas de entrada e abrir apenas as que você precisa. Algo assim:

# 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
Gilles 'SO- parar de ser mau'
fonte
11
Gilles, você não interpretou mal a pergunta um pouco? Entendo que a caixa Scientific Linux é um dos computadores na LAN, mas não o firewall.
rozcietrzewiacz
@ Gilles Sim, a caixa é um dos computadores na LAN.
Hpy 30/08/11
@rozcietrzewiacz Entendo que o firewall está na mesma máquina que o servidor. Concordo que a questão seja ambígua até certo ponto, mas como a penyuan mencionou apenas o SO de uma máquina, presumo que tudo esteja acontecendo nessa máquina. Caso contrário, essa não seria uma pergunta unix, seria uma pergunta de administrador de rede subespecificada.
Gilles 'SO- stop be evil' em
1

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 pela libwrapbiblioteca.

Para verificar se o seu daemon favorito tem libwrapsuporte, 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 seu sshddaemon tem libwrapsuporte e, portanto, deve consultar os arquivos /etc/hosts.allowe /etc/hosts.denypara controle de acesso. Supondo que sua rede LAN local seja 192.168.100.0/24, você pode negar o acesso a sshdtodos os clientes, exceto aqueles no host local ou na LAN local, colocando o seguinte em seu /etc/hosts.denyarquivo:

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 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).

Steven segunda-feira
fonte
1

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.xxxendereços e o roteador (gateway, firewall) esteja 192.168.0.1. Portanto, adicione um segundo endereço para cada computador - por exemplo:

ifconfig eth0:0 192.168.5.1/24

Em seguida, edite a sshdconfiguração para usar apenas esse endereço (para que não permita conexões chegando 192.168.0.xxx) - edite /etc/ssh/sshd_confige modifique ListenAddresspara o de sua nova sub-rede ( 192.168.5.1no 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.

rozcietrzewiacz
fonte