Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- INPUT_FILE="resources.txt"
- # Проверка существования файла с ресурсами
- if [ ! -f "$INPUT_FILE" ]; then
- echo "Файл $INPUT_FILE не найден"
- exit 1
- fi
- # Эмуляция VPN-соединения через интерфейс dummy (для теста. Иначе - tun0)
- VPN_IF="vpn0"
- REMOVE_VPN=false
- # Проверяем, существует ли уже VPN-интерфейс. Если нет, создаём (для теста)
- if ! ip link show $VPN_IF &>/dev/null; then
- echo "Создаю эмуляцию VPN через интерфейс $VPN_IF"
- ip link add $VPN_IF type dummy
- ip addr add 10.0.0.1/24 dev $VPN_IF
- ip link set $VPN_IF up
- REMOVE_VPN=true
- fi
- # Определение физического интерфейса для маршрутов по умолчанию
- # Получаем список всех интерфейсов, исключая loopback и VPN
- INTERFACES=$(ip link show | awk -F': ' '{print $2}' | grep -Ev "lo|$VPN_IF")
- # Перебираем каждый интерфейс и проверяем, активен ли он
- PHYS_IF=""
- for iface in $INTERFACES; do
- if ip link show $iface | grep -q 'state UP'; then
- PHYS_IF=$iface
- break
- fi
- done
- # Проверка, что нашли активный физический интерфейс
- if [ -z "$PHYS_IF" ]; then
- echo "Не удалось найти активный физический интерфейс"
- # VPN-интерфейс будет удалён:
- [[ "$REMOVE_VPN" == true ]] && ip link delete $VPN_IF
- exit 1
- fi
- echo "Активный физический интерфейс: $PHYS_IF"
- # Установка маршрутов для каждого ресурса из файла
- echo "Начинаю добавлять маршруты для ресурсов из $INPUT_FILE"
- while IFS= read -r resource; do
- # Проверяем, если это IP-адрес
- if [[ $resource =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
- ip_address=$resource
- echo "Обрабатываю IP: $ip_address"
- else
- # Если это URL, пытаемся его резолвить в IP
- echo "Пытаемся резолвить URL: $resource"
- ip_address=$(getent ahosts "$resource" | awk '$1 ~ /^[0-9]+\./ {print $1; exit}')
- # Если не удается резолвить, выводим ошибку и продолжаем
- if [ -z "$ip_address" ]; then
- echo "Не удалось резолвить $resource. Проверьте подключение к сети или DNS"
- continue
- fi
- echo "URL $resource резолвится в IP: $ip_address"
- fi
- # Проверяем существует ли уже маршрут для этого IP-адреса
- if ! ip route show | grep -q "$ip_address"; then
- # Если маршрута нет, добавляем его через VPN
- echo "Добавляю маршрут для $ip_address через $VPN_IF"
- ip route add "$ip_address" dev $VPN_IF || echo "Ошибка добавления маршрута для $resource ($ip_address)"
- else
- echo "Маршрут для $resource ($ip_address) уже существует"
- fi
- done < "$INPUT_FILE"
- # Добавляем маршрут по умолчанию через физический интерфейс, если он ещё не настроен
- if ! ip route show | grep -q "default"; then
- echo "Добавляю маршрут по умолчанию через $PHYS_IF"
- ip route add default dev $PHYS_IF || echo "Ошибка добавления маршрута по умолчанию"
- else
- echo "Маршрут по умолчанию уже существует"
- fi
- echo "Маршруты настроены"
- # Вывод всех текущих маршрутов
- echo "Текущие маршруты:"
- ip route show
- # Удаление VPN-интерфейса для теста скрипта
- if [[ "$REMOVE_VPN" == true ]]; then
- echo "Удаляю VPN-интерфейс $VPN_IF"
- ip link delete $VPN_IF
- fi
- echo "Скрипт завершён"
- # ./route_script.sh
- # Пример resources.txt:
- # 8.8.8.8
- # google.com
- # facebook.com
- # 192.168.1.100
- # Пример вывода:
- # Создаю эмуляцию VPN через интерфейс vpn0
- # Активный физический интерфейс: eth0
- # Начинаю добавлять маршруты для ресурсов из resources.txt
- # Обрабатываю IP: 8.8.8.8
- # Добавляю маршрут для 8.8.8.8 через vpn0
- # Пытаюсь резолвить URL: google.com
- # URL google.com резолвится в IP: 173.194.73.101
- # Добавляю маршрут для 173.194.73.101 через vpn0
- # Пытаюсь резолвить URL: facebook.com
- # URL facebook.com резолвится в IP: 157.240.205.35
- # Добавляю маршрут для 157.240.205.35 через vpn0
- # Обрабатываю IP: 192.168.1.100
- # Добавляю маршрут для 192.168.1.100 через vpn0
- # Маршрут по умолчанию уже существует
- # Маршруты настроены
- # Текущие маршруты:
- # default via 172.29.80.1 dev eth0 proto kernel
- # 8.8.8.8 dev vpn0 scope link
- # 10.0.0.0/24 dev vpn0 proto kernel scope link src 10.0.0.1
- # 10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.1
- # 157.240.205.35 dev vpn0 scope link
- # 172.27.224.0/23 dev as0t0 proto kernel scope link src 172.27.224.1
- # 172.27.226.0/23 dev as0t1 proto kernel scope link src 172.27.226.1
- # 172.27.228.0/23 dev as0t2 proto kernel scope link src 172.27.228.1
- # 172.27.230.0/23 dev as0t3 proto kernel scope link src 172.27.230.1
- # 172.27.232.0/23 dev as0t4 proto kernel scope link src 172.27.232.1
- # 172.27.234.0/23 dev as0t5 proto kernel scope link src 172.27.234.1
- # 172.27.236.0/23 dev as0t6 proto kernel scope link src 172.27.236.1
- # 172.27.238.0/23 dev as0t7 proto kernel scope link src 172.27.238.1
- # 172.29.80.0/20 dev eth0 proto kernel scope link src 172.29.83.150
- # 173.194.73.101 dev vpn0 scope link
- # 192.168.1.100 dev vpn0 scope link
- # Удаляю VPN-интерфейс vpn0
- # Скрипт завершён
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement