Ok, acho que não podemos descobrir isso de uma só vez. Então eu vou editar minha resposta enquanto vamos. Os dados até agora não indicam nenhuma razão pela qual iptables
não funcionaria. Olhando para as linhas (potencialmente) relevantes da saída lsof
que pedi e você forneceu, você deve ver apenas as portas que você mencionou:
Selecione apenas portas como 22, 25 & amp; 80 estão abertas
aberto e outros fechados. No entanto, você deve ver aberto 21, 22, 80 e 9312. Não há serviços escutando nas outras portas (versão reduzida do sudo lsof -i -s tcp:listen
output):
sshd 960 root 3u IPv4 564 0t0 TCP *:ssh (LISTEN)
sshd 960 root 4u IPv6 566 0t0 TCP *:ssh (LISTEN)
exim4 2001 Debian-exim 5u IPv4 11968 0t0 TCP mysite.com:smtp (LISTEN)
searchd 2025 root 7u IPv4 14510 0t0 TCP *:9312 (LISTEN)
proftpd 2041 proftpd 2u IPv6 11974 0t0 TCP *:ftp (LISTEN)
apache2 2103 root 4u IPv6 11992 0t0 TCP *:http (LISTEN)
apache2 ???? www-data 4u IPv6 11992 0t0 TCP *:http (LISTEN)
Tudo bem, ter isso estabelecido (ou seja, eles estão abertos, mas nada está escutando). Devemos investigar como você está tentando determinar se a porta está aberta ou não. A maneira normal é fazer uma corrida nmap
do mundo exterior. O Nmap também será capaz de distinguir - dependendo das circunstâncias - entre aberto e filtrado e fechado.
Uma coisa que me veio à mente é que, se você usar tcpwrappers, /etc/hosts.deny
e /etc/hosts.allow
também terão um papel sem iptables
interferindo.
Simplificação possível
Além disso, suas regras podem ser simplificadas.
Substituir:
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
por:
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
, a menos que você pretenda usar o rastreamento de conexão na estrada.
Todas as regras OUTPUT
( filter
) podem ser removidas, pois não fazem nada desde que a política dessa cadeia esteja definida como ACCEPT
.
Você provavelmente deseja adicionar uma regra para o DNS no UDP, já que o UDP é o padrão. Ficaria assim:
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
Agora, todos os nomes de portas podem ser colocados em um formato mais legível, usando os nomes de /etc/services
e, portanto,
-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 993 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 4444 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5900 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 9312 -j ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT # <-- added this one
-A INPUT -p udp -m udp --dport 5900 -j ACCEPT
pode ser condensado até o mais de duas linhas:
-A INPUT -p tcp -m multiport --dports ftp-data,ftp,ssh,smtp,domain,www,imap2,https,imaps,mysql,4444,5900,9312
-A INPUT -p udp -m multiport --dports domain,5900
com ajuda do módulo multiport
Todas as regras em um formato adequado para iptables-restore
se tornam:
*filter
:INPUT ACCEPT
:FORWARD ACCEPT
:OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
-A INPUT -m recent --update --seconds 90 --hitcount 4 --rttl --name SSH -j DROP
-A INPUT -p tcp -m multiport --dports ftp-data,ftp,ssh,smtp,domain,www,imap2,https,imaps,mysql,4444,5900,9312
-A INPUT -p udp -m multiport --dports domain,5900
-A INPUT -p icmp -m limit --limit 10/sec -j ACCEPT
-A INPUT -j DROP
-A FORWARD -p icmp -m limit --limit 10/sec -j ACCEPT
COMMIT
Piping essas regras em uma invocação de iptables-restore --test
irá mostrar-lhe quaisquer erros de sintaxe, a propósito. Isso geralmente é muito útil para todos os casos em que você digita suas regras em um formato adequado para iptables-restore
ou iptables-apply
.
Bônus: Variações
Você pode usar ipset(8)
( apt-get install ipset
) para manter a lista de portas também. Isso também pode ser usado para outras coisas, como bloqueio de áreas geográficas inteiras, se você tiver um conjunto de especificações líquidas (CIDR) para essas áreas. Veja isso .
É claro que você também pode combinar com conjuntos de IPs como combinações de endereço de origem e destino e endereço / porta. Para obter mais informações, consulte o manual ( man ipset
) e confira as descrições set
module e SET
(descendente do anterior) em man iptables-extensions
.
Por último, mas não menos importante: se você tiver conectividade IPv6, talvez queira adicionar o prefixo -6
e -4
, respectivamente, antes das linhas nas quais as regras específicas do protocolo são fornecidas. Dessa forma, você pode usar um único arquivo para armazenar suas regras para ip6tables-restore
e iptables-restore
. Regras compartilhadas entre ambos devem não conter o prefixo.
Por exemplo, as regras condensadas no momento desta escrita podem ser usadas para IPv4 e IPv6. Normalmente, apenas endereços, máscaras de rede e essas coisas exigirão que você divida as regras entre IPv4 e IPv6. Além disso, os conjuntos de IPs podem ser IPv4 (padrão) ou IPv6 ( ipset create foo family inet6
), o que significa que tais conjuntos, devido aos nomes diferentes, também exigirão regras de divisão.
Você também perguntou implicitamente:
:OUTPUT ACCEPT [19969:30829963]# <--- not sure where this came from?
os números entre parênteses são os contadores da cadeia. Ao usar iptables-restore
(ou sua contraparte IPv6), elas são opcionais. Antes dos dois pontos é o número de pacotes, depois o número de bytes. Se você executar iptables-save
com a opção -c
, receberá os contadores correspondentes por regra.