diff --git a/README.md b/README.md index e66b29b..5cab7c3 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,9 @@ 2023.08.03 +- 尝试增加了IPV6的支持,暂时只是支持了IPV6网关的设置,暂时未适配一键开设,明日适配 +- 简化IPV4和IPV6地址的查询,避免重复查询 +- 修复可能的grub更新错误 - 网络配置文件备份修改顺序,避免重复备份 - 增加已修改过的文件的备份 - KVM虚拟机增加centos8-stream镜像源 diff --git a/back/old_fuction.sh b/back/old_fuction.sh new file mode 100644 index 0000000..a63182c --- /dev/null +++ b/back/old_fuction.sh @@ -0,0 +1,122 @@ +complete_ipv6_parts() { + local ipv6_address=$1 + IFS=":" read -r -a parts <<< "$ipv6_address" + local all_parts_full=true + for part in "${parts[@]}"; do + local length=${#part} + if (( length < 4 )); then + all_parts_full=false + break + fi + done + if $all_parts_full; then + echo "$ipv6_address" + return + fi + for i in "${!parts[@]}"; do + local part="${parts[$i]}" + local length=${#part} + if (( length < 4 )); then + local num_zeros=$(( 4 - length )) + parts[$i]=$(printf "%0${num_zeros}d%s" 0 "$part") + fi + done + local result=$(IFS=:; echo "${parts[*]}") + echo "$result" +} + +extract_origin_ipv6() { + input_string="$1" + num_characters="$2" + # 拼接整体 + IFS=':' read -r -a array <<< "$input_string" + origin="" + for part in "${array[@]}"; do + len=${#part} + if ((len <= 4)); then + origin+="$part" + else + for ((i = 0; i < len; i += 4)); do + origin+="${part:$i:4}" + if ((i + 4 < len)); then + origin+=":" + fi + done + fi + done + # 是不是被4整除,不整除则多一位做子网前缀 + max_quotient=$((${num_characters} / 4)) + temp_remainder=$((${num_characters} % 4)) + if [ $temp_remainder -ne 0 ]; then + max_quotient=$((max_quotient + 1)) + fi + temp_result=$(echo "${origin:0:$max_quotient}") + # 非4整除补全 + length=${#temp_result} + remainder=$((length % 4)) + zeros_to_add=$((4 - remainder)) + if [ $remainder -ne 0 ]; then + for ((i = 0; i < $zeros_to_add; i++)); do + temp_result+="0" + done + fi + # 插入:符号 + result=$(echo $temp_result | sed 's/.\{4\}/&:/g;s/:$//') + colon_count=$(grep -o ":" <<< "$result" | wc -l) + if [ "$colon_count" -lt 7 ]; then + additional_colons=$((7 - colon_count)) + for ((i=0; i "/root/build_backend_pve.txt" +echo "1" > "/usr/local/bin/build_backend_pve.txt" diff --git a/scripts/build_nat_network.sh b/scripts/build_nat_network.sh index a1f38ee..36e233a 100644 --- a/scripts/build_nat_network.sh +++ b/scripts/build_nat_network.sh @@ -1,10 +1,11 @@ #!/bin/bash # from # https://github.com/spiritLHLS/pve -# 2023.06.29 +# 2023.08.03 -# 打印信息 +########## 预设部分输出和部分中间变量 + _red() { echo -e "\033[31m\033[01m$@\033[0m"; } _green() { echo -e "\033[32m\033[01m$@\033[0m"; } _yellow() { echo -e "\033[33m\033[01m$@\033[0m"; } @@ -20,62 +21,30 @@ else export LANGUAGE="$utf8_locale" echo "Locale set to $utf8_locale" fi +rm -rf /usr/local/bin/build_backend_pve.txt -rm -rf /root/build_backend_pve.txt +########## 查询信息 -# 查询信息 if ! command -v lshw > /dev/null 2>&1; then - apt-get install -y lshw + apt-get install -y lshw fi -# 提取物理网卡名字 -interface_1=$(lshw -C network | awk '/logical name:/{print $3}' | head -1) -interface_2=$(lshw -C network | awk '/logical name:/{print $3}' | sed -n '2p') -if [ -z "$interface_1" ]; then - interface="eth0" +if ! command -v ipcalc > /dev/null 2>&1; then + apt-get install -y ipcalc fi -if ! grep -q "$interface_1" "/etc/network/interfaces"; then - if [ -f "/etc/network/interfaces.d/50-cloud-init" ];then - if ! grep -q "$interface_1" "/etc/network/interfaces.d/50-cloud-init" && grep -q "$interface_2" "/etc/network/interfaces.d/50-cloud-init"; then - interface=${interface_2} - else - interface=${interface_1} - fi - else - if grep -q "$interface_2" "/etc/network/interfaces"; then - interface=${interface_2} - else - interface=${interface_1} - fi - fi -else - interface=${interface_1} + +# 检测IPV6相关的信息 +if [ -f /usr/local/bin/pve_check_ipv6 ]; then + ipv6_address=$(cat /usr/local/bin/pve_check_ipv6) fi -# 提取IPV4地址 -ipv4_address=$(ip addr show | awk '/inet .*global/ && !/inet6/ {print $2}') -# 提取IPV4网关 -gateway=$(ip route | awk '/default/ {print $3}') -# 获取IPV6子网前缀 -SUBNET_PREFIX=$(ip -6 addr show | grep -E 'inet6.*global' | awk '{print $2}' | awk -F'/' '{print $1}' | head -n 1 | rev | cut -d ':' -f 2- | rev):0 -# 提取IPV6地址 -ipv6_address=$(ip addr show | awk '/inet6.*scope global/ { print $2 }' | head -n 1) -# 检查是否存在 IPV6 -if [ -z "$SUBNET_PREFIX" ] || [ "$SUBNET_PREFIX" = ":0" ]; then - _red "No IPV6 subnet, no automatic mapping" - _red "无 IPV6 子网,不进行自动映射" -else - _blue "The IPV6 subnet prefix of the host is $SUBNET_PREFIX" - _blue "母鸡的IPV6子网前缀为 $SUBNET_PREFIX" +if [ -f /usr/local/bin/pve_ipv6_prefixlen ]; then + ipv6_prefixlen=$(cat /usr/local/bin/pve_ipv6_prefixlen) fi -if [ -z "$ipv6_address" ]; then - _red "No IPV6 address on the parent machine, no automatic mapping" - _red "母机无 IPV6 地址,不进行自动映射" -else - _blue "The IPV6 address of the host is $ipv6_address" - _blue "母鸡的IPV6地址为 $ipv6_address" +if [ -f /usr/local/bin/pve_ipv6_gateway ]; then + ipv6_gateway=$(cat /usr/local/bin/pve_ipv6_gateway) fi # 录入网关 -if [ -f /etc/network/interfaces ]; then +if [ ! -f /etc/network/interfaces.bak ]; then cp /etc/network/interfaces /etc/network/interfaces.bak fi # 修正部分网络设置重复的错误 @@ -95,62 +64,17 @@ fi interfaces_file="/etc/network/interfaces" chattr -i "$interfaces_file" if ! grep -q "auto lo" "$interfaces_file"; then -# echo "auto lo" >> "$interfaces_file" _blue "Can not find 'auto lo' in ${interfaces_file}" exit 1 fi if ! grep -q "iface lo inet loopback" "$interfaces_file"; then -# echo "iface lo inet loopback" >> "$interfaces_file" _blue "Can not find 'iface lo inet loopback' in ${interfaces_file}" exit 1 fi -if grep -q "vmbr0" "$interfaces_file"; then - _blue "vmbr0 already exists in ${interfaces_file}" - _blue "vmbr0 已存在在 ${interfaces_file}" -else -if [ -z "$SUBNET_PREFIX" ] || [ "$SUBNET_PREFIX" = ":0" ] || [ -z "$ipv6_address" ]; then -cat << EOF | sudo tee -a "$interfaces_file" -auto vmbr0 -iface vmbr0 inet static - address $ipv4_address - gateway $gateway - bridge_ports $interface - bridge_stp off - bridge_fd 0 -EOF -elif [ -f "/root/iface_auto.txt" ]; then -cat << EOF | sudo tee -a "$interfaces_file" -auto vmbr0 -iface vmbr0 inet static - address $ipv4_address - gateway $gateway - bridge_ports $interface - bridge_stp off - bridge_fd 0 - -iface vmbr0 inet6 auto - bridge_ports $interface -EOF -else -cat << EOF | sudo tee -a "$interfaces_file" -auto vmbr0 -iface vmbr0 inet static - address $ipv4_address - gateway $gateway - bridge_ports $interface - bridge_stp off - bridge_fd 0 - -iface vmbr0 inet6 static - address ${ipv6_address} - gateway ${SUBNET_PREFIX} -EOF -fi -fi if grep -q "vmbr1" "$interfaces_file"; then _blue "vmbr1 already exists in ${interfaces_file}" _blue "vmbr1 已存在在 ${interfaces_file}" -elif [ -f "/root/iface_auto.txt" ]; then +elif [ -f "/usr/local/bin/iface_auto.txt" ]; then cat << EOF | sudo tee -a "$interfaces_file" auto vmbr1 iface vmbr1 inet static @@ -166,7 +90,7 @@ iface vmbr1 inet static pre-up echo 2 > /proc/sys/net/ipv6/conf/vmbr0/accept_ra EOF -else +elif [ -z "$ipv6_address" ] || [ -z "$ipv6_prefixlen" ] || [ -z "$ipv6_gateway" ]; then cat << EOF | sudo tee -a "$interfaces_file" auto vmbr1 iface vmbr1 inet static @@ -180,9 +104,30 @@ iface vmbr1 inet static post-up iptables -t nat -A POSTROUTING -s '172.16.1.0/24' -o vmbr0 -j MASQUERADE post-down iptables -t nat -D POSTROUTING -s '172.16.1.0/24' -o vmbr0 -j MASQUERADE EOF +else +cat << EOF | sudo tee -a "$interfaces_file" +auto vmbr1 +iface vmbr1 inet static + address 172.16.1.1 + netmask 255.255.255.0 + bridge_ports none + bridge_stp off + bridge_fd 0 + post-up echo 1 > /proc/sys/net/ipv4/ip_forward + post-up echo 1 > /proc/sys/net/ipv4/conf/vmbr1/proxy_arp + post-up iptables -t nat -A POSTROUTING -s '172.16.1.0/24' -o vmbr0 -j MASQUERADE + post-down iptables -t nat -D POSTROUTING -s '172.16.1.0/24' -o vmbr0 -j MASQUERADE + +iface vmbr1 inet6 static + address 2001:db8:1::1/64 + post-up sysctl -w net.ipv6.conf.all.forwarding=1 + post-up ip6tables -t nat -A POSTROUTING -s 2001:db8:1::/64 -o vmbr0 -j MASQUERADE + post-down sysctl -w net.ipv6.conf.all.forwarding=0 + post-down ip6tables -t nat -D POSTROUTING -s 2001:db8:1::/64 -o vmbr0 -j MASQUERADE +EOF fi chattr +i "$interfaces_file" -rm -rf /root/iface_auto.txt +rm -rf /usr/local/bin/iface_auto.txt # 加载iptables并设置回源且允许NAT端口转发 apt-get install -y iptables iptables-persistent diff --git a/scripts/install_pve.sh b/scripts/install_pve.sh index df2e8a9..31a5f65 100644 --- a/scripts/install_pve.sh +++ b/scripts/install_pve.sh @@ -75,14 +75,10 @@ install_package() { if [ $? -ne 0 ]; then apt_output=$(apt-get install -y $package_name --fix-missing 2>&1) fi - if [ $? -ne 0 ] && [ "$package_name" != "proxmox-ve" ]; then - _green "$package_name tried to install but failed, exited the program" - _green "$package_name 已尝试安装但失败,退出程序" - exit 1 - elif [ $? -ne 0 ] && [ "$package_name" == "proxmox-ve" ]; then - if echo "$apt_output" | grep -qE 'DEBIAN_FRONTEND=dialog dpkg --configure grub-pc' && - echo "$apt_output" | grep -qE 'dpkg --configure -a' && - echo "$apt_output" | grep -qE 'dpkg: error processing package grub-pc \(--configure\):' + if [ $? -ne 0 ]; then + if echo "$apt_output" | grep -qE 'DEBIAN_FRONTEND=dialog dpkg --configure grub-pc' && + echo "$apt_output" | grep -qE 'dpkg --configure -a' && + echo "$apt_output" | grep -qE 'dpkg: error processing package grub-pc \(--configure\):' then # 手动选择 # DEBIAN_FRONTEND=dialog dpkg --configure grub-pc @@ -99,6 +95,11 @@ install_package() { apt-get install -y $package_name --fix-missing fi fi + if [ $? -ne 0 ]; then + _green "$package_name tried to install but failed, exited the program" + _green "$package_name 已尝试安装但失败,退出程序" + exit 1 + fi _green "$package_name tried to install" _green "$package_name 已尝试安装" fi @@ -280,26 +281,21 @@ remove_source_input # 检查/etc/network/interfaces文件中是否有iface xxxx inet auto行 if [ -f "/etc/network/interfaces" ]; then if grep -q "iface $interface inet auto" /etc/network/interfaces; then - # 获取ipv4、subnet、gateway信息 - gateway=$(ip route | awk '/default/ {print $3}') - interface_info=$(ip -o -4 addr show dev $interface | awk '{print $4}') - ipv4=$(echo $interface_info | cut -d'/' -f1) - subnet=$(echo $interface_info | cut -d'/' -f2) - subnet=$(ipcalc -n "$ipv4/$subnet" | grep -oP 'Netmask:\s+\K.*' | awk '{print $1}') + subnet=$(ipcalc -n "$ipv4_address" | grep -oP 'Netmask:\s+\K.*' | awk '{print $1}') chattr -i /etc/network/interfaces if [[ -z "${CN}" || "${CN}" != true ]]; then sed -i "/iface $interface inet auto/c\ iface $interface inet static\n\ - address $ipv4\n\ + address $ipv4_address\n\ netmask $subnet\n\ - gateway $gateway\n\ + gateway $ipv4_gateway\n\ dns-nameservers 8.8.8.8 8.8.4.4" /etc/network/interfaces else sed -i "/iface $interface inet auto/c\ iface $interface inet static\n\ - address $ipv4\n\ + address $ipv4_address\n\ netmask $subnet\n\ - gateway $gateway\n\ + gateway $ipv4_gateway\n\ dns-nameservers 8.8.8.8 223.5.5.5" /etc/network/interfaces fi fi @@ -315,25 +311,21 @@ if [[ $dmidecode_output == *"Hetzner_vServer"* ]] || [[ $dmidecode_output == *"M fi if grep -q "iface $interface inet dhcp" /etc/network/interfaces; then # 获取ipv4、subnet、gateway信息 - gateway=$(ip route | awk '/default/ {print $3}') - interface_info=$(ip -o -4 addr show dev $interface | awk '{print $4}') - ipv4=$(echo $interface_info | cut -d'/' -f1) - subnet=$(echo $interface_info | cut -d'/' -f2) - subnet=$(ipcalc -n "$ipv4/$subnet" | grep -oP 'Netmask:\s+\K.*' | awk '{print $1}') + subnet=$(ipcalc -n "$ipv4_address" | grep -oP 'Netmask:\s+\K.*' | awk '{print $1}') chattr -i /etc/network/interfaces if [[ -z "${CN}" || "${CN}" != true ]]; then sed -i "/iface $interface inet dhcp/c\ iface $interface inet static\n\ - address $ipv4\n\ + address $ipv4_address\n\ netmask $subnet\n\ - gateway $gateway\n\ + gateway $ipv4_gateway\n\ dns-nameservers 8.8.8.8 8.8.4.4" /etc/network/interfaces else sed -i "/iface $interface inet dhcp/c\ iface $interface inet static\n\ - address $ipv4\n\ + address $ipv4_address\n\ netmask $subnet\n\ - gateway $gateway\n\ + gateway $ipv4_gateway\n\ dns-nameservers 8.8.8.8 223.5.5.5" /etc/network/interfaces fi fi @@ -376,13 +368,6 @@ fix_interfaces_ipv6_auto_type(){ modified_line="${line/auto/static}" echo "$modified_line" # 添加静态IPv6配置信息 - ipv6_prefixlen=$(ifconfig ${interface} | grep -oP 'prefixlen \K\d+' | head -n 1) - # 获取IPv6地址 - # ipv6_address=$(ifconfig ${interface} | grep -oE 'inet6 ([0-9a-fA-F:]+)' | awk '{print $2}' | head -n 1) - ipv6_address=$(ip -6 addr show dev ${interface} | awk '/inet6 .* scope global dynamic/{print $2}') - # 提取地址部分 - ipv6_address=${ipv6_address%%/*} - ipv6_gateway=$(ip -6 route show | awk '/default via/{print $3}') echo " address ${ipv6_address}/${ipv6_prefixlen}" echo " gateway ${ipv6_gateway}" fi @@ -396,6 +381,62 @@ fix_interfaces_ipv6_auto_type(){ rm -rf /tmp/interfaces.modified } +is_private_ipv6() { + local address=$1 + # 输入为空 + if [[ -z $ip_address ]]; then + return 0 + fi + # 检查IPv6地址是否以fe80开头(链接本地地址) + if [[ $address == fe80:* ]]; then + return 0 + fi + # 检查IPv6地址是否以fc00或fd00开头(唯一本地地址) + if [[ $address == fc00:* || $address == fd00:* ]]; then + return 0 + fi + # 检查IPv6地址是否以2001:db8开头(文档前缀) + if [[ $address == 2001:db8* ]]; then + return 0 + fi + # 检查IPv6地址是否以::1开头(环回地址) + if [[ $address == ::1 ]]; then + return 0 + fi + # 检查IPv6地址是否以::ffff:开头(IPv4映射地址) + if [[ $address == ::ffff:* ]]; then + return 0 + fi + # 检查IPv6地址是否以2002:开头(6to4隧道地址) + if [[ $address == 2002:* ]]; then + return 0 + fi + # 检查IPv6地址是否以2001:开头(Teredo隧道地址) + if [[ $address == 2001:* ]]; then + return 0 + fi + # 其他情况为公网地址 + return 1 +} + +check_ipv6(){ + IPV6=$(ip -6 addr show | grep global | awk '{print $2}' | cut -d '/' -f1 | head -n 1) + local response + if is_private_ipv6 "$IPV6"; then # 由于是内网IPV4地址,需要通过API获取外网地址 + IPV6="" + local API_NET=("ipv6.ip.sb" "https://ipget.net" "ipv6.ping0.cc" "https://api.my-ip.io/ip" "https://ipv6.icanhazip.com") + for p in "${API_NET[@]}"; do + response=$(curl -sLk6m8 "$p" | tr -d '[:space:]') + sleep 1 + if [ $? -eq 0 ] && ! echo "$response" | grep -q "error"; then + IPV6="$response" + break + fi + done + fi + echo $IPV6 > /usr/local/bin/pve_check_ipv6 +} + check_cdn() { local o_url=$1 for cdn_url in "${cdn_urls[@]}"; do @@ -619,6 +660,9 @@ check_interface(){ ########## 前置环境检测和组件安装 +# 更改网络优先级为IPV4优先 +sed -i 's/.*precedence ::ffff:0:0\/96.*/precedence ::ffff:0:0\/96 100/g' /etc/gai.conf && systemctl restart networking + # ChinaIP检测 check_china @@ -710,8 +754,25 @@ check_haveged _yellow "Detecting system information, will probably stay on the page for up to 1~2 minutes" _yellow "正在检测系统信息,大概会停留在该页面最多1~2分钟" +# 检测主IPV4相关信息 +if [ ! -f /usr/local/bin/pve_main_ipv4 ]; then + main_ipv4=$(ip -4 addr show | grep global | awk '{print $2}' | cut -d '/' -f1 | head -n 1) + echo "$main_ipv4" > /usr/local/bin/pve_main_ipv4 +fi +if [ ! -f /usr/local/bin/pve_ipv4_address ]; then + ipv4_address=$(ip addr show | awk '/inet .*global/ && !/inet6/ {print $2}' | sed -n '1p') + echo "$ipv4_address" > /usr/local/bin/pve_ipv4_address +fi +if [ ! -f /usr/local/bin/pve_ipv4_gateway ]; then + ipv4_gateway=$(ip route | awk '/default/ {print $3}' | sed -n '1p') + echo "$ipv4_gateway" > /usr/local/bin/pve_ipv4_gateway +fi # 检测主IPV4地址 -main_ipv4=$(ip -4 addr show | grep global | awk '{print $2}' | cut -d '/' -f1 | head -n 1) +main_ipv4=$(cat /usr/local/bin/pve_main_ipv4) +# 提取IPV4地址 含子网长度 +ipv4_address=$(cat /usr/local/bin/pve_ipv4_address) +# 提取IPV4网关 +ipv4_gateway=$(cat /usr/local/bin/pve_ipv4_gateway) # 检测物理接口和MAC地址 interface_1=$(lshw -C network | awk '/logical name:/{print $3}' | sed -n '1p') @@ -721,6 +782,22 @@ check_interface # mac_address=$(ip -o link show dev ${interface} | awk '{print $17}') # fi +# 检测IPV6相关的信息 +if [ ! -f /usr/local/bin/pve_check_ipv6 ]; then + check_ipv6 +fi +if [ ! -f /usr/local/bin/pve_ipv6_prefixlen ]; then + ipv6_prefixlen=$(ifconfig ${interface} | grep -oP 'prefixlen \K\d+' | head -n 1) + echo "$ipv6_prefixlen" > /usr/local/bin/pve_ipv6_prefixlen +fi +if [ ! -f /usr/local/bin/pve_ipv6_gateway ]; then + ipv6_gateway=$(ip -6 route show | awk '/default via/{print $3}') + echo "$ipv6_gateway" > /usr/local/bin/pve_ipv6_gateway +fi +ipv6_address=$(cat /usr/local/bin/pve_check_ipv6) +ipv6_prefixlen=$(cat /usr/local/bin/pve_ipv6_prefixlen) +ipv6_gateway=$(cat /usr/local/bin/pve_ipv6_gateway) + # 检查50-cloud-init是否存在特定配置 if [ -f "/etc/network/interfaces.d/50-cloud-init" ]; then if grep -Fxq "# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:" /etc/network/interfaces.d/50-cloud-init && grep -Fxq "# network: {config: disabled}" /etc/network/interfaces.d/50-cloud-init; then @@ -734,18 +811,14 @@ fi # 特殊化处理各虚拟化 if [ ! -f "/etc/network/interfaces" ]; then touch "/etc/network/interfaces" - gateway=$(ip route | awk '/default/ {print $3}') - interface_info=$(ip -o -4 addr show dev $interface | awk '{print $4}') - ipv4=$(echo $interface_info | cut -d'/' -f1) - subnet=$(echo $interface_info | cut -d'/' -f2) - subnet=$(ipcalc -n "$ipv4/$subnet" | grep -oP 'Netmask:\s+\K.*' | awk '{print $1}') + subnet=$(ipcalc -n "$ipv4_address" | grep -oP 'Netmask:\s+\K.*' | awk '{print $1}') chattr -i /etc/network/interfaces echo "auto lo" >> /etc/network/interfaces echo "iface lo inet loopback" >> /etc/network/interfaces echo "iface $interface inet static" >> /etc/network/interfaces - echo " address $ipv4" >> /etc/network/interfaces + echo " address $ipv4_address" >> /etc/network/interfaces echo " netmask $subnet" >> /etc/network/interfaces - echo " gateway $gateway" >> /etc/network/interfaces + echo " gateway $ipv4_gateway" >> /etc/network/interfaces if [[ -z "${CN}" || "${CN}" != true ]]; then echo " dns-nameservers 8.8.8.8 8.8.4.4" >> /etc/network/interfaces else @@ -811,9 +884,6 @@ if [[ "${CN}" == true ]]; then echo "nameserver 223.5.5.5" >> /etc/resolv.conf fi -# 更改网络优先级为IPV4优先 -sed -i 's/.*precedence ::ffff:0:0\/96.*/precedence ::ffff:0:0\/96 100/g' /etc/gai.conf && systemctl restart networking - # cloud-init文件修改 rebuild_cloud_init @@ -1021,6 +1091,53 @@ fi rebuild_interfaces fix_interfaces_ipv6_auto_type +# 配置vmbr0 +chattr -i /etc/network/interfaces +if grep -q "vmbr0" "/etc/network/interfaces"; then + _blue "vmbr0 already exists in /etc/network/interfaces" + _blue "vmbr0 已存在在 /etc/network/interfaces" +else + if [ -z "$ipv6_address" ] || [ -z "$ipv6_prefixlen" ] || [ -z "$ipv6_gateway" ]; then +cat << EOF | sudo tee -a /etc/network/interfaces +auto vmbr0 +iface vmbr0 inet static + address $ipv4_address + gateway $ipv4_gateway + bridge_ports $interface + bridge_stp off + bridge_fd 0 +EOF + elif [ -f "/usr/local/bin/iface_auto.txt" ]; then +cat << EOF | sudo tee -a /etc/network/interfaces +auto vmbr0 +iface vmbr0 inet static + address $ipv4_address + gateway $ipv4_gateway + bridge_ports $interface + bridge_stp off + bridge_fd 0 + +iface vmbr0 inet6 auto + bridge_ports $interface +EOF + else +cat << EOF | sudo tee -a /etc/network/interfaces +auto vmbr0 +iface vmbr0 inet static + address $ipv4_address + gateway $ipv4_gateway + bridge_ports $interface + bridge_stp off + bridge_fd 0 + +iface vmbr0 inet6 static + address ${ipv6_address}/${ipv6_prefixlen} + gateway ${ipv6_gateway} +EOF + fi +fi +chattr +i /etc/network/interfaces + # 特殊处理Hetzner和Azure的情况 if [[ $dmidecode_output == *"Hetzner_vServer"* ]] || [[ $dmidecode_output == *"Microsoft Corporation"* ]]; then auto_interface=$(grep '^auto ' /etc/network/interfaces | grep -v '^auto lo' | awk '{print $2}' | head -n 1)