在接口之间转发流量

在接口之间转发流量

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

我想实现以下结果:

在此处输入图片描述

我的计算机的 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.102192.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_arpsysctl,似乎与手动添加的代理邻居条目正交)进行设置,但用户空间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。

相关内容