我有一个带互联网连接的家用路由器。我还有一台电脑,但它放在一个无法直接连接到路由器的地方。希望我有两个不知道该怎么用的树莓派。
我想实现以下结果:
我的计算机的 IP 无法更改,因为它已被路由器网络上的其他设备使用。
到目前为止,我已经能够进行以下通信(IP 已设置ifconfig
):
命令 | 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 | 好的 | 好的 | 好的 | 不可以(子网不同) |
ping 192.168.1.102 | 好的 | 好的 | 好的 | 没有 |
curl 8.8.8.8 | 好的 | 好的 | 好的 | 好的 |
curl google.com | 好的 | 好的 | 好的 | 好的 |
两个 PI 上都执行了以下命令行:
# 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
# Masquerade outgoing packets
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# Add DNS
echo "nameserver 8.8.8.8" | sudo tee -a /etc/resolv.conf
- 在 PI #1 上,我添加了以下路线:
# Set static IP for both interfaces
ifconfig eth0 192.168.1.100 netmask 255.255.255.0
ifconfig ppp0 192.168.0.1 netmask 255.255.255.0
# Add routes
ip route add 192.168.2.0/24 via 192.168.0.2 dev ppp0 # Route packets to Pi #2
- 在 PI #2 上,我添加了以下路线:
# Set static IP for both interfaces
ifconfig eth0 192.168.2.1 netmask 255.255.255.0
ifconfig ppp0 192.168.0.2 netmask 255.255.255.0
# Add routes
ip route add default via 192.168.0.1
ip route add 192.168.1.0/24 via 192.168.0.1 dev ppp0 # Route packets to Pi #1
- 在我的电脑上:
# Set static IP
ifconfig eth0 192.168.2.100 netmask 255.255.255.0
# Add routes
ip route add default via 192.168.2.1
# Add DNS
echo "nameserver 8.8.8.8" | sudo tee -a /etc/resolv.conf
我尝试在第一个 PI 的 eth0 接口上添加第二个 IP。计划是将所有到达的数据包重定向192.168.1.102
到192.168.2.100
。
# Add a new IP to PI #1's eth0
ip addr add 192.168.1.102 dev eth0
# Masquerade IP
iptables -t nat -A PREROUTING -i eth0 -s 192.168.1.102 -j DNAT --to-destination 192.168.2.100
iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.2.100 -j SNAT --to-source 192.168.1.102
這有幫助嗎?
答案1
如果希望两端都存在相同的网络号,路由通常是不够的。
一般来说,你需要记住,在 IP 之下还有另一层寻址。在以太网(和 Wi-Fi)上,所有数据包都会传送到特定的 MAC 地址——在你的 Pi 可以转发数据包之前,它需要收到该数据包,并且只有当发送方知道(通过 ARP 或通过其路由表)它需要将数据包发送到 Pi 时,才会发生这种情况。
尝试添加 /32 路由是一个好的开始,但在 Pi 上这样做只有在数据包首先传送到 Pi 时才有帮助 - 目前,“左侧”192.168.1.0/24 网络中的设备不知道他们需要通过 Pi#1 的 MAC 发送数据包。
换句话说,您的家庭路由器不会自动知道 192.168.1.2 或 192.168.1.Y 位于另一个路由器后面 - 它被配置为假定整个 /24 是“在线链接”,并回答 ARP 回复。
这可以通过两种方式完成:要么通过 Pi#1 在“家庭路由器”(以及连接到“家庭路由器”的所有其他设备)上添加相同类型的 /32 路由,要么配置 Pi#1 执行代理地址解析协议,即代表其不直接拥有的 IP 回答 ARP 查询。
ip neigh add ... proxy
在这种情况下,我通常会选择代理 ARP;它可以在 Linux 上通过(和/或proxy_arp
sysctl,似乎与手动添加的代理邻居条目正交)进行设置,但用户空间parpd
守护进程更容易配置。
有了代理 ARP,当您的家庭网关(或某台计算机)尝试将数据包发送到 192.168.1.Y 时,它将通过 ARP 了解 Pi#1 的 MAC 地址,并将数据包定向到那里。您应该在另一端执行相同操作,代表 /24 的其余部分向 PC Y 提供代理 ARP 响应。
桥接这可能是解决整体问题的更好方法。您可以在两个 Pi 之间设置 VXLAN 或 EoIP 隧道(基本上是 Ethernet-over-IP),将隧道接口桥接到物理以太网接口,这样您实际上就会有一个从家庭路由器延伸到计算机 Y 的单个子网,所有内容(包括 ARP、IPv6 等)都在 MAC 层转发。
如果 Pi 上的 Wi-Fi 接口支持“4addr”模式,也可以在没有隧道的情况下实现桥接;AP 始终可桥接,但站点需要激活 4addr 模式才能实现桥接,并且必须将 AP 配置为接受 4addr 帧。在这种情况下,不再需要 192.168.0.0/24 子网;它只会是 192.168.1.0/24。