Este pode funcionar, mas somente se você permitir acesso à porta 3306 do lado de fora: ( mas isso não funciona )
iptables -t nat -A PREROUTING -p tcp --dport 34306 --syn -j DNAT --to :3306
O que você quer fazer é: ( mas isso também não funciona )
iptables -t nat -A PREROUTING -p tcp --dport 34306 --syn -j DNAT --to 127.0.0.1:3306
Isto é, você deseja que os pacotes para a porta 34306 em uma interface externa sejam redirecionados para 127.0.0.1, porta 3306. E isso funcionaria, exceto pelo fato de que, uma vez que o destino é reescrito para 127.0.0.1, o pacote se torna um pacote marciano (vindo de fora com um destino de 127.0.0.1). Pacotes marcianos são filtrados normalmente e silenciosamente, e você realmente quer isso.
Há uma solução mais indireta envolvendo marcas de firewall. A teoria: quando um pacote vem chamando pela porta 34306 / tcp na sua interface externa, nós simplesmente o marcamos como aceitável, então o reescrevemos para parecer que veio do 3306 / tcp. O tráfego para 3306 / tcp com a marca é permitido. Todo o outro tráfego para 3306 / tcp é rejeitado (explícita ou implicitamente, por meio da política padrão). O código:
IFACE=eth0 # or whatever
HIPORT=34306
REALPORT=3306
MARK=42 # not-so-random random number
iptables -t mangle -A PREROUTING -p tcp -i $IFACE --dport $HIPORT -j MARK --set-mark $MARK
iptables -t nat -A PREROUTING -p tcp --dport $HIPORT --syn -j DNAT --to :$REALPORT
iptables -A INPUT -p tcp -m mark --mark $MARK -j ACCEPT
iptables -A INPUT -p tcp --dport $REALPORT -j DROP # explicitly dropping
A última regra é onde você pode agir em pacotes não permitidos. Eu gosto de registrar todos os pacotes descartados, então minhas cadeias passam para as duas últimas regras, que são -j LOG
e -j DROP
. Então, no meu caso, eu não precisaria disso, mas sua própria milhagem, obviamente, varia.
Acabei de testar isso e funciona na minha configuração. É um pouco mais tortuoso do que o esperado, mas essa é a vida com o netfilter.
Se você usar filtragem com monitoração de estado , adicione --syn
à regra 3 ( -m mark
na cadeia INPUT
) e cole-a antes das regras de inspeção de estado. Se você descartar / rejeitar pacotes explicitamente com a regra 4 e fizer um firewall com monitoração de estado, adicione --syn
a isso também. Isso é um pouco mais complicado (por oito bytes inteiros), mas as regras de verificação de marcas se aplicam apenas ao pacote SYN (primeiro) de cada conexão TCP. Depois que a decisão de aceitar / rejeitar é tomada, as regras de inspeção de estado fazem o resto, portanto, o firewall não precisa manter marcas de verificação para cada pacote. Não há razão para desperdiçar ciclos de CPU e isso mantém o desempenho da rede alto.
Algumas coisas a serem observadas:
- Sua pergunta menciona a porta 33060, mas seu código usa a porta 34306. Eu usei a última.
- Verifique se o MySQL está realmente ouvindo 127.0.0.1:3306. Ele pode usar um soquete de domínio Unix para comunicações locais, não um soquete de domínio da Internet (TCP / IP), e isso não está em rede.
- Você precisa apenas de
DNAT
theSYN
packet. O NAT com estado irá traduzir automaticamente todos os outros pacotes. Isso torna as coisas um pouco mais rápidas. - Você não precisa especificar -s 0/0 explicitamente, apenas deixe a fonte completamente livre.
O espírito da questão: segurança pela obscuridade é uma dura amante. Você não está realmente se protegendo, alterando a porta em que o MySQL está escutando. Os scanners de portas são coisas automatizadas e não se importam em escanear todas as portas de um sistema. :) Eu recomendo usar ssh
com a opção -L
para encapsular de forma segura ou, se você quiser, uma VPN. Mas às vezes, a vida lhe dá limões e você tem que fazer limonada com netfilter (que é provavelmente uma das poucas coisas que você não pode fazer com ele)