我的电脑(Ubuntu 16.04)通过以太网电缆连接到家庭网络。我想搬到另一个房间并使用 Wifi。我希望尽可能无缝地切换(例如,避免 VPN 断开连接)。我可以连接到 Wifi 和以太网,但如果此时我断开以太网应用程序,则会收到连接错误。
所以我想我需要一种方法来强制流量在断开电线之前使用 Wifi 接口。当两个接口都处于活动状态时,ip route
显示:
default via 192.168.0.254 dev enp0s31f6 proto static metric 100
default via 192.168.0.254 dev wlp4s0 proto static metric 600
192.168.0.0/24 dev enp0s31f6 proto kernel scope link src 192.168.0.43 metric 100
192.168.0.0/24 dev wlp4s0 proto kernel scope link src 192.168.0.7 metric 600
如果我使用:
ip route del default via 192.168.0.254 dev enp0s31f6
交通变得缓慢。
所以我想我必须更微妙一点,让两个接口都保持活动一段时间,但让 Wifi 接口成为首选。我相信这是通过在 Wifi 接口上采用比以太网接口更小的指标来实现的。但是,如果我这样做:
ip route change default via 192.168.0.254 dev enp0s31f6 proto static metric 600
我得到:
default via 192.168.0.254 dev enp0s31f6 proto static metric 100
default via 192.168.0.254 dev enp0s31f6 proto static metric 600
因此,该命令似乎替换了具有给定指标的任何接口。如果我尝试使用 100 或 600 之外的任何其他指标值,我会得到:
RTNETLINK answers: No such file or directory
当然,如果我使用 Wifi 并重新连接到以太网,流量会无缝切换到它......
那么,我的哪些假设是错误的?有解决办法吗?
答案1
豪克提到的解决方案是一种方法。这种方法的缺点是您必须保持(有线)以太网接口处于插入状态,直到所有连接“耗尽”为止。
另一种更平滑但也更复杂的方法(例如,我现在不知道您是否可以使用 NetworkManager 来实现这一点,您的路由指标建议您正在使用),将使用绑定将接口绑定在一起。这样,当拔掉有线以太网连接时,连接将自动故障转移到使用 WiFi。
我已经在我的回答中给出了如何配置 WiFi 和有线连接绑定的更详细解释使用 WiFi 端口作为冗余链路。
答案2
您应该放出以太网接口的血。您可以借助iptables
高级路由来做到这一点。和
iptables -m conntrack --ctstate NEW
您可以在 OUTPUT 链中找到新的连接并用 标记它们--set-mark
。
您可以使用它ip rule
通过 WiFi 路由带有此标记的数据包。
一段时间后,您的所有或至少大部分流量将使用 WiFi,而不会遇到任何中断。
如果您控制路由器,那么您甚至可以使用 SNAT 保存永久连接。