diff --git a/initrd-network.sh b/initrd-network.sh index c99a134..7730567 100644 --- a/initrd-network.sh +++ b/initrd-network.sh @@ -11,6 +11,7 @@ ipv4_gateway=$3 ipv6_addr=$4 ipv6_gateway=$5 is_in_china=$6 +ipv6_extra_addrs=$7 DHCP_TIMEOUT=15 DNS_FILE_TIMEOUT=5 @@ -171,6 +172,15 @@ add_missing_ipv6_config() { ip -6 route add default via "$ipv6_gateway" dev "$ethx" onlink fi fi + + # 添加额外的 IPv6 地址(逗号分隔) + if [ -n "$ipv6_extra_addrs" ]; then + printf '%s\n' "$ipv6_extra_addrs" | tr ',' '\n' | while IFS= read -r addr; do + if [ -n "$addr" ]; then + ip -6 addr add "$addr" dev "$ethx" 2>/dev/null || true + fi + done + fi fi } @@ -506,5 +516,6 @@ echo "$ipv4_addr" >"$netconf/ipv4_addr" echo "$ipv4_gateway" >"$netconf/ipv4_gateway" echo "$ipv6_addr" >"$netconf/ipv6_addr" echo "$ipv6_gateway" >"$netconf/ipv6_gateway" +echo "$ipv6_extra_addrs" >"$netconf/ipv6_extra_addrs" $ipv4_has_internet && echo 1 >"$netconf/ipv4_has_internet" || echo 0 >"$netconf/ipv4_has_internet" $ipv6_has_internet && echo 1 >"$netconf/ipv6_has_internet" || echo 0 >"$netconf/ipv6_has_internet" diff --git a/reinstall.sh b/reinstall.sh index bbd2143..4205b25 100644 --- a/reinstall.sh +++ b/reinstall.sh @@ -2717,7 +2717,27 @@ collect_netconf() { eval ipv${v}_ethx="$ethx" # can_use_cloud_kernel 要用 eval ipv${v}_mac="$(ip link show dev $ethx | grep link/ether | head -1 | awk '{print $2}')" eval ipv${v}_gateway="$gateway" - eval ipv${v}_addr="$(ip -$v -o addr show scope global dev $ethx | grep -v temporary | head -1 | awk '{print $4}')" + + # 获取所有全局地址 + all_addrs=$(ip -$v -o addr show scope global dev $ethx | grep -v temporary | awk '{print $4}') + primary_addr=$(echo "$all_addrs" | head -1) + + # IPv6: 用 ip route get 让内核返回正确的源 IP,指定 dev 避免 tun/warp 干扰 + if [ "$v" = 6 ] && [ -n "$primary_addr" ]; then + route_src=$(ip -6 route get 2001:4860:4860::8888 dev "$ethx" 2>/dev/null | grep -oP 'src \K[^ ]+') + if [ -n "$route_src" ]; then + for addr in $all_addrs; do + if [ "${addr%/*}" = "$route_src" ]; then + primary_addr=$addr + break + fi + done + fi + fi + + eval ipv${v}_addr="$primary_addr" + # extra_addrs: 除主地址外的所有地址 + eval ipv${v}_extra_addrs="$(echo "$all_addrs" | grep -Fxve "$primary_addr" | tr '\n' ',' | sed 's/,$//')" fi done fi @@ -3607,13 +3627,13 @@ get_ip_conf_cmd() { sh=/initrd-network.sh if is_found_ipv4_netconf && is_found_ipv6_netconf && [ "$ipv4_mac" = "$ipv6_mac" ]; then - echo "'$sh' '$ipv4_mac' '$ipv4_addr' '$ipv4_gateway' '$ipv6_addr' '$ipv6_gateway' '$is_in_china'" + echo "'$sh' '$ipv4_mac' '$ipv4_addr' '$ipv4_gateway' '$ipv6_addr' '$ipv6_gateway' '$is_in_china' '$ipv6_extra_addrs'" else if is_found_ipv4_netconf; then - echo "'$sh' '$ipv4_mac' '$ipv4_addr' '$ipv4_gateway' '' '' '$is_in_china'" + echo "'$sh' '$ipv4_mac' '$ipv4_addr' '$ipv4_gateway' '' '' '$is_in_china' ''" fi if is_found_ipv6_netconf; then - echo "'$sh' '$ipv6_mac' '' '' '$ipv6_addr' '$ipv6_gateway' '$is_in_china'" + echo "'$sh' '$ipv6_mac' '' '' '$ipv6_addr' '$ipv6_gateway' '$is_in_china' '$ipv6_extra_addrs'" fi fi } diff --git a/trans.sh b/trans.sh index 2c111cf..7f5c698 100644 --- a/trans.sh +++ b/trans.sh @@ -1121,6 +1121,16 @@ EOF post-up ip route add default via $ipv6_gateway dev $ethx EOF fi + + # 额外的 IPv6 地址(子网不含网关的地址) + get_netconf_to ipv6_extra_addrs + if [ -n "$ipv6_extra_addrs" ]; then + _old_ifs=$IFS; IFS=',' + for _addr in $ipv6_extra_addrs; do + echo " post-up ip -6 addr add $_addr dev $ethx" >>$conf_file + done + IFS=$_old_ifs + fi fi # dns