iptables, como redirecionar a porta do loopback?

6

As principais regras são:

OUTIF=eth0
 /sbin/iptables --policy INPUT DROP
 /sbin/iptables --policy FORWARD DROP
 /sbin/iptables --policy OUTPUT ACCEPT
 /sbin/iptables -A INPUT -i lo -j ACCEPT
 /sbin/iptables -A INPUT -i $OUTIF -m state --state RELATED,ESTABLISHED -j ACCEPT

Eu quero que o mysql ouça na lo na porta 3306. E também quero que ele escute na porta 33060 na interface WAN ( eth0 ), pois quero mantê-lo longe de bots.

Eu tentei vários redirecionamentos sem sucesso. Por exemplo:

/sbin/iptables -A INPUT -p tcp -i $OUTIF --dport 34306 -j ACCEPT
/sbin/iptables -A PREROUTING -t nat -p tcp -s 0/0 --dport 34306 \
               -j DNAT --to 127.0.0.1:3306

Como posso fazer isso?

EDITADO:

Eu vou usar redirecion , mas eu ainda quero saber como fazer isso com o iptables.

    
por eproyectos 08.02.2012 / 18:46

2 respostas

5

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:

  1. Sua pergunta menciona a porta 33060, mas seu código usa a porta 34306. Eu usei a última.
  2. 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.
  3. Você precisa apenas de DNAT the SYN packet. O NAT com estado irá traduzir automaticamente todos os outros pacotes. Isso torna as coisas um pouco mais rápidas.
  4. 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)

    
por 08.02.2012 / 19:12
0

Dê uma olhada nas ferramentas como o nmap, considere que os invasores que comandam os botnets têm tempo e máquinas ilimitados à mão e estimam quanto tempo "esconder o MySQL em uma porta (facilmente adivinhada)" vai comprar você.

    
por 18.01.2013 / 03:57

Tags