我有一个可以连接互联网的家庭路由器。我还有一台计算机,但无法直接连接到路由器。希望我有两个我不知道该怎么办的树莓派。
我根据@User1686的回答在 PI #1 上运行了以下命令:
# Set static IP for eth0 interface
ip addr add 192.168.1.100/24 dev ppp0
# Set static IP for ppp0 interface
ip addr add 192.168.0.1/24 dev ppp0
# Enable IP forwarding
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding=1' >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf
# Route packets to PI #2
ip route add 192.168.2.0/24 via 192.168.0.2 dev ppp0
# Masquerade all outgoing packets with his own IP
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
并在 PI #2 上运行以下命令:
# Set static IP for eth0 interface
ip addr add 192.168.2.1/24 dev eth0
# Set static IP for ppp0 interface
ip addr add 192.168.0.2/24 dev ppp0
# Enable IP forwarding
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding=1' >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf
# Forward packets to PI #1
ip route add default via 192.168.0.1
ip route add 192.168.1.0/24 via 192.168.0.1 dev ppp0
# Masquerade all outgoing packets with his own IP
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
我还在计算机上启用了静态 IP 以连接到 PI #2:
# Set static IP
ip addr add 192.168.2.100/24 dev eth0
# Forward packets to PI #2
ip route add default via 192.168.2.1
# Add DNS server
echo "nameserver 8.8.8.8" | sudo tee -a /etc/resolv.conf
我遇到了一些问题,因为我无法从我的计算机访问某些 IP 和互联网。这是我尝试过的快速表格:
命令 | 圆周率 #1 | 圆周率#2 | 电脑 | HomeRouter 上的任何设备 |
---|---|---|---|---|
平 192.168.0.1 | 好的 | 好的 | 好的 | 没有 |
平 192.168.0.2 | 好的 | 好的 | 好的 | 没有 |
平 192.168.1.1 | 好的 | 好的 | 好的 | 好的 |
ping 192.168.2.1 | 好的 | 好的 | 好的 | 没有 |
平 192.168.1.100 | 好的 | 好的 | 好的 | 好的 |
平 192.168.2.100 | 好的 | 好的 | 好的 | 没有 |
卷曲8.8.8.8 | 好的 | 好的 | 好的 | 好的 |
卷曲 google.com | 好的 | 好的 | 好的 | 好的 |
根据@User1686的回答,我的计算机现在能够与我的家庭路由器上的其他设备进行通信,但它们现在能够与我的计算机进行通信(ping 192.168.2.100
例如)。
有没有一种方法可以在不编辑路由器配置的情况下路由数据包?
简而言之,每个设备都需要为每个非本地网络提供路由。仅仅有一条通往设备的路由是不够的——设备还需要有一条返回您的路由。
在某些情况下,它可能已经被“默认”路由覆盖(例如,HomeRouter←Pi#2 可以通过 Pi#2 的默认路由到达),但并非在所有情况下都是如此。
家庭路由器应具有 192.168.0.0/24 和 192.168.2.0/24 的路由。现在,它从 Pi#2 接收到您的 ping,但无法响应(或者更确切地说,它的响应通过 WAN 链接)。
(在这两种情况下,需要将最近的路由器(即 Pi#1)指定为“网关”。)
Pi #1 需要 192.168.2.0/24 的路由。你已经有了这个。
Pi #2 需要 199.168.1.0/24 的路由。您已经拥有它,既作为显式路由又作为默认路由(可能)。
最后,计算机应该只有一条通过 Pi #2 的“默认”路由(即 0.0.0.0/0 路由)。现在,除了子网路由之外,它可能根本没有任何路由。
如果家庭路由器不支持配置静态路由,您也许可以使用 SNAT 作为解决方法 - 让 Pi#1 通过 iptables 使用自己的地址伪装所有数据包。但是,请记住,伪装仅有助于仅在一个方向(出站)建立的连接;它无助于发送“新”数据包入站。
因此,将 SNAT/MASQUERADE 的使用保持在绝对最低限度,并尽可能使用正常路由 - 例如,如果 HomeRouter 是问题所在(无法执行静态路由),则仅在 Pi#1 上面向 HomeRouter 的接口上使用 SNAT(即在路由网络的边缘)。您不需要 Pi#2 上的额外 SNAT。
如果您需要通过被迫使用 SNAT 的接口进行入站连接,典型的解决方法是使用 DNAT(又名“端口转发”)——创建一条与 Pi#1 的某些连接相匹配的规则,并对它们进行 DNAT电脑。
(它不需要逐个端口 - 您也可以将整个第二个 IP 地址分配给 Pi#1,并专门使用它来将该地址的所有内容 DNAT 到计算机,有点像“DMZ”功能在路由器中。)
由于您已经在使用
ip route
,我还建议您不要ip addr add 192.168.2.100/24 dev eth0
使用 ifconfig。(ifconfig 仍然存在的最大问题(即使在最新版本中)是它会悄悄地无法显示每个接口的多个 IPv4 地址,这有时会变得非常混乱。)