我有一个带互联网连接的家用路由器。我还有一台电脑,但它放在一个无法直接连接到路由器的地方。希望我有两个不知道该怎么用的树莓派。
我在 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 的默认路由到达),但并非在所有情况下都是如此。
家庭路由器应该有 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 作为解决方法 - 通过 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 地址,这有时会让人非常困惑。)