我有一台运行 Debian (Raspbian) 衍生版的计算机,带有两个 NIC,一个是以太网 ( eth0
),另一个是无线 ( wlan0
)。eth0
将机器连接到专用 LAN 并具有静态地址,同时wlan0
将机器连接到 Internet 并配置 wpa_supplicant。无需额外配置,我可以 ping 通 LAN 上的路由器,但无法 ping 通 google.com。经过一些研究后,我认为实现此目的最简洁的方法是设置自定义路由表。路由规则将路由所有进出 LAN 网络的流量eth0
,而所有其他流量将通过wlan0
。如果这个逻辑有错误,请纠正我。
我已经弄清楚需要如何设置路由表来完成此任务;当我使用命令手动设置规则时,我可以使其工作ip route
。问题是,在使用post-up
接口文件中的命令启动接口时,我似乎无法设置路由表。
从头开始解释我的思考过程......
route -n
这是没有额外配置的输出。
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 10.109.48.1 0.0.0.0 UG 303 0 0 wlan0
10.109.48.0 0.0.0.0 255.255.240.0 U 303 0 0 wlan0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
据我了解,双方沟通上存在冲突。“任何目的地”,这是通过使用解决的,eth0
因为它的度量较低。这使得所有出站流量都通过eth0
。理想情况下,只有发往 LAN 和来自 LAN 的流量才应通过eth0
。因此,我认为通过删除默认生成的规则并制定一个指定网络目的地和网关的规则,我可以实现我想要的行为。在运行一些命令删除默认路由规则并添加我描述的新规则后,我得到了以下路由表。
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.109.48.1 0.0.0.0 UG 303 0 0 wlan0
10.109.48.0 0.0.0.0 255.255.240.0 U 303 0 0 wlan0
192.168.0.0 192.168.0.1 255.255.255.0 UG 0 0 0 eth0
之后,我可以 ping 通 LAN 的网关和 google.com。所以看来我的直觉是正确的。如果这只是侥幸,请纠正我。
为了使路由规则永久存在,我发现的许多指南和 Serverfault 答案都表明,使用post-up
接口文件中的命令是实现此目的的最佳方法。所以我编辑了接口文件,如下所示。
# interfaces(5) file used by ifup(8) and ifdown(8)
# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d
auto lo
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet static
address 192.168.0.10
network 192.168.0.0
netmask 255.255.255.0
gateway 192.168.0.1
up ip route delete via 192.168.0.1 dev eth0
up ip route delete 192.168.0.0/24 via 0.0.0.0 dev eth0
up ip route add 192.168.0.0/24 via 192.168.0.1 dev eth0
allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
allow-hotplug wlan1
iface wlan1 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
重新启动后,路由表保持与默认值相同。 boot.log 不显示ifup eth0
抛出任何错误。我不知道可能导致这些问题的原因。
答案1
所以我的问题不是概念问题,而是我从中汲取知识的指南已经非常过时了。此问题属于以下类别:Systemd再次出击!。
当前的 Raspbian 发行版遵循 Debian Jessie,它使用 systemd。 systemd 并不遵循 的所有内容/etc/network/interfaces
,而是使用它来生成 的规则/etc/dhcpcd.conf
。 Systemd 以所有接口配置为基础,无论寻址是静态还是动态,都基于/etc/dhcpcd.conf
.
为了获得我想要的行为,我首先删除了除此之外的eth0
所有/etc/network/interfaces
配置
allow-hotplug eth0
iface eth0 inet static
然后我编辑了该interface eth0
部分/etc/dhcpcd.conf
...
interface eth0
static ip_address=192.168.0.10
注意,我没有设置static router=192.168.0.1
。这将生成default via 192.168.0.1 dev eth0
我不希望出现的路由(因为它与 wlan0 的默认路由冲突)。
通过最小的配置,我现在可以使用两个接口通过各自的网络进行通信。