Last active 15 hours ago

KarelWintersky revised this gist 15 hours ago. Go to revision

2 files changed, 232 insertions

netplan_configurator.md(file created)

@@ -0,0 +1,9 @@
1 + ```
2 + wget https://raw.githubusercontent.com/openlicence/netplan_configurator.sh/refs/heads/main/netplan_configurator.sh
3 + chmod +x netplan_configurator.sh
4 + ./netplan_configurator.sh
5 + ```
6 +
7 + Original: https://github.com/openlicence/netplan_configurator.sh
8 +
9 + Упоминается в https://timeweb.cloud/docs/unix-guides/adding-ip-addresses

netplan_configurator.sh(file created)

@@ -0,0 +1,223 @@
1 + #!/bin/bash
2 +
3 + # Функция для проверки IPv4
4 + function 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
20 + function 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 + # Определение шлюза
30 + function 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
47 + function format_dns() {
48 + local formatted=()
49 + for addr in "$@"; do
50 + formatted+=("\"$addr\"")
51 + done
52 + echo "${formatted[*]}" | sed 's/ /, /g'
53 + }
54 +
55 + # Вывод списка доступных интерфейсов
56 + function show_interfaces() {
57 + echo "Доступные сетевые интерфейсы:"
58 + ip -o link show | awk -F': ' '{print $2}'
59 + }
60 +
61 + # Запрос типа настройки
62 + read -p "Настройка временная (1) или постоянная (2)? Введите 1 или 2: " config_type
63 +
64 + # Вывод списка интерфейсов и запрос выбора
65 + show_interfaces
66 + read -p "Введите имя интерфейса (например, eth0): " interface
67 +
68 + # Проверка существования интерфейса
69 + if ! ip link show "$interface" &> /dev/null; then
70 + echo "Интерфейс $interface не найден!"
71 + exit 1
72 + fi
73 +
74 + # Ввод IPv4 адресов
75 + while 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
89 + done
90 +
91 + # Основной IPv4 и шлюз
92 + main_ipv4=${ipv4_addresses[0]}
93 + ipv4_gateway=$(get_gateway "$main_ipv4")
94 +
95 + # Ввод IPv6 адресов (опционально)
96 + read -p "Добавить IPv6 адреса? (y/n): " add_ipv6
97 + if [[ $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")
117 + fi
118 +
119 + # DNS-серверы
120 + dns=()
121 + read -p "Использовать DNS по умолчанию (Cloudflare)? (y/n): " use_default_dns
122 + if [[ $use_default_dns == "y" ]]; then
123 + dns=("1.1.1.1" "1.0.0.1" "2606:4700:4700::1111" "2606:4700:4700::1001")
124 + else
125 + echo "Введите DNS-серверы (завершите пустой строкой):"
126 + while true; do
127 + read dns_entry
128 + [[ -z $dns_entry ]] && break
129 + dns+=("$dns_entry")
130 + done
131 + fi
132 + dns_string=$(format_dns "${dns[@]}")
133 +
134 + # Временная настройка
135 + if [[ $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
160 + else
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
174 + network:
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]
186 + EOF
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
201 + network:
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]
213 + EOF
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 "Настройки применены. Рекомендуется перезагрузить сервер."
223 + fi
Newer Older