Isso deve funcionar:
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 80 \
-j REDIRECT --to-ports 127.0.0.1:9091
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 443 \
-j REDIRECT --to-ports 127.0.0.1:9090
Estou tentando configurar um relay de tor.
Para permitir a apresentação de uma página web estática explicando o que é que eu quero que o servidor escute nas portas 80 e 443.
Para permitir o uso de contabilidade / hibernação (largura de banda do acelerador após um limite de dados ter sido atingido) eu preciso do processo para ligar a 1024 números de porta (para que um usuário não privilegiado possa religar as portas) ).
Por isso, minha configuração tor é semelhante a:
ORPort 443 NoListen
ORPort 127.0.0.1:9090 NoAdvertise
DirPort 80 NoListen
DirPort 127.0.0.1:9091 NoAdvertise
DirPortFrontPage /etc/tor/tor-exit-notice.html
Depois de iniciar o servidor, posso acessar o arquivo html localy:
$ wget 127.0.0.1:9091
--2013-08-12 14:27:49-- http://127.0.0.1:9091/
Connecting to 127.0.0.1:9091... connected.
HTTP request sent, awaiting response... 200 OK
Length: 6762 (6.6K) [text/html]
Saving to: 'index.html'
100%[=============================>] 6,762 --.-K/s in 0.005s
2013-08-12 14:28:15 (1.21 MB/s) - 'index.html' saved [6762/6762]
E as portas parecem abertas corretamente:
$ sudo netstat -lnp | grep tor
tcp 0 0 127.0.0.1:9050 0.0.0.0:* LISTEN 6328/tor
tcp 0 0 127.0.0.1:9090 0.0.0.0:* LISTEN 6328/tor
tcp 0 0 127.0.0.1:9091 0.0.0.0:* LISTEN 6328/tor
Para que a última parte funcione, onde as conexões em 0.0.0.0:80 são redirecionadas para 127.0.0.1:9091, tentei usar o iptables.
$ sudo iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 443 -j DNAT --to-destination 127.0.0.1:9090
$ sudo iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 80 -j DNAT --to-destination 127.0.0.1:9091
$ sudo iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 to:127.0.0.1:9090
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:127.0.0.1:9091
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Mas quando eu me conecto ao ip externo na porta 80 não obtenho resposta.
Eu tentei com o ip_forward ligado e desligado, e não funciona:
$ sudo sysctl net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
$ sudo sysctl net.ipv4.ip_forward=0
net.ipv4.ip_forward = 0
Eu até experimentei o MASQUERADE-ing, mas ele não funciona, e eu não acho que seja necessário:
$ sudo iptables -t nat -A POSTROUTING -j MASQUERADE
Eu também tentei PREROUTING por sugestão abaixo, mas não funciona:
$ sudo iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 80 -j REDIRECT --to-port 127.0.0.1:9091
iptables v1.4.14: REDIRECT: Bad value for "--to-ports" option: "127.0.0.1:9091"
Try 'iptables -h' or 'iptables --help' for more information.
O que estou fazendo de errado?
O servidor é um raspberry pi, executando wheezy apenas com a interface de rede integrada conectada diretamente à internet com um ip público.
Isso deve funcionar:
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 80 \
-j REDIRECT --to-ports 127.0.0.1:9091
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 443 \
-j REDIRECT --to-ports 127.0.0.1:9090
Você pode tentar ativar o roteamento para localhost no kernel:% sysctl -w net.ipv4.conf.eth0.route_localnet=1
quando eth0
é a NIC da máquina.
Veja a resposta aceita nesta postagem: link