Ubuntu 22.04双网卡下SSH走静态IP、下载走动态IP的配置方案咨询
嗨,根据你描述的场景(Ubuntu 22.04双网卡,eno1静态IP/10Mbps、ens20动态IP/600Mbps,希望SSH走静态网卡、下载走动态网卡),结合你提供的路由表信息:
ip route default via XX.XX.XX.41 dev eno1 proto static metric 100 default via 10.0.0.6 dev ens20 proto static metric 101 10.0.0.0/8 dev ens20 proto kernel scope link src 10.0.13.64 metric 101 XX.XX.XX.40/28 dev eno1 proto kernel scope link src XX.XX.XX.43 metric 100 169.254.0.0/16 dev eno1 scope link metric 1000 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
你提到调整ens20的metric到100会导致SSH中断,这是因为默认路由优先级相同时,系统会随机选择路由,可能让SSH流量误走动态网卡。下面给你几个可靠的解决方案:
方案一:基于SSH客户端IP的策略路由(最精准)
这个方法给你常用的SSH客户端IP/网段单独指定路由,强制走静态网卡,其他所有流量默认走动态网卡,完全不会冲突:
创建自定义路由表
编辑路由表配置文件,添加一个编号为200的路由表(编号只要没被占用即可):echo "200 ssh_route" | sudo tee -a /etc/iproute2/rt_tables添加路由规则
假设你的SSH客户端IP是YY.YY.YY.Z(或网段YY.YY.YY.0/24),添加规则让来自这个IP的流量使用ssh_route表:# 单个IP的情况 sudo ip rule add from YY.YY.YY.Z table ssh_route # 整个网段的情况 # sudo ip rule add from YY.YY.YY.0/24 table ssh_route给自定义路由表加默认路由
让ssh_route表的流量默认走静态网卡eno1:sudo ip route add default via XX.XX.XX.41 dev eno1 table ssh_route调整动态网卡的默认路由优先级
把ens20的metric改成比eno1的100更低(比如90),让默认流量优先走动态网卡:sudo ip route change default via 10.0.0.6 dev ens20 proto static metric 90
配置完成后,只有来自指定SSH客户端IP的流量会走静态网卡,其他下载、浏览等流量自动走动态网卡,完美分流。
方案二:基于端口的标记路由(按应用端口分流)
如果不确定SSH客户端IP,或者想按端口区分(比如SSH用22端口,下载用80/443/21等端口),可以用iptables标记流量,再配合路由规则:
标记下载相关端口的流量
给常用的下载端口(比如HTTP的80/443、FTP的21/20)打标记(比如标记100):sudo iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 100 sudo iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 100 sudo iptables -t mangle -A OUTPUT -p tcp --dport 21 -j MARK --set-mark 100 sudo iptables -t mangle -A OUTPUT -p tcp --dport 20 -j MARK --set-mark 100 # 可根据你常用的下载工具端口继续添加创建下载专用路由表
同样添加一个自定义路由表:echo "201 download_route" | sudo tee -a /etc/iproute2/rt_tables添加标记匹配规则
让标记为100的流量使用download_route表:sudo ip rule add fwmark 100 table download_route给下载路由表加默认路由
让标记的流量走动态网卡ens20:sudo ip route add default via 10.0.0.6 dev ens20 table download_route
这个方案不需要修改默认路由的metric,SSH的22端口流量没被标记,会继续走默认的eno1,下载端口的流量被标记后走ens20,也能实现分流。
方案三:临时手动切换路由(适合偶尔使用)
如果不想配置永久规则,只是偶尔需要下载时切换网卡,可以手动修改默认路由:
切换到动态网卡下载:
sudo ip route del default via XX.XX.XX.41 dev eno1 sudo ip route add default via 10.0.0.6 dev ens20 metric 90下载完成后切回静态网卡:
sudo ip route del default via 10.0.0.6 dev ens20 sudo ip route add default via XX.XX.XX.41 dev eno1 metric 100
这个方法简单直接,但需要手动操作,适合临时需求。
让配置永久生效
上面的命令都是临时生效的,重启后会失效。如果要永久保存,可以用Ubuntu默认的netplan工具配置:
编辑你的netplan配置文件(通常在/etc/netplan/目录下,比如00-installer-config.yaml):
network: ethernets: eno1: addresses: [XX.XX.XX.43/28] gateway4: XX.XX.XX.41 metric: 100 ens20: dhcp4: true metric: 90 version: 2 # 添加策略路由规则(对应方案一) routing-policy: - from: YY.YY.YY.Z/32 # 替换成你的SSH客户端IP table: 200 routes: - to: 0.0.0.0/0 via: XX.XX.XX.41 table: 200
保存后执行下面的命令生效:
sudo netplan generate sudo netplan apply
这样重启系统后配置依然有效。
备注:内容来源于stack exchange,提问作者pugazh

