Добавляем таблицы маршрутизации
mcedit /etc/iproute2/rt_tables
... 201 local_net 202 main_inet 203 backup_inet
Включаем networkd-dispatcher
systemctl enable networkd-dispatcher systemctl start networkd-dispatcher
Создаем скрипт, который будет срабатывать, после
восстановления сетевого интерфейса
touch /etc/networkd-dispatcher/routable.d/10-add-routes.sh chmod +x /etc/networkd-dispatcher/routable.d/10-add-routes.sh mcedit /etc/networkd-dispatcher/routable.d/10-add-routes.sh
ip route flush table main_inet ip route flush table backup_inet ip route flush table local_net ip route flush default ip route add default via 212.212.212.65 ip route add default via 212.212.212.65 dev ens224 table main_inet ip route add default via 89.89.89.161 dev ens192 table backup_inet ip route add default via 192.168.150.100 dev ens160 table local_net ip rule flush ip rule add from 192.168.150.35/32 to all dport 443 table backup_inet priority 80 ip rule add from 192.168.150.0/24 to 10.0.0.0/8 table local_net priority 90 ip rule add from 192.168.150.0/24 to 192.168.0.0/16 table local_net priority 100 ip rule add from 192.168.150.35/32 table main_inet priority 110 ip rule add from 192.168.150.36/32 to 8.8.8.8 table backup_inet priority 120 ip rule add from 192.168.150.0/24 table backup_inet priority 130 ip rule add from all lookup main priority 32766 ip rule add from all lookup default priority 32767
Проверяем: отключаем, затем включаем интерфейс ens224
ifconfig ens224 down ifconfig ens224 up
Смотрим появились ли маршруты после восстановления подключения
ip route ip route show table all | grep 'via' | grep table ip rule show
Создаем скрипт iptables
mcedit /etc/iptables.sh
int_if=ens160 ext_if_backup=ens192 ext_if_main=ens224 localnet=192.168.150.0/24 iptables -P INPUT ACCEPT iptables --flush INPUT iptables -A INPUT -m state --state INVALID -j DROP iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -i $int_if -p tcp --dport 22 -j ACCEPT iptables -A INPUT -i $int_if -p udp --dport 53 -j ACCEPT iptables -A INPUT -i $int_if -p icmp --icmp-type echo-request -j ACCEPT iptables -A INPUT -m state --state NEW -j DROP iptables -P OUTPUT ACCEPT iptables --flush OUTPUT iptables -A OUTPUT -m state --state INVALID -j DROP iptables -A OUTPUT -o lo -j ACCEPT iptables -P FORWARD ACCEPT iptables --flush FORWARD iptables -A FORWARD -m state --state INVALID -j DROP iptables -A FORWARD -s $localnet -i $int_if -j ACCEPT iptables -A FORWARD -m state --state NEW -j DROP iptables -t nat --flush iptables -t nat -P POSTROUTING ACCEPT iptables -t nat --flush POSTROUTING iptables -t nat -A POSTROUTING -s $localnet -o $ext_if_backup -j MASQUERADE iptables -t nat -A POSTROUTING -s $localnet -o $ext_if_main -j MASQUERADE
Запускаем iptables.sh
sh /etc/iptables.sh
Добавляем в автозагрузку (смотри ubuntu_rc.local)
mcedit /etc/rc.local
#!/bin/bash #run ip forwarding sysctl -w net.ipv4.ip_forward=1 #ip route смотри в /etc/networkd-dispatcher/routable.d/10-add-routes.sh #run iptables /etc/iptables.sh exit 0
Проверка с помощью netplan
Добавляем ip в netplan, убираем маршрут по умолчанию
mcedit /etc/netplan/config.yaml
network:
ethernets:
ens160:
dhcp4: no
addresses:
- 192.168.150.170/24
- 192.168.150.171/24
ens192:
dhcp4: no
addresses:
- 89.89.89.161/28
ens224:
dhcp4: no
addresses:
- 212.212.212.70/29
#routes:
#- to: default
# via: 212.212.212.65
Проверяем после применения отредактированной сетевой конфигурации через netplan
netplan apply
После изменения ip
интерфейс подключается заново и
маршруты могут очищаться,
проверяем восстановились ли они, после
восстановления интерфейса
ip route ip route show table all | grep 'via' | grep table ip rule show
Проверяем после перезагрузки системы
init 6
Еще раз проверяем восстановились ли маршруты
ip route ip route show table all | grep 'via' | grep table ip rule show