我正在运行一个具有多个接口的 Ubuntu 16.04 实例。我想在第二个接口上配置一些路由。虽然我可以手动执行此操作,但重启后不会继续。
大多数方法建议使用 /etc/network/interfaces 中的接口定义路由,该路由根据来自接口文件的调用转换为 /etc/network/interfaces.d/50-cloud-init.cfg。
令我困惑的是,我不确定第二个接口在哪里或如何定义。
这两个接口是 ens4 和 ens5。只有 ens4 用 定义iface ens4 inet dhcp
。我期望 ens5 也会出现类似的情况,但没有。
运行 ifconfig 显示 ens5 正在运行。另外,ip link show
显示它。
看来我可以将 ens5 添加到 /etc/network/interfaces 而不会造成任何破坏。如果我这样做,似乎还会发生一些其他事情。例如,/run/network 中现在出现了一个“ifstate.ens5”文件。此外,ifdown / ifup 可以在接口上工作。
但是,即使添加也post-up route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.1.1
不会导致在启动时创建路由...但如果我执行 ifdown 然后执行 ifup,则会按预期添加路由。
我的额外研究是,ens5 是通过来自 Google GCE 数据源的 cloud-init 包定义的,这一切都很好,但并没有回答为什么只有 ens4 在 50-cloud-init.cfg 文件中。
那么 ens5 在哪里定义以及如何为 ens5 添加静态路由?
答案1
我不确定这是最好的解决方案,但我确实找到了实现我想要的结果的方法。
首先,我相信 google_compute_engine python 包在启动过程中的某个时刻会执行网络设置操作。我在“/usr/lib/python3/dist-packages/google_compute_engine/network_setup”中找到了它。
不幸的是,我认为虽然这种方法的结果是一个有效的网络,但它会做一些超出正常 Ubuntu“通道”的事情。例如,虽然第二个接口(ens5)在大多数情况下都可以工作并被识别,但由于它没有在 /etc/network/interfaces 中定义,因此依赖于它的任何东西都不太可能工作。
由于其他命令(例如“route”)似乎仍然有效,所以我不确定这有多大问题。
我不确定是否有办法利用这个谷歌包,所以不确定这是否是一个好主意。
我当前的解决方案是利用启动脚本,定义在“https://cloud.google.com/compute/docs/startupscript“。
由于这些启动脚本是在配置网络后运行的,因此我将一个脚本放在一个存储桶中,该脚本根据本地到主机的配置文件在主机上执行一组操作。这样就可以在启动时通过运行命令“route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.1.1 dev ens5”创建静态路由。