Use iptables no gateway para o encaminhamento de porta

0

Eu tenho uma máquina Linux na minha rede local que eu uso como gateway, então todo o tráfego da minha rede passa (a máquina tem apenas uma interface de rede que eu uso para tráfego de entrada e saída). Eu preciso encaminhar todos os pacotes HTTP chegando na porta 7080 para a porta 80 . Além disso, quero redirecionar as respostas HTTP de volta para o cliente que enviou a solicitação.

Eu tentei conseguir isso usando as seguintes regras do iptables:

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7080 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

iptables -t nat -A OUTPUT -p tcp --dport 7080 -j REDIRECT --to-ports 80
iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports 7080

Quando essas regras estão ativas, não recebo nenhuma resposta HTTP em um cliente.

Alguém tem ideia do que estou fazendo de errado ou como eu poderia resolver esse problema?

    
por Steffen 25.11.2013 / 14:19

3 respostas

1

Você está aplicando as cadeias erradas. Os pacotes recebidos são primeiro processados por PREROUTING; se eles forem identificados como indo para "esta" máquina, eles serão entregues para INPUT, caso contrário, para FORWARD e POSTROUTING. A cadeia OUTPUT aplica-se apenas aos pacotes que são gerados localmente. O tutorial do iptables tem um capítulo fantástico sobre isso.

Com base em um exemplo em outro lugar na internet , para responder às suas dúvidas pergunta como posada, você provavelmente só precisa fazer isso:

# Packets that arrive for port 7080 should be redirected to port 80
iptables -t nat -A PREROUTING -p tcp --dport 7080 -j REDIRECT --to-ports 80

# Separately, all packets that leave this machine that go to port 80
# (which will include the ones redirected above) should be masqueraded,
# i.e. use NAT:
iptables -t nat -A POSTROUTING -p tcp --dport 80 -j MSAQUERADE
Tenho certeza de que o que você quer fazer é mais complicado, até porque você não diz em que direção deseja que isso aconteça. Se o que você realmente quer fazer é apenas configurar uma porta para frente para que seu endereço IP externo (vamos fingir que é 251.112.112.42) olhe para a Internet como se tivesse um servidor web rodando em sua porta 7080 - mas você está realmente servindo que a partir de uma máquina interna (digamos 192.168.42.1) na porta 80. Isso também é fácil, apenas diferente, e ainda mais perto do exemplo já mencionado :

# Anything sent to your external IP:port gets redirected to the internal one:
iptables -t nat -A PREROUTING -d 251.112.112.42/32 -p tcp --dport 7080 \
    -j DNAT --to-destination 192.168.42.1:80

# Make sure those connections actually work, by rewriting everything back,
# again simply using NAT:
iptables -t nat -A POSTROUTING -d 192.168.42.1 -p tcp -dport 80 -j MASQUERADE
    
por 06.12.2013 / 17:34
0

INPUT significa apenas os pacotes, que serão processados pelo seu espaço de usuário.

Você não deve usar INPUT, mas a cadeia PREROUTING na tabela nat.

Um tcpdump é muito útil para depurar, o que realmente acontece com seus pacotes.

    
por 25.11.2013 / 17:27
0

Você precisa fazer 3 alterações no pacote tcp: SourceNAT, DestinationNAT com alteração de porta. Isso não é permitido no mesmo pacote. Mas você pode usar aplicativos de terceiros como o nginx e simplesmente redirecionar pacotes por este aplicativo.

    
por 28.11.2013 / 10:15