在Linux电脑上,无线网卡、有线网卡、VPN隧道等网络接口常常同时存在。默认情况下,系统会根据路由优先级自动选择接口,但某些场景(例如使用特定网络访问Telegram)需要我们强制Telegram的流量走指定网卡。本文将利用NetworkManager(网络管理器)配合策略路由与iptables规则,实现这一目标。
一、了解NetworkManager与路由优先级
NetworkManager是Linux桌面环境默认的网络管理服务,它通过连接配置文件管理多个网络接口,并为每个连接分配路由指标(metric)。数值越小优先级越高。默认路由会优先选用metric值最小的连接。
要查看当前活动的网卡和连接,可以运行以下命令:
nmcli device status
nmcli connection show --active
ip route show
其中ip route的默认路由行(default via ...)指示了当前所有外部流量的出口。
二、准备:识别网卡与Telegram进程UID
首先,我们用nmcli确认需要绑定的网卡名称(例如:eth0、wlan0、tun0)。然后,找出Telegram进程的运行用户UID,因为后续的iptables和策略路由都需要根据UID来匹配进程。
pgrep -f telegram -l
ps -o uid= -p $(pgrep -f telegram | head -1)
id -u <telegram用户名>
假设Telegram运行在用户telegram下,其UID为1000。记住这个数值,后文统一以UID 1000为例。
三、方法一:通过NetworkManager配置策略路由绑定
策略路由允许我们为特定流量单独指定路由表。这里我们让Telegram进程的流量查找一张新路由表,并强制通过目标网卡转发。
步骤1:创建独立路由表
编辑/etc/iproute2/rt_tables文件,添加一行(需要root权限):
100 telegram_route
步骤2:为指定网卡添加默认路由到新表
假设目标网卡是eth0,网关为192.168.1.1,执行:
ip route add default via 192.168.1.1 dev eth0 table telegram_route
步骤3:使用NetworkManager持久化策略规则
NetworkManager支持ipv4.routing-rules属性,我们可以直接修改现有连接,让该规则在连接激活时自动应用。这里以修改连接名称“Wired”为例:
nmcli connection modify Wired ipv4.routing-rules "uidrange 1000-1000 lookup telegram_route"
如果连接已激活,需要重启连接生效:
nmcli connection down Wired && nmcli connection up Wired
步骤4:验证
重新启动Telegram,然后使用ip route get检查流量走向:
ip route get 1.1.1.1 from $(ip -4 addr show eth0 | grep inet | awk '{print $2}' | cut -d/ -f1) uid 1000
如果输出显示走eth0,则绑定成功。此方法精确且不影响其他应用,重启后依然有效。
四、方法二:使用iptables的owner模块配合Dispatcher脚本
另一种思路是使用iptables的owner扩展,根据进程UID匹配Telegram流量,并通过SNAT或MARK强制走指定网卡。这里以iptables + 路由标记为例:
步骤1:标记Telegram数据包
iptables -t mangle -A OUTPUT -m owner --uid-owner 1000 -j MARK --set-mark 0x100
步骤2:为本机流量添加策略规则
ip rule add fwmark 0x100 table telegram_route
ip route add default via 192.168.1.1 dev eth0 table telegram_route
步骤3:通过NetworkManager Dispatcher脚本自动应用
为了让规则在NetworkManager重连或启动时自动生效,我们可以编写一个脚本放入/etc/NetworkManager/dispatcher.d/。以下为示例脚本:
#!/bin/bash
if [ "$2" = "up" ]; then
iptables -t mangle -A OUTPUT -m owner --uid-owner 1000 -j MARK --set-mark 0x100
ip rule add fwmark 0x100 table telegram_route
ip route add default via 192.168.1.1 dev eth0 table telegram_route
fi
赋予脚本执行权限:sudo chmod +x /etc/NetworkManager/dispatcher.d/telegram_route。这样网卡每次被NetworkManager激活时,规则都会被重新创建。
五、方法三:调整连接Metric(全局优先)
如果你希望整个系统优先使用指定网卡,而不仅仅是Telegram,直接调整NetworkManager连接的IPv4路由指标是最简单的办法。例如,让eth0的metric设为100,wlan0设为200:
nmcli connection modify Wired ipv4.route-metric 100
nmcli connection modify WiFi ipv4.route-metric 200
nmcli connection reload
重新激活连接后,ip route中默认路由会变为eth0。此方法适合将Telegram和所有其他流量都固定到指定网卡。
总结
通过NetworkManager与Linux内核路由特性,我们可以灵活地将Telegram绑定到特定网卡。推荐使用策略路由方式,因为它精确且不干扰其他应用;若需动态适配网络环境,可结合iptables与Dispatcher脚本。务必注意,所有配置都需要root权限,且修改后建议先测试,以免断网。若Telegram运行在Flatpak或Snap容器中,UID可能不同,请先确认实际运行进程的用户。