Em geral:
A visualização e modificação da configuração do firewall requer privilégios de administrador ( root
), assim como a abertura de serviços no intervalo de número de porta restrito. Isso significa que você deve estar conectado como root
alternativa ou usar sudo
para executar o comando como root. Vou tentar marcar esses comandos com o opcional [sudo]
.
Conteúdo:
- Questões sobre pedidos ou a diferença entre
-I
e-A
- Exibir a configuração atual do firewall
- Interpretando a produção de
iptables -L -v -n
- Conheça o seu ambiente
- As cadeias INPUT e FORWARD
- Módulos do kernel
1. A ordem importa ou a diferença entre -I
e-A
É importante lembrar que as regras de firewall são verificadas na ordem em que estão listadas. O kernel interromperá o processamento da cadeia quando uma regra for acionada, permitindo ou desabilitando um pacote ou conexão.
Acho que o erro mais comum para administradores de firewall iniciantes é que eles sigam as instruções corretas para abrir uma nova porta, como a abaixo:
[sudo] iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT
e então descubra que não terá efeito.
O motivo disso é que a -A
opção adiciona essa nova regra, depois de todas as regras existentes
e, como muitas vezes a regra final no firewall existente era aquela que bloqueia todo o tráfego que não é explicitamente permitido, resultando em
...
7 2515K 327M REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
8 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
Ou equivalente em iptables-save:
...
iptables -A INPUT -j REJECT
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
e a nova regra que abre a porta TCP 8080 nunca será alcançada. (como evidenciado pelos contadores teimosamente restantes em 0 pacotes e zero bytes).
Inserir a regra com -I
a nova regra teria sido a primeira da cadeia e funcionará.
2. Exiba a configuração atual do firewall
Minha recomendação para o administrador do firewall é examinar a configuração real que o kernel do Linux está executando, em vez de tentar diagnosticar problemas de firewall usando ferramentas amigáveis. Muitas vezes, depois de entender os problemas subjacentes, você pode resolvê-los facilmente em um assunto suportado por essas ferramentas.
O comando [sudo] iptables -L -v -n
é seu amigo (embora algumas pessoas gostem iptables-save
mais). Muitas vezes, ao discutir configurações, é útil usar a --line-numbers
opção também para numerar linhas. Referir-se à regra #X facilita a discussão sobre eles.
Nota: As regras NAT estão incluídas na iptables-save
saída, mas precisam ser listadas separadamente adicionando a -t nat
opção ie [sudo] iptables -L -v -n -t nat --line-numbers
,.
Executar o comando várias vezes e verificar incrementos de contadores pode ser uma ferramenta útil para verificar se uma nova regra é realmente acionada.
[root@host ~]# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 784K 65M fail2ban-SSH tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 2789K 866M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
3 15 1384 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
4 44295 2346K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 40120 2370K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
6 16409 688K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
7 2515K 327M REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 25 packets, 1634 bytes)
num pkts bytes target prot opt in out source destination
Chain fail2ban-SSH (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 117.239.37.150 0.0.0.0/0 reject-with icmp-port-unreachable
2 4 412 REJECT all -- * * 117.253.208.237 0.0.0.0/0 reject-with icmp-port-unreachable
Como alternativa, a saída de iptables-save
fornece um script que pode regenerar a configuração de firewall acima:
[root@host ~]# iptables-save
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [441:59938]
:fail2ban-SSH - [0:0]
-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A fail2ban-SSH -s 117.239.37.150/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 117.253.208.237/32 -j REJECT --reject-with icmp-port-unreachable
COMMIT
É uma questão de preferência o que você achará mais fácil de entender.
3. Interpretar a produção de iptables -L -v -n
A política define a ação padrão que a cadeia usa quando nenhuma regra explícita corresponde. Na INPUT
cadeia que está configurada para ACEITAR todo o tráfego.
A primeira regra na cadeia INPUT é imediatamente interessante, pois envia todo o tráfego (origem 0.0.0.0/0 e destino 0.0.0.0/0) destinado à porta TCP 22 ( tcp dpt:22
), a porta padrão do SSH para um destino personalizado ( fail2ban-SSH
) . Como o nome indica, essa regra é mantida pelo fail2ban (um produto de segurança que, entre outras coisas, verifica os arquivos de log do sistema em busca de possíveis abusos e bloqueia o endereço IP do agressor).
Essa regra teria sido criada por uma linha de comando do iptables semelhante iptables -I INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
ou encontrada na saída do iptables-save as -A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
. Muitas vezes, você encontra uma dessas notações na documentação.
Os contadores indicam que esta regra corresponde a 784.000 pacotes e 65 megabytes de dados.
O tráfego que corresponde a essa primeira regra é processado pela fail2ban-SSH
cadeia que, como uma cadeia não padrão, é listada abaixo da cadeia OUTPUT.
Essa cadeia consiste em duas regras, uma para cada abusador (endereço IP de origem 117.253.221.166 ou 58.218.211.166) que está bloqueado (com a reject-with icm-port-unreachable
).
-A fail2ban-SSH -s 117.253.221.166/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 58.218.211.166/32 -j REJECT --reject-with icmp-port-unreachable
Os pacotes SSH que não são desses hosts bloqueados ainda não são permitidos nem desabilitados e agora que a cadeia personalizada está concluída será verificada em relação à segunda regra na cadeia INPUT.
Todos os pacotes que não foram destinados à porta 22 passaram a primeira regra na cadeia INPUT e também serão avaliados na regra 2 de ENTRADA.
A regra de entrada número 2 faz com que isso pretenda ser um firewall completo , que rastreia as conexões. Isso tem algumas vantagens: apenas os pacotes para novas conexões precisam ser verificados com relação ao conjunto de regras completo, mas uma vez permitidos pacotes adicionais pertencentes a uma conexão estabelecida ou relacionada são aceitos sem verificação adicional.
A regra de entrada nº 2 corresponde a todas as conexões e pacotes abertos e relacionados que correspondam a essa regra e não precisará ser mais avaliada.
Nota: as alterações de regras na configuração de um firewall stateful afetarão apenas novas conexões, não conexões estabelecidas.
Por outro lado, um simples filtro de pacotes testa todos os pacotes em relação ao conjunto de regras completo, sem rastrear o estado da conexão. Nesse firewall, nenhuma palavra- chave de estado seria usada.
A regra de ENTRADA # 3 é bastante entediante, todo o tráfego conectado à interface de loopback ( lo
ou 127.0.0.1) é permitido.
As regras 4, 5 e 6 de ENTRADA são usadas para abrir as portas TCP 22, 80 e 443 (as portas padrão para SSH, HTTP e HTTPS) concedendo acesso a NOVAS conexões (conexões existentes já são permitidas pela regra 2 de ENTRADA).
Em um firewall sem estado, essas regras apareceriam sem os atributos de estado:
4 44295 2346K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
5 40120 2370K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
6 16409 688K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
ou
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
A regra final de ENTRADA, nº 7, é uma regra que bloqueia todo o tráfego que NÃO foi concedido acesso nas regras de ENTRADA 1-7. Uma convenção bastante comum: tudo o que não é permitido é negado. Em teoria, essa regra poderia ter sido omitida configurando a POLÍTICA padrão como REJECT.
Sempre investigue toda a cadeia.
4. Conheça seu ambiente
4.1 As configurações em um firewall de software não afetam as configurações de segurança mantidas em outros locais da rede, ou seja, apesar de abrir um serviço de rede com iptables
as listas de controle de acesso não modificadas nos roteadores ou outros firewalls na rede, ainda pode bloquear o tráfego ...
4.2 Quando nenhum serviço estiver escutando, você não poderá se conectar e obter um erro de conexão recusada , independentemente das configurações do firewall. Portanto:
- Confirme se um serviço está escutando (na interface de rede / endereço IP correto) e usando os números de porta que você espera
[sudo] netstat -plnut
ou usa como alternativa ss -tnlp
.
- Se seus serviços ainda não deveriam estar em execução, emule um ouvinte simples com, por exemplo, netcat:
[sudo] nc -l -p 123
ou openssl s_server -accept 1234 [options]
se você precisar de um ouvinte TLS / SSL (verifique as man s_server
opções).
- Verifique se você pode se conectar a partir do próprio servidor,
telnet <IP of Server> 123
ou seja, ou echo "Hello" | nc <IP of Server> 123
ao testar o serviço seguro TLS / SSL openssl s_client -connect <IP of Server>:1234
, antes de tentar o mesmo em um host remoto.
4.3 Entenda os protocolos usados pelos seus serviços. Você não pode ativar / desativar adequadamente os serviços que não entende o suficiente. Por exemplo:
- o TCP ou UDP é usado ou ambos (como no DNS)?
- o serviço está usando uma porta padrão fixa (por exemplo, algo como a porta TCP 80 para um servidor da web)?
- Como alternativa, é escolhido um número de porta dinâmica que pode variar (por exemplo, serviços RPC, como o NFS clássico, registrado no Portmap)?
- O infame FTP usa até duas portas , tanto um número de porta fixo quanto dinâmico, quando configurado para usar o modo passivo ...
- as descrições de serviço, porta e protocolo
/etc/services
não coincidem necessariamente com o serviço real usando uma porta.
4.4 O filtro de pacotes do kernel não é a única coisa que pode restringir a conectividade de rede:
- O SELinux também pode estar restringindo os serviços de rede.
getenforce
confirmará se o SELinux está em execução.
- Apesar de se tornarem um pouco obscuros, os TCP Wrappers ainda são uma ferramenta poderosa para reforçar a segurança da rede. Verifique com
ldd /path/to/service |grep libwrap
e os /hosts.[allow|deny]
arquivos de controle.
5. INPUT
ou FORWARD
cadeias
O conceito de cadeias é explicado mais detalhadamente aqui, mas o mais curto é:
A INPUT
cadeia é onde você abre e / ou fecha portas de rede para serviços em execução localmente, no host em que você emite os comandos iptables.
É na FORWARD
cadeia que você aplica regras para filtrar o tráfego que é encaminhado pelo kernel para outros sistemas, sistemas reais, mas também contêineres Docker e servidores Servidores convidados virtuais quando sua máquina Linux está atuando como ponte, roteador, hypervisor e / ou endereço de rede tradução e encaminhamento de porta.
Um equívoco comum é que, como um contêiner de encaixe ou um convidado KVM é executado localmente, as regras de filtro que se aplicam devem estar na cadeia INPUT, mas esse geralmente não é o caso.
6. Módulos Kernel
Como o filtro de pacotes é executado no kernel do Linux, ele também pode ser compilado como módulo dinâmico, na verdade vários módulos. A maioria das distribuições inclui o netfilter como módulos e os módulos necessários do netfilter serão carregados no kernel conforme necessário, mas para alguns módulos, um administrador de firewall precisará garantir manualmente que eles sejam carregados. Isso diz respeito principalmente aos módulos de rastreamento de conexão, como os nf_conntrack_ftp
quais podem ser carregados insmod
.
Os módulos atualmente carregados no kernel em execução podem ser exibidos com lsmod
.
O método para garantir que os módulos sejam carregados persistentemente nas reinicializações depende da distribuição do Linux.