diff --git a/Linux_reinstall/InstallNET.sh b/Linux_reinstall/InstallNET.sh index 541cc11..af3c2df 100644 --- a/Linux_reinstall/InstallNET.sh +++ b/Linux_reinstall/InstallNET.sh @@ -298,7 +298,7 @@ while [[ $# -ge 1 ]]; do # Check Root [[ "$EUID" -ne '0' || $(id -u) != '0' ]] && echo -ne "\n[${red}Error${plain}] This script must be executed as root!\n\nTry to type:\n${yellow}sudo -s\n${plain}\nAfter entering the password, switch to root dir to execute this script:\n${yellow}cd ~${plain}\n\n" && exit 1 -# Ping delay to YouTube($1) and Instagram($2) and Twitter($3), support both ipv4 and ipv6, $4 is $IPStackType +# Ping delay to YouTube($1) and Instagram($2) and Wikipedia($3), support both ipv4 and ipv6, $4 is $IPStackType function checkCN() { for TestUrl in "$1" "$2" "$3"; do # "rtt" result of ping command of Alpine Linux is "round-trip" and it can't handle "sed -n" well. @@ -427,8 +427,8 @@ function getIPv4Address() { ipPrefix=`echo ${iAddr} | cut -d'/' -f2` ipMask=`netmask "$ipPrefix"` # Get real IPv4 subnet of current System - ip4RouteScopeLink=`ip -4 route show scope link | grep -w "$interface4" | grep -w "$ipAddr" | grep -m1 -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -n 1` - actualIp4Prefix=`ip -4 route show scope link | grep -w "$interface4" | grep -w "$ip4RouteScopeLink" | head -n 1 | awk '{print $1}' | cut -d'/' -f2` + ip4RouteScopeLink=`ip -4 route show scope link | grep -iv "warp" | grep -w "$interface4" | grep -w "$ipAddr" | grep -m1 -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -n 1` + actualIp4Prefix=`ip -4 route show scope link | grep -iv "warp" | grep -w "$interface4" | grep -w "$ip4RouteScopeLink" | head -n 1 | awk '{print $1}' | cut -d'/' -f2` [[ -z "$actualIp4Prefix" ]] && actualIp4Prefix="$ipPrefix" actualIp4Subnet=`netmask "$actualIp4Prefix"` # In most situation, at least 99.9% probability, the first hop of the network should be the same as the available gateway. @@ -437,13 +437,13 @@ function getIPv4Address() { # But installer said the correct gateway should be 5.45.76.1, in a typical network, for example, your home, # the default gateway is the same as the first route hop of the machine, it may be 192.168.0.1. # If possible, we should configure out the real available gateway of the network. - FirstRoute=`ip -4 route show default | grep -w "via" | grep -w "dev $interface4*" | head -n 1 | awk -F " " '{for (i=3;i<=NF;i++)printf("%s ", $i);print ""}' | awk '{print$1}'` + FirstRoute=`ip -4 route show default | grep -iv "warp" | grep -w "via" | grep -w "dev $interface4*" | head -n 1 | awk -F " " '{for (i=3;i<=NF;i++)printf("%s ", $i);print ""}' | awk '{print$1}'` # We should find it in ARP, the first hop IP and gateway IP is managed by the same device, use device mac address to configure it out. RouterMac=`arp -n | grep "$FirstRoute" | awk '{print$3}'` FrFirst=`echo "$FirstRoute" | cut -d'.' -f 1,2` FrThird=`echo "$FirstRoute" | cut -d'.' -f 3` # Print all matched available gateway. - ipGates=`ip -4 route show | grep -v "via" | grep -w "dev $interface4*" | grep -w "proto*" | grep -w "scope global\|link src $ipAddr*" | awk '{print$1}'` + ipGates=`ip -4 route show | grep -iv "warp" | grep -v "via" | grep -w "dev $interface4*" | grep -w "proto*" | grep -w "scope global\|link src $ipAddr*" | awk '{print$1}'` # Figure out the line of this list. ipGateLine=`echo "$ipGates" | wc -l` # The line determines the cycling times. @@ -974,6 +974,14 @@ function checkIpv4OrIpv6() { [[ "$tmpSetIPv6" == "0" ]] && setIPv6="0" || setIPv6="1" } +# Some "BiStack" types are accomplished by Warp which provided by CloudFlare, so we need to distinguish whether IPv4 or IPv6 stack in enabled by Warp. +function checkWarp() { + [[ -f "/etc/wireguard/warp.conf" || -f "/opt/warp-go/warp.conf" && "$IPStackType" == "BiStack" ]] && { + [[ -z "$ipGate" ]] && IPStackType="IPv6Stack" + [[ -z "$ip6Gate" ]] && IPStackType="IPv4Stack" + } +} + function getIPv6Address() { # Differences from scope link, scope host and scope global of IPv6, reference: https://qiita.com/_dakc_/items/4eefa443306860bdcfde i6Addr=`ip -6 addr show | grep -wA 5 "$interface" | grep -wv "lo\|host" | grep -wv "link" | grep -w "inet6" | grep "scope" | grep "global" | head -n 1 | awk -F " " '{for (i=2;i<=NF;i++)printf("%s ", $i);print ""}' | awk '{print$1}'` @@ -981,9 +989,9 @@ function getIPv6Address() { ip6Addr=`echo ${i6Addr} |cut -d'/' -f1` ip6Mask=`echo ${i6Addr} |cut -d'/' -f2` # Get real IPv6 subnet of current System - actualIp6Prefix=`ip -6 route show | grep -w "$interface6" | grep -v "default" | grep -v "multicast" | grep -P '../[0-9]{1,3}' | head -n 1 | awk '{print $1}' | cut -d'/' -f2` + actualIp6Prefix=`ip -6 route show | grep -iv "warp" | grep -w "$interface6" | grep -v "default" | grep -v "multicast" | grep -P '../[0-9]{1,3}' | head -n 1 | awk '{print $1}' | cut -d'/' -f2` [[ -z "$actualIp6Prefix" ]] && actualIp6Prefix="$ip6Mask" - ip6Gate=`ip -6 route show default | grep -w "$interface" | grep -w "via" | grep "dev" | head -n 1 | awk -F " " '{for (i=3;i<=NF;i++)printf("%s ", $i);print ""}' | awk '{print$1}'` + ip6Gate=`ip -6 route show default | grep -iv "warp" | grep -w "$interface" | grep -w "via" | grep "dev" | head -n 1 | awk -F " " '{for (i=3;i<=NF;i++)printf("%s ", $i);print ""}' | awk '{print$1}'` [[ -n "$interface4" && -n "$interface6" && "$interface4" != "$interface6" ]] && ip6Gate=`ip -6 route show default | grep -w "$interface6" | grep -w "via" | grep "dev" | head -n 1 | awk -F " " '{for (i=3;i<=NF;i++)printf("%s ", $i);print ""}' | awk '{print$1}'` # IPv6 expansion algorithm code reference: https://blog.caoyu.info/expand-ipv6-by-shell.html ip6AddrWhole=`ultimateFormatOfIpv6 "$ip6Addr"` @@ -2024,6 +2032,8 @@ if [[ "$setNet" == "0" ]]; then [[ "$IPStackType" != "IPv4Stack" ]] && getIPv6Address fi +checkWarp + IPv4="$ipAddr"; MASK="$ipMask"; GATE="$ipGate"; if [[ -z "$IPv4" && -z "$MASK" && -z "$GATE" ]] && [[ -z "$ip6Addr" && -z "$ip6Mask" && -z "$ip6Gate" ]]; then echo -ne "\n[${red}Error${plain}] The network of your machine may not be available!\n"