2023.08.03

This commit is contained in:
spiritlhl 2023-08-03 16:01:59 +00:00
parent bc15c0b492
commit 19b87a61df
5 changed files with 331 additions and 144 deletions

View file

@ -15,6 +15,9 @@
2023.08.03
- 尝试增加了IPV6的支持暂时只是支持了IPV6网关的设置暂时未适配一键开设明日适配
- 简化IPV4和IPV6地址的查询避免重复查询
- 修复可能的grub更新错误
- 网络配置文件备份修改顺序,避免重复备份
- 增加已修改过的文件的备份
- KVM虚拟机增加centos8-stream镜像源

122
back/old_fuction.sh Normal file
View file

@ -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<additional_colons; i++)); do
result+=":"
done
fi
echo "$result"
}
check_interface(){
if [ -z "$interface_2" ]; then
interface=${interface_1}
return
elif [ -n "$interface_1" ] && [ -n "$interface_2" ]; then
if ! grep -q "$interface_1" "/etc/network/interfaces" && ! grep -q "$interface_2" "/etc/network/interfaces" && [ -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
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}
return
elif ! grep -q "$interface_2" "/etc/network/interfaces.d/50-cloud-init" && grep -q "$interface_1" "/etc/network/interfaces.d/50-cloud-init"; then
interface=${interface_1}
return
fi
fi
fi
if grep -q "$interface_1" "/etc/network/interfaces"; then
interface=${interface_1}
return
elif grep -q "$interface_2" "/etc/network/interfaces"; then
interface=${interface_2}
return
else
interfaces_list=$(ip addr show | awk '/^[0-9]+: [^lo]/ {print $2}' | cut -d ':' -f 1)
interface=""
for iface in $interfaces_list; do
if [[ "$iface" = "$interface_1" || "$iface" = "$interface_2" ]]; then
interface="$iface"
fi
done
if [ -z "$interface" ]; then
interface="eth0"
fi
return
fi
else
interface="eth0"
return
fi
_red "Physical interface not found, exit execution"
_red "找不到物理接口,退出执行"
exit 1
}
# 提取物理网卡名字
interface_1=$(lshw -C network | awk '/logical name:/{print $3}' | sed -n '1p')
interface_2=$(lshw -C network | awk '/logical name:/{print $3}' | sed -n '2p')
check_interface

View file

@ -1,7 +1,7 @@
#!/bin/bash
# from
# https://github.com/spiritLHLS/pve
# 2023.07.30
# 2023.08.03
# 打印信息
@ -20,7 +20,7 @@ else
echo "Locale set to $utf8_locale"
fi
if [ -f "/root/build_backend_pve.txt" ]; then
if [ -f "/usr/local/bin/build_backend_pve.txt" ]; then
_green "You have already executed this script, if you have already rebooted your system, please execute the subsequent script commands to automatically configure the gateway, if you have not rebooted your system, please reboot your system"
_grenn "Do not run this script repeatedly"
_green "你已执行过本脚本,如果已重启过系统,请执行后续的自动配置网关的脚本命令,如果未重启过系统,请重启系统"
@ -118,4 +118,4 @@ else
_yellow "The current kernel is already a PVE kernel, no need to reboot the system to update the kernel"
_yellow "当前内核已是PVE内核无需重启系统更新内核"
fi
echo "1" > "/root/build_backend_pve.txt"
echo "1" > "/usr/local/bin/build_backend_pve.txt"

View file

@ -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

View file

@ -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)