mirror of
https://github.com/thelittlerocket/pve.git
synced 2025-09-08 15:34:15 +08:00
2023.08.03
This commit is contained in:
parent
bc15c0b492
commit
19b87a61df
5 changed files with 331 additions and 144 deletions
|
@ -15,6 +15,9 @@
|
|||
|
||||
2023.08.03
|
||||
|
||||
- 尝试增加了IPV6的支持,暂时只是支持了IPV6网关的设置,暂时未适配一键开设,明日适配
|
||||
- 简化IPV4和IPV6地址的查询,避免重复查询
|
||||
- 修复可能的grub更新错误
|
||||
- 网络配置文件备份修改顺序,避免重复备份
|
||||
- 增加已修改过的文件的备份
|
||||
- KVM虚拟机增加centos8-stream镜像源
|
||||
|
|
122
back/old_fuction.sh
Normal file
122
back/old_fuction.sh
Normal 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
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue