Advertisement
Layvu

VPN Routing Script. Земский А.В.

Dec 1st, 2024 (edited)
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 6.37 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. INPUT_FILE="resources.txt"
  4.  
  5. # Проверка существования файла с ресурсами
  6. if [ ! -f "$INPUT_FILE" ]; then
  7.     echo "Файл $INPUT_FILE не найден"
  8.     exit 1
  9. fi
  10.  
  11. # Эмуляция VPN-соединения через интерфейс dummy (для теста. Иначе - tun0)
  12. VPN_IF="vpn0"
  13. REMOVE_VPN=false
  14.  
  15. # Проверяем, существует ли уже VPN-интерфейс. Если нет, создаём (для теста)
  16. if ! ip link show $VPN_IF &>/dev/null; then
  17.     echo "Создаю эмуляцию VPN через интерфейс $VPN_IF"
  18.     ip link add $VPN_IF type dummy
  19.     ip addr add 10.0.0.1/24 dev $VPN_IF
  20.     ip link set $VPN_IF up
  21.     REMOVE_VPN=true
  22. fi
  23.  
  24. # Определение физического интерфейса для маршрутов по умолчанию
  25. # Получаем список всех интерфейсов, исключая loopback и VPN
  26. INTERFACES=$(ip link show | awk -F': ' '{print $2}' | grep -Ev "lo|$VPN_IF")
  27.  
  28. # Перебираем каждый интерфейс и проверяем, активен ли он
  29. PHYS_IF=""
  30. for iface in $INTERFACES; do
  31.     if ip link show $iface | grep -q 'state UP'; then
  32.         PHYS_IF=$iface
  33.         break
  34.     fi
  35. done
  36.  
  37. # Проверка, что нашли активный физический интерфейс
  38. if [ -z "$PHYS_IF" ]; then
  39.     echo "Не удалось найти активный физический интерфейс"
  40.     # VPN-интерфейс будет удалён:
  41.     [[ "$REMOVE_VPN" == true ]] && ip link delete $VPN_IF
  42.     exit 1
  43. fi
  44.  
  45. echo "Активный физический интерфейс: $PHYS_IF"
  46.  
  47. # Установка маршрутов для каждого ресурса из файла
  48. echo "Начинаю добавлять маршруты для ресурсов из $INPUT_FILE"
  49. while IFS= read -r resource; do
  50.     # Проверяем, если это IP-адрес
  51.     if [[ $resource =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
  52.         ip_address=$resource
  53.         echo "Обрабатываю IP: $ip_address"
  54.  
  55.     else
  56.         # Если это URL, пытаемся его резолвить в IP
  57.         echo "Пытаемся резолвить URL: $resource"
  58.         ip_address=$(getent ahosts "$resource" | awk '$1 ~ /^[0-9]+\./ {print $1; exit}')
  59.        
  60.         # Если не удается резолвить, выводим ошибку и продолжаем
  61.         if [ -z "$ip_address" ]; then
  62.             echo "Не удалось резолвить $resource. Проверьте подключение к сети или DNS"
  63.             continue
  64.         fi
  65.         echo "URL $resource резолвится в IP: $ip_address"
  66.     fi
  67.  
  68.     # Проверяем существует ли уже маршрут для этого IP-адреса
  69.     if ! ip route show | grep -q "$ip_address"; then
  70.         # Если маршрута нет, добавляем его через VPN
  71.         echo "Добавляю маршрут для $ip_address через $VPN_IF"
  72.         ip route add "$ip_address" dev $VPN_IF || echo "Ошибка добавления маршрута для $resource ($ip_address)"
  73.     else
  74.         echo "Маршрут для $resource ($ip_address) уже существует"
  75.     fi
  76. done < "$INPUT_FILE"
  77.  
  78. # Добавляем маршрут по умолчанию через физический интерфейс, если он ещё не настроен
  79. if ! ip route show | grep -q "default"; then
  80.     echo "Добавляю маршрут по умолчанию через $PHYS_IF"
  81.     ip route add default dev $PHYS_IF || echo "Ошибка добавления маршрута по умолчанию"
  82. else
  83.     echo "Маршрут по умолчанию уже существует"
  84. fi
  85.  
  86. echo "Маршруты настроены"
  87.  
  88. # Вывод всех текущих маршрутов
  89. echo "Текущие маршруты:"
  90. ip route show
  91.  
  92. # Удаление VPN-интерфейса для теста скрипта
  93. if [[ "$REMOVE_VPN" == true ]]; then
  94.     echo "Удаляю VPN-интерфейс $VPN_IF"
  95.     ip link delete $VPN_IF
  96. fi
  97.  
  98. echo "Скрипт завершён"
  99.  
  100.  
  101. #  ./route_script.sh
  102.  
  103. # Пример resources.txt:
  104. # 8.8.8.8
  105. # google.com
  106. # facebook.com
  107. # 192.168.1.100
  108.  
  109. # Пример вывода:
  110.  
  111. # Создаю эмуляцию VPN через интерфейс vpn0
  112. # Активный физический интерфейс: eth0
  113. # Начинаю добавлять маршруты для ресурсов из resources.txt
  114. # Обрабатываю IP: 8.8.8.8
  115. # Добавляю маршрут для 8.8.8.8 через vpn0
  116. # Пытаюсь резолвить URL: google.com
  117. # URL google.com резолвится в IP: 173.194.73.101
  118. # Добавляю маршрут для 173.194.73.101 через vpn0
  119. # Пытаюсь резолвить URL: facebook.com
  120. # URL facebook.com резолвится в IP: 157.240.205.35
  121. # Добавляю маршрут для 157.240.205.35 через vpn0
  122. # Обрабатываю IP: 192.168.1.100
  123. # Добавляю маршрут для 192.168.1.100 через vpn0
  124. # Маршрут по умолчанию уже существует
  125. # Маршруты настроены
  126. # Текущие маршруты:
  127. # default via 172.29.80.1 dev eth0 proto kernel
  128. # 8.8.8.8 dev vpn0 scope link
  129. # 10.0.0.0/24 dev vpn0 proto kernel scope link src 10.0.0.1
  130. # 10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.1
  131. # 157.240.205.35 dev vpn0 scope link
  132. # 172.27.224.0/23 dev as0t0 proto kernel scope link src 172.27.224.1
  133. # 172.27.226.0/23 dev as0t1 proto kernel scope link src 172.27.226.1
  134. # 172.27.228.0/23 dev as0t2 proto kernel scope link src 172.27.228.1
  135. # 172.27.230.0/23 dev as0t3 proto kernel scope link src 172.27.230.1
  136. # 172.27.232.0/23 dev as0t4 proto kernel scope link src 172.27.232.1
  137. # 172.27.234.0/23 dev as0t5 proto kernel scope link src 172.27.234.1
  138. # 172.27.236.0/23 dev as0t6 proto kernel scope link src 172.27.236.1
  139. # 172.27.238.0/23 dev as0t7 proto kernel scope link src 172.27.238.1
  140. # 172.29.80.0/20 dev eth0 proto kernel scope link src 172.29.83.150
  141. # 173.194.73.101 dev vpn0 scope link
  142. # 192.168.1.100 dev vpn0 scope link
  143. # Удаляю VPN-интерфейс vpn0
  144. # Скрипт завершён
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement