共享互联网连接被拒绝

共享互联网连接被拒绝

下图显示了我的网络的拓扑结构。 图表 我现在想使用 wlan0 将所有 http 流量从 10.8.0.15 路由到 10.8.0.42 到外部世界。不幸的是,我对 iptables 和路由一窍不通。有人能给我指点一下吗?

编辑:到目前为止,我在 10.8.0.15 上执行了以下命令

sudo ip rule add fwmark 2 table 3
sudo ip route add default via 10.8.0.42 table 3
sudo ip route flush cache
sudo iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 2
sudo iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.8.0.15
sudo sysctl -w net.ipv4.conf.eth0.rp_filter=2
sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 10.8.0.42

10.8.0.42 上的情况如下

sudo iptables -I FORWARD -i eth0 -o wlan0 -s 10.8.0.0/24 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -I FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo sysctl -w net.ipv4.ip_forward=1

当我现在想测试 10.8.0.15 上的连接时,我得到以下信息

curl http://freegeoip.net/json/
curl: (7) Failed to connect to freegeoip.net port 80: Connection refused

10.8.0.42 上的 tcpdump 显示

sudo tcpdump -n -i eth0 -s 0 src or dst port 80
10:05:18.552329 IP 10.8.0.15.36186 > 10.8.0.42.80: Flags [S], seq 460236380, win 29200, options [mss 1308,sackOK,TS val 22927 ecr 0,nop,wscale 6], length 0
10:05:18.552612 IP 10.8.0.42.80 > 10.8.0.15.36186: Flags [R.], seq 0, ack 460236381, win 0, length 0
10:05:19.068397 IP 10.8.0.15.50052 > 10.8.0.42.80: Flags [S], seq 2824330189, win 29200, options [mss 1308,sackOK,TS val 22969 ecr 0,nop,wscale 6], length 0
10:05:19.068674 IP 10.8.0.42.80 > 10.8.0.15.50052: Flags [R.], seq 0, ack 2824330190, win 0, length 0

此设置的目的是将网络内的任意客户端用作互联网网关。虽然图中只有 10.8.0.42,但可能有多个这样的客户端,每个客户端都有自己的专用互联网访问权限,可能被其他客户端使用。

更新:我现在按照下面的建议测试了以下配置。

盒子0:

sudo ip route add default via 10.8.0.42 dev tun0 table 3
sudo ip rule add fwmark 2 table 3
sudo ip route flush cache
sudo iptables -A OUTPUT -t mangle -p tcp --dport 80 -j MARK --set-mark 2
sudo sysctl -w net.ipv4.conf.eth0.rp_filter=0
sudo iptables -A POSTROUTING -t nat -o eth0 -p tcp --dport 80 -j SNAT --to-source 10.8.0.15
sudo iptables -A POSTROUTING -t nat -o eth0 -p tcp --dport 443 -j SNAT --to-source 10.8.0.15

框1:

sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -A POSTROUTING -t nat -s 10.8.0.0/24 -p tcp --dport 80 -j SNAT --to-source 192.168.0.2
sudo iptables -A POSTROUTING -t nat -s 10.8.0.0/24 -p tcp --dport 443 -j SNAT --to-source 192.168.0.2

box1 上的 tcpdump 输出保持不变:

12:24:05.788127 IP 10.8.0.15.45844 > 10.8.0.42.80: Flags [S], seq 4169666416, win 29200, options [mss 1308,sackOK,TS val 15420789 ecr 0,nop,wscale 6], length 0
12:24:05.788414 IP 10.8.0.42.80 > 10.8.0.15.45844: Flags [R.], seq 0, ack 4169666417, win 0, length 0
12:24:06.786406 IP 10.8.0.15.45844 > 10.8.0.42.80: Flags [S], seq 4169666416, win 29200, options [mss 1308,sackOK,TS val 15420889 ecr 0,nop,wscale 6], length 0
12:24:06.786694 IP 10.8.0.42.80 > 10.8.0.15.45844: Flags [R.], seq 0, ack 1, win 0, length 0
12:24:08.789821 IP 10.8.0.15.45844 > 10.8.0.42.80: Flags [S], seq 4169666416, win 29200, options [mss 1308,sackOK,TS val 15421089 ecr 0,nop,wscale 6], length 0
12:24:08.790111 IP 10.8.0.42.80 > 10.8.0.15.45844: Flags [R.], seq 0, ack 1, win 0, length 0

box0 上的 tcpdump 输出:

11:26:14.220391 IP 10.8.0.15.33420 > 158.69.242.138.80: Flags [S], seq 2659446178, win 29200, options [mss 1460,sackOK,TS val 15433635 ecr 0,nop,wscale 6], length 0
11:26:14.308915 IP 10.8.0.42.80 > 10.8.0.15.33420: Flags [R.], seq 0, ack 2659446179, win 0, length 0
11:26:15.211761 IP 10.8.0.15.33420 > 158.69.242.138.80: Flags [S], seq 2659446178, win 29200, options [mss 1460,sackOK,TS val 15433735 ecr 0,nop,wscale 6], length 0
11:26:15.337652 IP 10.8.0.42.80 > 10.8.0.15.33420: Flags [R.], seq 0, ack 1, win 0, length 0

我猜主要问题是,当 TCP 数据包到达 box1 时,其目的地是 10.8.0.42,而不是 http 请求的 URL(此处:158.69.242.138)的 IP。但我看不出这个目的地在哪里被改变了。

答案1

对我来说,您似乎希望具有eth0和接口的主机对来自所连接的wlan0网络中的设备发出的 http 流量执行 SNAT 。eth0

你可以这样做:

在主机上10.8.0.15,将其设置10.8.0.42为默认网关:

ip route add default via 10.8.0.42 dev eth0

在主机上10.8.0.42,启用 SNAT:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -p tcp --dport 80 -j SNAT --to-source 192.168.0.2
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -p tcp --dport 443 -j SNAT --to-source 192.168.0.2

这将为端口 80 和 443(即 http 和 https)启用 NAT。您可以添加更多端口。如果您希望通过相同路径解析 DNS,则需要为其添加规则等。

如果您希望通过该接口路由所有流量,您只需使用:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j SNAT --to-source 192.168.0.2

编辑:添加了反映更新问题的信息:

问题中的这些行应该使客户端设备将 http/https 流量路由到另一个网关:

sudo ip rule add fwmark 2 table 3
sudo ip route add default via 10.8.0.42 table 3
sudo ip route flush cache
sudo iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 2

编辑:可以按照此答案中给出的说明来处理客户端设备上的路由:https://unix.stackexchange.com/questions/21093/output-traffic-on-different-interfaces-based-on-destination-port#21118

基本上,它与您的问题相同,除了最后一条 DNAT 规则是不需要的。

答案2

该规则sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 10.8.0.42将把所有 http 流量重定向到 10.8.0.42(有目的地),而不是通过 10.8.0.42(路由到)。正如您在 tcpdump 中看到的那样,服务器 10.8.0.42 不接受端口 80 上的连接。

您可以删除此规则。

相关内容