无法在多个 RPi 之间转发数据包

无法在多个 RPi 之间转发数据包

我有一个带互联网连接的家用路由器。我还有一台电脑,但它放在一个无法直接连接到路由器的地方。希望我有两个不知道该怎么用的树莓派。

在此处输入图片描述

我在 PI #1 上运行了以下命令@用户1686的回答:

    # 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 和互联网。以下是我尝试过的快速表格:

命令 Pi#1 Pi#2 电脑 HomeRouter 上的任何设备
ping 192.168.0.1 好的 好的 好的 没有
ping 192.168.0.2 好的 好的 好的 没有
ping 192.168.1.1 好的 好的 好的 好的
ping 192.168.2.1 好的 好的 好的 没有
ping 192.168.1.100 好的 好的 好的 好的
ping 192.168.2.100 好的 好的 好的 没有
curl 8.8.8.8 好的 好的 好的 好的
curl google.com 好的 好的 好的 好的

基于@用户1686的回答,我的电脑现在可以与家里的路由器上的其他设备通信,但它们现在可以与我的电脑通信(ping 192.168.2.100例如)。

有没有办法无需编辑路由器配置来路由数据包?

答案1

简而言之,每个设备都需要一条路由每一个非本地网络。仅仅拥有通向设备的路由是不够的——设备需要有路由后退你也是。

在某些情况下,它可能已经被“默认”路由覆盖(例如,HomeRouter←Pi#2 可通过 Pi#2 的默认路由到达),但并非在所有情况下都是如此。

  1. 家庭路由器应该有 192.168.0.0/24 和 192.168.2.0/24 的路由。目前,它从 Pi#2 接收到您的 ping,但无法响应(或者说,它的响应通过 WAN 链接)。

    (在这两种情况下,最近路由器即 Pi#1 需要指定为“网关”。)

  2. Pi #1 需要一条 192.168.2.0/24 的路由。您已经拥有了它。

  3. Pi #2 需要一条 199.168.1.0/24 的路由。您已经拥有了这条路由,既是显式路由,也是(可能)默认路由。

  4. 最后,计算机应该只有通过 Pi #2 的“默认”路由(即 0.0.0.0/0 路由)。目前,除了子网路由之外,它可能根本没有任何路由。

如果家用路由器不支持配置静态路由,您可以使用 SNAT 作为解决方法 - 通过 iptables 让 Pi#1 用自己的地址伪装所有数据包。但是,请记住,伪装仅对在仅限一个方向(出站);它对发送“新”数据包入站没有帮助。

因此,请尽量减少 SNAT/MASQUERADE 的使用,并尽可能使用正常路由 - 例如,如果 HomeRouter 是问题所在(无法进行静态路由),则仅在 Pi#1 上面向 HomeRouter 的接口上使用 SNAT(即在路由网络的边缘)。您不需要在 Pi#2 上使用额外的 SNAT。

如果您需要通过强制使用 SNAT 的接口建立入站连接,典型的解决方法是使用 DNAT(又名“端口转发”) - 创建一个匹配与 Pi#1 的某些连接的规则,并将它们 DNAT 到计算机。

(它不需要逐个端口 - 您还可以为 Pi#1 分配整个第二个 IP 地址,并专门使用它来将该地址的所有内容 DNAT 到计算机,有点像路由器中的“DMZ”功能。)


由于您已经在使用ip route,因此我也建议您使用ip addr add 192.168.2.100/24 dev eth0,而不是 ifconfig。(ifconfig 仍然存在的最大问题(即使在最新版本中)是它会悄悄地无法显示每个接口的多个 IPv4 地址,这有时会让人非常困惑。)

相关内容