查看: 1263|回复: 6
[红米ax6000]
双wan拨号和分流思路分享
[复制链接]
kikbeta
kikbeta
当前离线
积分16
IP卡
狗仔卡
电梯直达
1#
发表于 2025-4-7 21:37
|
只看该作者
|倒序浏览
|阅读模式
本帖最后由 kikbeta 于 2025-4-7 21:42 编辑
家里有电信和联通两个宽带。用redmi ax6000 双wan拨号(通过光猫拨号的话,光猫cpu经常过高,所以直接ax6000来拨号)。设置分流,对国内不同运营商ip设置静态路由,其中电信、移动走电信出口,联通、歪果走联通出口,主要是电信、移动的互联好,移动和联通互联差,联通和歪果互联相对好。下面分享下思路和相关配置,对应的openwrt版本是23.05,网络架构DSA。
1.将其中的lan3改为wan。lan3 mac地址需要更改(可以将mac最后面两个字符对调)
修改/etc/config/network
其中
config device
option name 'br-lan'
option type 'bridge'
list ports 'eth1'
list ports 'lan1'
list ports 'lan2'
list ports 'lan3'
上面删掉 list ports 'lan3'一行
config device
option name 'lan3'
option macaddr 'xx:xx:xx:xx:xx:xx'
更改上面的mac地址,比如将mac最后面两个字符对调。
2.创建拨号接口pppoe_CT和pppoe_CU,分别对应电信和联通。其中pppoe_CT对应lan3接口,metric设置为20;pppoe_CU对应wan接口,metric设置为10。目的是电信、移动走电信外(移动和联通的网络互联不行,会有丢包,移动和电信互联还行),其余默认走联通。
3.通过脚本设置分流(非mwan3方案,mwan3和其它软件有冲突),设置/etc/init.d/route_split和/etc/hotplug.d/iface/99-route-split两个脚本,在pppoe接口变化的时候可以删减路由。意图是电信、移动走电信出口,设置metric 5的路由,联通、歪果走联通出口,也设置metric 5的路由。metric 5是为了覆盖第2点metric设置为20、10的默认路由。如果某个接口down了,就删掉对应的路由,由第2点的路由策略接管。
1)/etc/init.d/route_split脚本的内容如下(我创建/etc/ipset目录,把不同运行商的ip段txt文件放在里面,其实就是mwan3helper下载回来的txt文件,可以通过安装mwan3helper软件来提取,或者自己找)
cat > /etc/init.d/route_split << 'EOF'
#!/bin/sh /etc/rc.common
START=65
STOP=90
IPSET_DIR="/etc/ipset"
WAN1_IFACE="pppoe-pppoe_CT"
WAN2_IFACE="pppoe-pppoe_CU"
log() {
logger -t "route_split" "$1"
echo "$1"
}
# 获取网关地址
get_gateway() {
local iface="$1"
ip route show dev "$iface" | awk '/via/ {print $3; exit}'
}
# 处理IP文件并添加路由
process_ip_file() {
local file="$1"
local gw="$2"
local iface="$3"
[ -f "$file" ] || {
log "Warning: $file not found"
return 1
}
while read -r ip; do
# 跳过空行和注释
[ -z "$ip" ] || [[ "$ip" =~ ^[[:space:]]*# ]] && continue
if ip route add "$ip" via "$gw" dev "$iface" metric 5 2>/dev/null; then
/lib/system.mark
log "Added route: $ip via $gw dev $iface metric 5"
else
log "Error: Failed to add route for $ip"
fi
done < "$file"
}
# 清理指定接口的路由
clean_routes() {
local iface="$1"
ip route show dev "$iface" | awk '/metric 5/ {print "ip route del "$0" 2>/dev/null"}' | sh -
log "Cleaned up all metric 5 routes for $iface"
}
setup_routes() {
local iface="${1:-}"
local wan1_gw wan2_gw
log "Setting up routes ${iface:+for $iface}..."
# 处理WAN1接口
if [ -z "$iface" ] || [ "$iface" = "$WAN1_IFACE" ]; then
/lib/system.mark
wan1_gw=$(get_gateway "$WAN1_IFACE")
[ -z "$wan1_gw" ] && {
log "Error: Failed to get gateway for $WAN1_IFACE"
return 1
}
log "WAN1 ($WAN1_IFACE) gateway: $wan1_gw"
clean_routes "$WAN1_IFACE"
for file in "$IPSET_DIR/chinatelecom.txt" "$IPSET_DIR/cmcc.txt"; do
process_ip_file "$file" "$wan1_gw" "$WAN1_IFACE"
done
fi
# 处理WAN2接口
if [ -z "$iface" ] || [ "$iface" = "$WAN2_IFACE" ]; then
/lib/system.mark
wan2_gw=$(get_gateway "$WAN2_IFACE")
[ -z "$wan2_gw" ] && {
log "Error: Failed to get gateway for $WAN2_IFACE"
return 1
}
log "WAN2 ($WAN2_IFACE) gateway: $wan2_gw"
clean_routes "$WAN2_IFACE"
process_ip_file "$IPSET_DIR/unicom_cnc.txt" "$wan2_gw" "$WAN2_IFACE"
local vps_ip=$(uci get “师夷长技以制夷”.@global[0].server 2>/dev/null)
[ -n "$vps_ip" ] && {
ip route add "$vps_ip" via "$wan2_gw" dev "$WAN2_IFACE" metric 5 && \
log "Added route for “师夷长技以制夷” VPS $vps_ip via $wan2_gw dev $WAN2_IFACE metric 5"
}
fi
log "Current routing table:"
ip route | while read -r line; do log " $line"; done
}
start() {
local iface="$1"
log "Starting route split configuration${iface:+ for $iface}..."
if [ -z "$iface" ]; then
/lib/system.mark
setup_routes "$WAN1_IFACE"
setup_routes "$WAN2_IFACE"
else
setup_routes "$iface"
fi
log "Route split configuration completed!"
}
stop() {
local iface="$1"
log "Stopping route split configuration${iface:+ for $iface}..."
if [ -z "$iface" ]; then
/lib/system.mark
clean_routes "$WAN1_IFACE"
clean_routes "$WAN2_IFACE"
else
clean_routes "$iface"
fi
log "Route split configuration stopped!"
}
restart() {
local iface="$1"
log "Restarting route split configuration${iface:+ for $iface}..."
if [ -z "$iface" ]; then
/lib/system.mark
stop
start
else
stop "$iface"
start "$iface"
fi
}
EOF
chmod +x /etc/init.d/route_split
2) /etc/hotplug.d/iface/99-route-split的内容
cat > /etc/hotplug.d/iface/99-route-split << 'EOF'
#!/bin/sh
[ -n "$DEBUG" ] && env > /tmp/hotplug-route-env.log
logger -t "hotplug-route" "Event: SUBSYSTEM=$SUBSYSTEM INTERFACE=$INTERFACE ACTION=$ACTION"
WAN1_IFACE="pppoe-pppoe_CT"
WAN2_IFACE="pppoe-pppoe_CU"
MAX_WAIT=30
is_managed_interface() {
case "$INTERFACE" in
"pppoe_CT"|"pppoe_CU") return 0 ;;
*) return 1 ;;
esac
}
get_wan_gateway() {
local iface="$1"
ip route show dev "$iface" | awk '/via/ {print $3; exit}'
}
if is_managed_interface; then
logger -t "hotplug-route" "Matched Interface $INTERFACE action $ACTION"
case "$ACTION" in
"ifup"|"ifupdate")
# 确定对应的WAN接口
case "$INTERFACE" in
"pppoe_CT") target_iface="$WAN1_IFACE" ;;
"pppoe_CU") target_iface="$WAN2_IFACE" ;;
esac
# 等待网关出现
i=0
while [ $i -lt $MAX_WAIT ]; do
gw=$(get_wan_gateway "$target_iface")
[ -n "$gw" ] && break
sleep 1
i=$((i + 1))
done
if [ -z "$gw" ]; then
logger -t "hotplug-route" "Error: No gateway found for $target_iface after ${MAX_WAIT}s"
exit 1
fi
/etc/init.d/route_split restart "$target_iface"
;;
"ifdown")
case "$INTERFACE" in
"pppoe_CT") /etc/init.d/route_split stop "$WAN1_IFACE" ;;
"pppoe_CU") /etc/init.d/route_split stop "$WAN2_IFACE" ;;
esac
;;
esac
fi
EOF
chmod +x /etc/hotplug.d/iface/99-route-split
4.如果有公网ip,需要设置pppoe接口的源进源出。通过/etc/hotplug.d/iface/97-update-tables和/etc/custom_scripts/update_pppoe_tables.sh两个脚本来实现,主要是通过iproute2设置rule: from xxx(电信或联通ip) lookup table xxx(分别定义电信和联通的table,下文分别是150和200)
1、配置/etc/hotplug.d/iface/97-update-tables,监视接口变化的时候。
cat > /etc/hotplug.d/iface/97-update-tables << 'EOF'
#!/bin/sh
[ -n "$DEBUG" ] && set -x
MAX_WAIT=30
MANAGED_INTERFACES="pppoe_CT pppoe_CU pppoe_CT_6 pppoe_CU_6"
PHY_IFACE_MAP="pppoe_CT:pppoe-pppoe_CT pppoe_CU:pppoe-pppoe_CU pppoe_CT_6:pppoe-pppoe_CT pppoe_CU_6:pppoe-pppoe_CU"
log() { logger -t "hotplug-update-tables" "$*"; }
get_phy_interface() {
[ -z "$1" ] && { log "Error: Missing interface name"; return 1; }
for mapping in $PHY_IFACE_MAP; do
[ "${mapping%:*}" = "$1" ] && { echo "${mapping#*:}"; return 0; }
done
log "Error: No physical interface mapped for $1"
return 1
}
wait_for_network_info() {
local phy_iface="$1" ip ip6 gw i
[ -z "$phy_iface" ] && { log "Error: Missing physical interface"; return 1; }
for i in $(seq 1 $MAX_WAIT); do
ip=$(ip -4 addr show "$phy_iface" 2>/dev/null | awk '/inet / {print $2; exit}' | cut -d/ -f1)
ip6=$(ip -6 addr show "$phy_iface" 2>/dev/null | awk '/inet6 / {print $2; exit}' | cut -d/ -f1)
gw=$(ip -4 route show dev "$phy_iface" 2>/dev/null | awk '/via / {print $3; exit}')
[ -n "$ip" ] && [ -n "$ip6" ] && [ -n "$gw" ] && { echo "$ip $ip6 $gw"; return 0; }
sleep 1
done
log "Error: Failed to get IP or gateway for $phy_iface after ${MAX_WAIT}s (IP=$ip, IPv6=$ip6, GW=$gw)"
return 1
}
log "Event: INTERFACE=$INTERFACE ACTION=$ACTION"
case "$INTERFACE" in
pppoe_CT|pppoe_CU|pppoe_CT_6|pppoe_CU_6)
phy_iface=$(get_phy_interface "$INTERFACE") || exit 1
case "$ACTION" in
ifup|ifupdate)
if network_info=$(wait_for_network_info "$phy_iface"); then
/etc/custom_scripts/update_pppoe_tables.sh "$ACTION" "$phy_iface" || exit 1
fi
;;
ifdown)
/etc/custom_scripts/update_pppoe_tables.sh "$ACTION" "$phy_iface" || exit 1
;;
*) log "Error: Unknown action '$ACTION'"; exit 1 ;;
esac
;;
esac
EOF
chmox +x /etc/hotplug.d/iface/97-update-tables
2) 设置/etc/custom_scripts/update_pppoe_tables.sh
cat > /etc/custom_scripts/update_pppoe_tables.sh << 'EOF'
#!/bin/sh
[ -n "$DEBUG" ] && set -x
ACTION="${1:?Missing action}"
INTERFACE="${2:?Missing interface}"
RT_TABLES="/etc/iproute2/rt_tables"
CT_TABLE=150
CU_TABLE=200
CT_PRIORITY=20000
CU_PRIORITY=20001
CT_IFACE="pppoe-pppoe_CT"
CU_IFACE="pppoe-pppoe_CU"
log() { logger -t "update_pppoe_tables" "$*"; }
ensure_rt_tables() {
grep -q "^${CT_TABLE}[[:space:]]*CT" "$RT_TABLES" || echo "${CT_TABLE} CT" >> "$RT_TABLES"
grep -q "^${CU_TABLE}[[:space:]]*CU" "$RT_TABLES" || echo "${CU_TABLE} CU" >> "$RT_TABLES"
}
flush_table() {
local table="$1"
ip route flush table "$table" 2>/dev/null
ip -6 route flush table "$table" 2>/dev/null
ip rule flush table "$table" 2>/dev/null
ip -6 rule flush table "$table" 2>/dev/null
}
update_routes() {
local iface="$1" table="$2" priority="$3"
local ip ip6 gw gw6
ip=$(ip -4 addr show "$iface" 2>/dev/null | awk '/inet / {print $2; exit}' | cut -d/ -f1)
ip6=$(ip -6 addr show "$iface" 2>/dev/null | awk '/inet6 / {print $2; exit}' | cut -d/ -f1)
gw=$(ip -4 route show dev "$iface" 2>/dev/null | awk '/via / {print $3; exit}')
gw6=$(ip -6 route show dev "$iface" 2>/dev/null | awk '/via / {print $3; exit}')
log "Updating $iface: IP=$ip, IP6=$ip6"
flush_table "$table"
[ -n "$gw" ] && ip route add default via "$gw" dev "$iface" table "$table"
[ -n "$gw6" ] && ip -6 route add default via "$gw6" dev "$iface" table "$table"
[ -n "$ip" ] && ip rule add from "$ip" table "$table" priority "$priority"
[ -n "$ip6" ] && ip -6 rule add from "$ip6" table "$table" priority "$priority"
}
ensure_rt_tables
case "$ACTION" in
ifup|ifupdate)
case "$INTERFACE" in
"$CT_IFACE") update_routes "$CT_IFACE" "$CT_TABLE" "$CT_PRIORITY" ;;
"$CU_IFACE") update_routes "$CU_IFACE" "$CU_TABLE" "$CU_PRIORITY" ;;
*) log "Error: Unknown interface '$INTERFACE'"; exit 1 ;;
esac
;;
ifdown)
case "$INTERFACE" in
"$CT_IFACE") flush_table "$CT_TABLE"; log "Flushed table $CT_TABLE" ;;
"$CU_IFACE") flush_table "$CU_TABLE"; log "Flushed table $CU_TABLE" ;;
*) log "Error: Unknown interface '$INTERFACE'"; exit 1 ;;
esac
;;
*) log "Error: Unknown action '$ACTION'"; exit 1 ;;
esac
EOF
chmod+x /etc/custom_scripts/update_pppoe_tables.sh
设置后重启。
双wan多拨, 双拨路由规则
分享到:
QQ好友和群
QQ空间
收藏0
支持0
反对0
相关帖子
• 请问XDR6088的双wan拨号有没有负载均衡功能
• 新三双线多拨IPV4和IPV6上网成功
• 双线多拨请教
• 关于多WAN拨号与单WAN多拨,请大神们讨论一下
• 4530R,双拨以后的IP地址看不懂了,求助
• ni360双拨成功,但过一会儿就dns错误上不了网了
• 可以双拨多拨的一体机神器
• 可以双拨多拨的神器
• 新手请教双拨和QoS的4个问题,大家不吝指教??
• 双拨and多拨被限制后,是否还有其它可行方法?
• 请教高手 dualwan 双拨号问题!!! 电信?移动?联通?
• 6M ADSL双拔才可以全速下载
• 求推荐一款双PPPOE拨号的机器
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
使用道具
举报
置顶卡
沉默卡
喧嚣卡
顶贴卡
显身卡
iamyangyi
iamyangyi
当前离线
积分3492
IP卡
狗仔卡
2#
发表于 2025-4-7 21:42
|
只看该作者
还是爱快多WAN要方便 分流效规则率高的多,
点评
kikbeta
爱快可能没有一些特殊上网功能。
详情
回复
发表于 2025-4-7 21:43
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
使用道具
举报
显身卡
kikbeta
kikbeta
当前离线
积分16
IP卡
狗仔卡
3#
楼主|
发表于 2025-4-7 21:43
|
只看该作者
iamyangyi 发表于 2025-4-7 21:42
还是爱快多WAN要方便 分流效规则率高的多,
爱快可能没有一些特殊上网功能。
点评
iamyangyi
也有,但是收费。或加虚拟机。
详情
回复
发表于 2025-4-7 21:47
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
使用道具
举报
显身卡
iamyangyi
iamyangyi
当前离线
积分3492
IP卡
狗仔卡
4#
发表于 2025-4-7 21:47
|
只看该作者
kikbeta 发表于 2025-4-7 21:43
爱快可能没有一些特殊上网功能。
也有,但是收费。或加虚拟机。
点评
kikbeta
哦哦,受教了。
详情
回复
发表于 2025-4-7 21:49
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
使用道具
举报
显身卡
iamyangyi
iamyangyi
当前离线
积分3492
IP卡
狗仔卡
5#
发表于 2025-4-7 21:48
|
只看该作者
本帖最后由 iamyangyi 于 2025-4-7 21:51 编辑
不用MW3HELP的规则,直接同步CLANG行了
点评
futurejunjie
老哥,我现在也是电信和联通两条ISP,用的ImmortalWrt 24.10,分流策略不怎么会,现在两条宽带拨号是没问题,但是只能用一条线路,看大佬能不能分享下思路。
详情
回复
发表于 2025-4-17 14:23
评分
参与人数 1恩山币 +1
收起
理由
kikbeta
+ 1
不错不错
查看全部评分
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
使用道具
举报
显身卡
kikbeta
kikbeta
当前离线
积分16
IP卡
狗仔卡
6#
楼主|
发表于 2025-4-7 21:49
|
只看该作者
iamyangyi 发表于 2025-4-7 21:47
也有,但是收费。或加虚拟机。
哦哦,受教了。
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
使用道具
举报
显身卡
futurejunjie
futurejunjie
当前离线
积分326
IP卡
狗仔卡
7#
发表于 2025-4-17 14:23
|
只看该作者
iamyangyi 发表于 2025-4-7 21:48
不用MW3HELP的规则,直接同步CLANG行了
老哥,我现在也是电信和联通两条ISP,用的ImmortalWrt 24.10,分流策略不怎么会,现在两条宽带拨号是没问题,但是只能用一条线路,看大佬能不能分享下思路。
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
使用道具
举报
显身卡