连接拒绝共享的Internet连接

下图显示了我的networking的拓扑结构。 Schmatic 我现在想要使用wlan0将来自10.8.0.15的所有httpstream量通过10.8.0.42路由到外部世界。 不幸的是,当谈到iptables和路由时,我是一个noob。 任何人都可以指出我正确的方向?

编辑:到目前为止,我在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 

当我现在要testing10.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 

此设置的目的是使用networking内的任意客户端作为Internet网关。 而在图中只有10.8.0.42,可能有多个这样的客户端,每个客户端都有自己的专用互联网访问,可能被其他客户端使用。

更新:我现在testing下面的build议如下configuration。

box0:

 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 

BOX1:

 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)。 但是我看不到这个目的地被改变了。

对我来说,看起来你希望eth0wlan0接口的主机对来自eth0连接的networking中的设备的httpstream量执行SNAT。

你可以这样做:

在主机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启用了NAT,即http和https。 您可以添加更多的端口。 如果你想通过相同的pathparsingDNS,你需要添加一个规则等。

如果你想通过这个接口获得所有的stream量路由,你可以简单地使用:

 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规则是不需要的。

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

你可以删除这条规则。