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 2023.08.03
- 尝试增加了IPV6的支持暂时只是支持了IPV6网关的设置暂时未适配一键开设明日适配
- 简化IPV4和IPV6地址的查询避免重复查询
- 修复可能的grub更新错误
- 网络配置文件备份修改顺序,避免重复备份 - 网络配置文件备份修改顺序,避免重复备份
- 增加已修改过的文件的备份 - 增加已修改过的文件的备份
- KVM虚拟机增加centos8-stream镜像源 - 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 #!/bin/bash
# from # from
# https://github.com/spiritLHLS/pve # https://github.com/spiritLHLS/pve
# 2023.07.30 # 2023.08.03
# 打印信息 # 打印信息
@ -20,7 +20,7 @@ else
echo "Locale set to $utf8_locale" echo "Locale set to $utf8_locale"
fi 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" _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" _grenn "Do not run this script repeatedly"
_green "你已执行过本脚本,如果已重启过系统,请执行后续的自动配置网关的脚本命令,如果未重启过系统,请重启系统" _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 "The current kernel is already a PVE kernel, no need to reboot the system to update the kernel"
_yellow "当前内核已是PVE内核无需重启系统更新内核" _yellow "当前内核已是PVE内核无需重启系统更新内核"
fi 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 #!/bin/bash
# from # from
# https://github.com/spiritLHLS/pve # https://github.com/spiritLHLS/pve
# 2023.06.29 # 2023.08.03
# 打印信息 ########## 预设部分输出和部分中间变量
_red() { echo -e "\033[31m\033[01m$@\033[0m"; } _red() { echo -e "\033[31m\033[01m$@\033[0m"; }
_green() { echo -e "\033[32m\033[01m$@\033[0m"; } _green() { echo -e "\033[32m\033[01m$@\033[0m"; }
_yellow() { echo -e "\033[33m\033[01m$@\033[0m"; } _yellow() { echo -e "\033[33m\033[01m$@\033[0m"; }
@ -20,62 +21,30 @@ else
export LANGUAGE="$utf8_locale" export LANGUAGE="$utf8_locale"
echo "Locale set to $utf8_locale" echo "Locale set to $utf8_locale"
fi 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 if ! command -v lshw > /dev/null 2>&1; then
apt-get install -y lshw apt-get install -y lshw
fi fi
# 提取物理网卡名字 if ! command -v ipcalc > /dev/null 2>&1; then
interface_1=$(lshw -C network | awk '/logical name:/{print $3}' | head -1) apt-get install -y ipcalc
interface_2=$(lshw -C network | awk '/logical name:/{print $3}' | sed -n '2p')
if [ -z "$interface_1" ]; then
interface="eth0"
fi fi
if ! grep -q "$interface_1" "/etc/network/interfaces"; then
if [ -f "/etc/network/interfaces.d/50-cloud-init" ];then # 检测IPV6相关的信息
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 [ -f /usr/local/bin/pve_check_ipv6 ]; then
interface=${interface_2} ipv6_address=$(cat /usr/local/bin/pve_check_ipv6)
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}
fi fi
# 提取IPV4地址 if [ -f /usr/local/bin/pve_ipv6_prefixlen ]; then
ipv4_address=$(ip addr show | awk '/inet .*global/ && !/inet6/ {print $2}') ipv6_prefixlen=$(cat /usr/local/bin/pve_ipv6_prefixlen)
# 提取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"
fi fi
if [ -z "$ipv6_address" ]; then if [ -f /usr/local/bin/pve_ipv6_gateway ]; then
_red "No IPV6 address on the parent machine, no automatic mapping" ipv6_gateway=$(cat /usr/local/bin/pve_ipv6_gateway)
_red "母机无 IPV6 地址,不进行自动映射"
else
_blue "The IPV6 address of the host is $ipv6_address"
_blue "母鸡的IPV6地址为 $ipv6_address"
fi fi
# 录入网关 # 录入网关
if [ -f /etc/network/interfaces ]; then if [ ! -f /etc/network/interfaces.bak ]; then
cp /etc/network/interfaces /etc/network/interfaces.bak cp /etc/network/interfaces /etc/network/interfaces.bak
fi fi
# 修正部分网络设置重复的错误 # 修正部分网络设置重复的错误
@ -95,62 +64,17 @@ fi
interfaces_file="/etc/network/interfaces" interfaces_file="/etc/network/interfaces"
chattr -i "$interfaces_file" chattr -i "$interfaces_file"
if ! grep -q "auto lo" "$interfaces_file"; then if ! grep -q "auto lo" "$interfaces_file"; then
# echo "auto lo" >> "$interfaces_file"
_blue "Can not find 'auto lo' in ${interfaces_file}" _blue "Can not find 'auto lo' in ${interfaces_file}"
exit 1 exit 1
fi fi
if ! grep -q "iface lo inet loopback" "$interfaces_file"; then 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}" _blue "Can not find 'iface lo inet loopback' in ${interfaces_file}"
exit 1 exit 1
fi 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 if grep -q "vmbr1" "$interfaces_file"; then
_blue "vmbr1 already exists in ${interfaces_file}" _blue "vmbr1 already exists in ${interfaces_file}"
_blue "vmbr1 已存在在 ${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" cat << EOF | sudo tee -a "$interfaces_file"
auto vmbr1 auto vmbr1
iface vmbr1 inet static iface vmbr1 inet static
@ -166,7 +90,7 @@ iface vmbr1 inet static
pre-up echo 2 > /proc/sys/net/ipv6/conf/vmbr0/accept_ra pre-up echo 2 > /proc/sys/net/ipv6/conf/vmbr0/accept_ra
EOF EOF
else elif [ -z "$ipv6_address" ] || [ -z "$ipv6_prefixlen" ] || [ -z "$ipv6_gateway" ]; then
cat << EOF | sudo tee -a "$interfaces_file" cat << EOF | sudo tee -a "$interfaces_file"
auto vmbr1 auto vmbr1
iface vmbr1 inet static 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-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 post-down iptables -t nat -D POSTROUTING -s '172.16.1.0/24' -o vmbr0 -j MASQUERADE
EOF 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 fi
chattr +i "$interfaces_file" chattr +i "$interfaces_file"
rm -rf /root/iface_auto.txt rm -rf /usr/local/bin/iface_auto.txt
# 加载iptables并设置回源且允许NAT端口转发 # 加载iptables并设置回源且允许NAT端口转发
apt-get install -y iptables iptables-persistent apt-get install -y iptables iptables-persistent

View file

@ -75,14 +75,10 @@ install_package() {
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
apt_output=$(apt-get install -y $package_name --fix-missing 2>&1) apt_output=$(apt-get install -y $package_name --fix-missing 2>&1)
fi fi
if [ $? -ne 0 ] && [ "$package_name" != "proxmox-ve" ]; then if [ $? -ne 0 ]; then
_green "$package_name tried to install but failed, exited the program" if echo "$apt_output" | grep -qE 'DEBIAN_FRONTEND=dialog dpkg --configure grub-pc' &&
_green "$package_name 已尝试安装但失败,退出程序" echo "$apt_output" | grep -qE 'dpkg --configure -a' &&
exit 1 echo "$apt_output" | grep -qE 'dpkg: error processing package grub-pc \(--configure\):'
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\):'
then then
# 手动选择 # 手动选择
# DEBIAN_FRONTEND=dialog dpkg --configure grub-pc # DEBIAN_FRONTEND=dialog dpkg --configure grub-pc
@ -99,6 +95,11 @@ install_package() {
apt-get install -y $package_name --fix-missing apt-get install -y $package_name --fix-missing
fi fi
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 tried to install"
_green "$package_name 已尝试安装" _green "$package_name 已尝试安装"
fi fi
@ -280,26 +281,21 @@ remove_source_input
# 检查/etc/network/interfaces文件中是否有iface xxxx inet auto行 # 检查/etc/network/interfaces文件中是否有iface xxxx inet auto行
if [ -f "/etc/network/interfaces" ]; then if [ -f "/etc/network/interfaces" ]; then
if grep -q "iface $interface inet auto" /etc/network/interfaces; then if grep -q "iface $interface inet auto" /etc/network/interfaces; then
# 获取ipv4、subnet、gateway信息 subnet=$(ipcalc -n "$ipv4_address" | grep -oP 'Netmask:\s+\K.*' | awk '{print $1}')
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}')
chattr -i /etc/network/interfaces chattr -i /etc/network/interfaces
if [[ -z "${CN}" || "${CN}" != true ]]; then if [[ -z "${CN}" || "${CN}" != true ]]; then
sed -i "/iface $interface inet auto/c\ sed -i "/iface $interface inet auto/c\
iface $interface inet static\n\ iface $interface inet static\n\
address $ipv4\n\ address $ipv4_address\n\
netmask $subnet\n\ netmask $subnet\n\
gateway $gateway\n\ gateway $ipv4_gateway\n\
dns-nameservers 8.8.8.8 8.8.4.4" /etc/network/interfaces dns-nameservers 8.8.8.8 8.8.4.4" /etc/network/interfaces
else else
sed -i "/iface $interface inet auto/c\ sed -i "/iface $interface inet auto/c\
iface $interface inet static\n\ iface $interface inet static\n\
address $ipv4\n\ address $ipv4_address\n\
netmask $subnet\n\ netmask $subnet\n\
gateway $gateway\n\ gateway $ipv4_gateway\n\
dns-nameservers 8.8.8.8 223.5.5.5" /etc/network/interfaces dns-nameservers 8.8.8.8 223.5.5.5" /etc/network/interfaces
fi fi
fi fi
@ -315,25 +311,21 @@ if [[ $dmidecode_output == *"Hetzner_vServer"* ]] || [[ $dmidecode_output == *"M
fi fi
if grep -q "iface $interface inet dhcp" /etc/network/interfaces; then if grep -q "iface $interface inet dhcp" /etc/network/interfaces; then
# 获取ipv4、subnet、gateway信息 # 获取ipv4、subnet、gateway信息
gateway=$(ip route | awk '/default/ {print $3}') subnet=$(ipcalc -n "$ipv4_address" | grep -oP 'Netmask:\s+\K.*' | awk '{print $1}')
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}')
chattr -i /etc/network/interfaces chattr -i /etc/network/interfaces
if [[ -z "${CN}" || "${CN}" != true ]]; then if [[ -z "${CN}" || "${CN}" != true ]]; then
sed -i "/iface $interface inet dhcp/c\ sed -i "/iface $interface inet dhcp/c\
iface $interface inet static\n\ iface $interface inet static\n\
address $ipv4\n\ address $ipv4_address\n\
netmask $subnet\n\ netmask $subnet\n\
gateway $gateway\n\ gateway $ipv4_gateway\n\
dns-nameservers 8.8.8.8 8.8.4.4" /etc/network/interfaces dns-nameservers 8.8.8.8 8.8.4.4" /etc/network/interfaces
else else
sed -i "/iface $interface inet dhcp/c\ sed -i "/iface $interface inet dhcp/c\
iface $interface inet static\n\ iface $interface inet static\n\
address $ipv4\n\ address $ipv4_address\n\
netmask $subnet\n\ netmask $subnet\n\
gateway $gateway\n\ gateway $ipv4_gateway\n\
dns-nameservers 8.8.8.8 223.5.5.5" /etc/network/interfaces dns-nameservers 8.8.8.8 223.5.5.5" /etc/network/interfaces
fi fi
fi fi
@ -376,13 +368,6 @@ fix_interfaces_ipv6_auto_type(){
modified_line="${line/auto/static}" modified_line="${line/auto/static}"
echo "$modified_line" echo "$modified_line"
# 添加静态IPv6配置信息 # 添加静态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 " address ${ipv6_address}/${ipv6_prefixlen}"
echo " gateway ${ipv6_gateway}" echo " gateway ${ipv6_gateway}"
fi fi
@ -396,6 +381,62 @@ fix_interfaces_ipv6_auto_type(){
rm -rf /tmp/interfaces.modified 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() { check_cdn() {
local o_url=$1 local o_url=$1
for cdn_url in "${cdn_urls[@]}"; do 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检测 # ChinaIP检测
check_china 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 "Detecting system information, will probably stay on the page for up to 1~2 minutes"
_yellow "正在检测系统信息大概会停留在该页面最多1~2分钟" _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地址 # 检测主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地址 # 检测物理接口和MAC地址
interface_1=$(lshw -C network | awk '/logical name:/{print $3}' | sed -n '1p') 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}') # mac_address=$(ip -o link show dev ${interface} | awk '{print $17}')
# fi # 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是否存在特定配置 # 检查50-cloud-init是否存在特定配置
if [ -f "/etc/network/interfaces.d/50-cloud-init" ]; then 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 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 if [ ! -f "/etc/network/interfaces" ]; then
touch "/etc/network/interfaces" touch "/etc/network/interfaces"
gateway=$(ip route | awk '/default/ {print $3}') subnet=$(ipcalc -n "$ipv4_address" | grep -oP 'Netmask:\s+\K.*' | awk '{print $1}')
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}')
chattr -i /etc/network/interfaces chattr -i /etc/network/interfaces
echo "auto lo" >> /etc/network/interfaces echo "auto lo" >> /etc/network/interfaces
echo "iface lo inet loopback" >> /etc/network/interfaces echo "iface lo inet loopback" >> /etc/network/interfaces
echo "iface $interface inet static" >> /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 " netmask $subnet" >> /etc/network/interfaces
echo " gateway $gateway" >> /etc/network/interfaces echo " gateway $ipv4_gateway" >> /etc/network/interfaces
if [[ -z "${CN}" || "${CN}" != true ]]; then if [[ -z "${CN}" || "${CN}" != true ]]; then
echo " dns-nameservers 8.8.8.8 8.8.4.4" >> /etc/network/interfaces echo " dns-nameservers 8.8.8.8 8.8.4.4" >> /etc/network/interfaces
else else
@ -811,9 +884,6 @@ if [[ "${CN}" == true ]]; then
echo "nameserver 223.5.5.5" >> /etc/resolv.conf echo "nameserver 223.5.5.5" >> /etc/resolv.conf
fi 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文件修改 # cloud-init文件修改
rebuild_cloud_init rebuild_cloud_init
@ -1021,6 +1091,53 @@ fi
rebuild_interfaces rebuild_interfaces
fix_interfaces_ipv6_auto_type 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的情况 # 特殊处理Hetzner和Azure的情况
if [[ $dmidecode_output == *"Hetzner_vServer"* ]] || [[ $dmidecode_output == *"Microsoft Corporation"* ]]; then 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) auto_interface=$(grep '^auto ' /etc/network/interfaces | grep -v '^auto lo' | awk '{print $2}' | head -n 1)