Последняя активность 13 hours ago

netplan_configurator.md Исходник
wget https://raw.githubusercontent.com/openlicence/netplan_configurator.sh/refs/heads/main/netplan_configurator.sh
chmod +x netplan_configurator.sh
./netplan_configurator.sh

Original: https://github.com/openlicence/netplan_configurator.sh

Упоминается в https://timeweb.cloud/docs/unix-guides/adding-ip-addresses

netplan_configurator.sh Исходник
1#!/bin/bash
2
3# Функция для проверки IPv4
4function is_valid_ipv4() {
5 local ip=$1
6 local stat=1
7 if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
8 OIFS=$IFS
9 IFS='.'
10 ip=($ip)
11 IFS=$OIFS
12 [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
13 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
14 stat=$?
15 fi
16 return $stat
17}
18
19# Функция для проверки IPv6
20function is_valid_ipv6() {
21 local ip=$1
22 local stat=1
23 if [[ $ip =~ ^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}$ ]]; then
24 stat=0
25 fi
26 return $stat
27}
28
29# Определение шлюза
30function get_gateway() {
31 local ip=$1
32 if is_valid_ipv4 "$ip"; then
33 IFS='.' read -ra octets <<< "$ip"
34 octets[3]=1
35 echo "${octets[0]}.${octets[1]}.${octets[2]}.${octets[3]}"
36 elif is_valid_ipv6 "$ip"; then
37 IFS=':' read -ra hextets <<< "$ip"
38 hextets[-1]="1"
39 echo "$(IFS=:; echo "${hextets[*]}")"
40 else
41 echo "Неверный IP-адрес"
42 exit 1
43 fi
44}
45
46# Форматирование DNS для YAML
47function format_dns() {
48 local formatted=()
49 for addr in "$@"; do
50 formatted+=("\"$addr\"")
51 done
52 echo "${formatted[*]}" | sed 's/ /, /g'
53}
54
55# Вывод списка доступных интерфейсов
56function show_interfaces() {
57 echo "Доступные сетевые интерфейсы:"
58 ip -o link show | awk -F': ' '{print $2}'
59}
60
61# Запрос типа настройки
62read -p "Настройка временная (1) или постоянная (2)? Введите 1 или 2: " config_type
63
64# Вывод списка интерфейсов и запрос выбора
65show_interfaces
66read -p "Введите имя интерфейса (например, eth0): " interface
67
68# Проверка существования интерфейса
69if ! ip link show "$interface" &> /dev/null; then
70 echo "Интерфейс $interface не найден!"
71 exit 1
72fi
73
74# Ввод IPv4 адресов
75while true; do
76 read -p "Введите IPv4 адреса через пробел (первый будет основным): " ipv4_input
77 ipv4_addresses=($ipv4_input)
78 valid=true
79 for ip in "${ipv4_addresses[@]}"; do
80 if ! is_valid_ipv4 "$ip"; then
81 echo "Неверный формат IPv4: $ip"
82 valid=false
83 break
84 fi
85 done
86 if $valid; then
87 break
88 fi
89done
90
91# Основной IPv4 и шлюз
92main_ipv4=${ipv4_addresses[0]}
93ipv4_gateway=$(get_gateway "$main_ipv4")
94
95# Ввод IPv6 адресов (опционально)
96read -p "Добавить IPv6 адреса? (y/n): " add_ipv6
97if [[ $add_ipv6 == "y" ]]; then
98 while true; do
99 read -p "Введите IPv6 адреса через пробел (первый будет основным): " ipv6_input
100 ipv6_addresses=($ipv6_input)
101 valid=true
102 for ip in "${ipv6_addresses[@]}"; do
103 if ! is_valid_ipv6 "$ip"; then
104 echo "Неверный формат IPv6: $ip"
105 valid=false
106 break
107 fi
108 done
109 if $valid; then
110 break
111 fi
112 done
113
114 # Основной IPv6 и шлюз
115 main_ipv6=${ipv6_addresses[0]}
116 ipv6_gateway=$(get_gateway "$main_ipv6")
117fi
118
119# DNS-серверы
120dns=()
121read -p "Использовать DNS по умолчанию (Cloudflare)? (y/n): " use_default_dns
122if [[ $use_default_dns == "y" ]]; then
123 dns=("1.1.1.1" "1.0.0.1" "2606:4700:4700::1111" "2606:4700:4700::1001")
124else
125 echo "Введите DNS-серверы (завершите пустой строкой):"
126 while true; do
127 read dns_entry
128 [[ -z $dns_entry ]] && break
129 dns+=("$dns_entry")
130 done
131fi
132dns_string=$(format_dns "${dns[@]}")
133
134# Временная настройка
135if [[ $config_type == "1" ]]; then
136 echo "Применение временных настроек..."
137 # Добавление IPv4 адресов
138 for ip in "${ipv4_addresses[@]}"; do
139 sudo ip addr add "$ip/24" dev $interface
140 done
141
142 # Добавление IPv6 адресов
143 if [[ $add_ipv6 == "y" ]]; then
144 for ip in "${ipv6_addresses[@]}"; do
145 sudo ip addr add "$ip/128" dev $interface
146 done
147 fi
148
149 # Настройка маршрутов
150 if [[ -n "$ipv4_gateway" ]]; then
151 sudo ip route replace default via $ipv4_gateway dev $interface
152 fi
153 if [[ -n "$ipv6_gateway" && $add_ipv6 == "y" ]]; then
154 sudo ip -6 route replace default via $ipv6_gateway dev $interface
155 fi
156
157 echo "Временные настройки применены"
158
159# Постоянная настройка для Ubuntu
160else
161 echo "Применение постоянных настроек для Ubuntu..."
162
163 # Создание IPv4 конфига
164 if [[ ${#ipv4_addresses[@]} -gt 0 ]]; then
165 ipv4_file="/etc/netplan/99-ipv4.yaml"
166 # Форматирование адресов для YAML
167 ipv4_formatted=()
168 for ip in "${ipv4_addresses[@]}"; do
169 ipv4_formatted+=("\"$ip/24\"")
170 done
171 ipv4_string=$(IFS=,; echo "${ipv4_formatted[*]}")
172
173 cat << EOF | sudo tee $ipv4_file > /dev/null
174network:
175 version: 2
176 renderer: networkd
177 ethernets:
178 $interface:
179 dhcp4: false
180 addresses: [$ipv4_string]
181 routes:
182 - to: 0.0.0.0/0
183 via: $ipv4_gateway
184 nameservers:
185 addresses: [$dns_string]
186EOF
187 sudo chmod 600 $ipv4_file
188 fi
189
190 # Создание IPv6 конфига
191 if [[ ${#ipv6_addresses[@]} -gt 0 && $add_ipv6 == "y" ]]; then
192 ipv6_file="/etc/netplan/99-ipv6.yaml"
193 # Форматирование адресов для YAML
194 ipv6_formatted=()
195 for ip in "${ipv6_addresses[@]}"; do
196 ipv6_formatted+=("\"$ip/128\"")
197 done
198 ipv6_string=$(IFS=,; echo "${ipv6_formatted[*]}")
199
200 cat << EOF | sudo tee $ipv6_file > /dev/null
201network:
202 version: 2
203 renderer: networkd
204 ethernets:
205 $interface:
206 dhcp6: false
207 addresses: [$ipv6_string]
208 routes:
209 - to: ::/0
210 via: $ipv6_gateway
211 nameservers:
212 addresses: [$dns_string]
213EOF
214 sudo chmod 600 $ipv6_file
215 fi
216
217 # Резервирование старых конфигов
218 sudo mv /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.backup 2>/dev/null
219
220 # Применение настроек
221 sudo netplan apply
222 echo "Настройки применены. Рекомендуется перезагрузить сервер."
223fi
224