Em princípio, não. Usar ufw
aqui não é importante, já que age apenas como um frontend, criando regras de iptables. Como você percebeu, as regras NAT são tratadas antes de qualquer filtragem, portanto, o filtro vê o pacote resultante após qualquer regra NAT. (A Wikipedia tem um gráfico de aparência assustadora do fluxo de pacotes dentro do netfilter, que os representa como independente.)
Não tenho certeza se é um grande problema que o servidor também possa ser acessado na outra porta.
No entanto, se você realmente deseja descartar pacotes indo diretamente para a porta 2222, pode fazê-lo com algum truque, usando marcas de conexão, ou seja, o CONNMARK
target e connmark
module:
Na tabela nat
, defina uma marca na conexão e redirecione-a para a porta de destino.
iptables -t nat -A PREROUTING -p tcp --dport 22 -j CONNMARK --set-mark 1234
iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222
Na tabela filter
(padrão), rejeite a conexão se ela não tiver a marca.
iptables -A INPUT -p tcp --dport 2222 -m connmark ! --mark 1234 -j REJECT
Não importa qual seja o número da marca, desde que não colida com suas outras regras.
(Eu não tenho certeza se seria possível criar regras DROP
na tabela NAT também. O iptables v1.4.21 não parece permitir isso, mas a reclamação vem do próprio iptables, não do kernel, como acontece com REJECT
.)