将 0.0.0.0:80 上的连接转发至 127.0.0.1:9091

将 0.0.0.0:80 上的连接转发至 127.0.0.1:9091

我正在尝试设置一个 tor 中继。

为了让 tor 呈现一个静态网页来解释它是什么,我希望服务器监听端口 80 和 443。

为了让 tor 使用记帐/休眠模式(在达到数据限制后限制带宽),我需要将进程绑定到 >1024 个端口号(这样我猜非特权用户可以重新绑定端口)。

因此我的 tor 配置如下所示:

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

启动服务器后,我可以在本地访问 html 文件:

$ 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]

并且端口似乎已正确打开:

$ 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

为了使最后一部分正常工作,其中 0.0.0.0:80 上的连接被重定向到 127.0.0.1:9091,我尝试使用 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         

但是当我连接到端口 80 上的外部 IP 时,没有得到任何响应。

我尝试过打开和关闭 ip_forward,但都不起作用:

$ sudo sysctl net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
$ sudo sysctl net.ipv4.ip_forward=0
net.ipv4.ip_forward = 0

我甚至尝试过 MASQUERADE,但是没有用,而且我认为没有必要:

$ sudo iptables -t nat -A POSTROUTING -j MASQUERADE

我也尝试了下面建议的 PREROUTING,但是它不起作用:

$ 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.

我究竟做错了什么?

该服务器是一个树莓派,运行 wheezy,仅使用内置网络接口通过公共 IP 直接连接到互联网。

答案1

这应该可以解决问题:

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

答案2

您可以尝试在内核中启用到本地主机的路由:机器的 NIC 是
sysctl -w net.ipv4.conf.eth0.route_localnet=1什么时候。eth0

请参阅此帖子上接受的答案:https://unix.stackexchange.com/questions/111433/iptables-redirect-outside-requests-to-127-0-0-1

相关内容