我有一个 Raspberry Pi 连接到路由器(Router1),并en0
通过 IP连接到互联网192.168.1.110
,但是我的 RPi 的 wifi 端口( )通过 IP (另一个 LAN 网络)wlan0
连接到另一个路由器(Router2) 。172.31.198.123
现在我的Macbook已连接到Router2(例如使用IP 172.31.198.100
),并且我想通过我的Raspberry Pi访问互联网(也许在Pi上设置VPN服务器或类似的东西)。
只有当我拔出电缆 ( ) 时,我才能从 Macen0
上 ping 通。172.31.198.123
否则 Pi 将使用en0
并且我无法 ping 通 172.31.198.123
。
谁能告诉我该怎么做?
auto lo
iface lo inet loopback
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.1.110
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
auto wlan0
allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
auto wlan1
allow-hotplug wlan1
iface wlan1 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
~$ sudo cat /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="XXXX-WiFi"
key_mgmt=NONE
}
答案1
任何具有多个网络接口的计算机都必须有多个路由,具体来说,您需要在 3 个 rpi 上有 3 个路由,在 mac 上有两个路由,即每个子网前有一个路由和一个默认路由。 (假设您只是使用第二个路由器作为网桥,看起来就是这种情况)
现在有一个有趣的问题,为什么路由没有自动配置?我怀疑第一个问题是 router2 正在运行 dhcp 服务器,并且 rpi 正在使用该 dhcp 服务器(尽管技术上这不是问题,但除非您确切知道自己在做什么,否则会造成混乱)以及您的网络配置您正在使用的工具 rpi 是最佳客户端类型(仅使用最佳网络)并且您尝试将其用作双客户端(同时连接到两个或多个网络,不在接口之间转发数据包)或作为路由器(同时连接两个或多个网络,在接口之间转发数据包)。如果您尝试通过 rpi 将 mac 连接到互联网,则需要将 rpi 指定为 mac 的默认网关,并启用数据包转发。
答案2
我认为最好的方法是使用 iptables 进行伪装(通常称为动态 NAT)。
在您的树莓派中,执行以下操作:
- 加载 iptables NAT 模块:(
modprobe iptable_nat
如果模块已经启动,此步骤可能会失败,因此请尝试以任何一种方式继续) - 启用IP转发:
echo 1 > /proc/sys/net/ipv4/ip_forward
在 iptables 中设置伪装规则:
iptables -A POSTROUTING -t nat -o wlan0 -s 172.31.198.0/24 -d 0/0 -j MASQUERADE
添加以下规则以确保 iptables 不会在过滤的早期阶段丢弃此数据包:
iptables -A FORWARD -t filter -o wlan0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -t filter -i wlan0 -m state --state ESTABLISHED,RELATED -j ACCEPT
现在您需要做到这一点,以便流向互联网的流量能够到达树莓派以进行进一步的路由。您有两种选择:
- 在您的路由器(router2)中,将树莓派(在 wifi 卡上)的 IP 地址定义为默认 GW。
将mac的默认GW更改为树莓派IP。您可以使用以下命令来执行此操作:
route del default route add default 1.2.3.4
当 1.2.3.4 是你的 raspberri pi wifi 网卡上的 IP 地址时。
您可能希望将其保留为脚本,以便每次连接到该网络时都可以运行它。
当然,如果可以的话,选项1更好。它将把所有连接到它的设备路由到互联网(但正如你在评论中所说,这可能不是你想要的),并且它没有必须在你的 mac 中定义静态路由的缺点(你可能还需要连接到其他网络时将其删除)。
这样做应该告诉你的 rasppi 设备将来自 router2 的所有数据包转发到互联网,将标头中的 src IP 地址更改为树莓派中的外部 NIC 之一。当这些连接的响应到达时,树莓派就会知道将它们路由回哪里。简而言之,这就是伪装的过程。
您可以在此处查看有关此内容的更多详细信息: http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:第14章:_Linux_Firewalls_Using_iptables#Masquerading_.28Many_to_One_NAT.29