Layvu

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

Dec 1st, 2024 (edited)
344
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 11.63 KB | Software | 0 0
  1. #!/bin/bash
  2.  
  3. # Проверяем, передан ли файл через консоль
  4. if [ -z "$1" ]; then
  5.   echo "Ошибка: укажите файл с ресурсами при запуске скрипта."
  6.   echo "Пример: $0 <filename>"
  7.   exit 1
  8. fi
  9.  
  10. INPUT_FILE="$1"
  11.  
  12. # Проверка существования файла с ресурсами
  13. if [ ! -f "$INPUT_FILE" ]; then
  14.     echo "Файл $INPUT_FILE не найден"
  15.     exit 1
  16. fi
  17.  
  18.  
  19.  
  20. # Инициализация переменных
  21. VPN_IF=""
  22. REMOVE_VPN=false
  23.  
  24. # Проверка наличия активного VPN-интерфейса (tun0, ppp0, wg0)
  25. for iface in $(ip link show | awk -F': ' '{print $2}'); do
  26.     if [[ "$iface" =~ ^(tun|ppp|wg)[0-9]+$ ]]; then
  27.         if ip link show "$iface" | grep -q "state UP"; then
  28.             VPN_IF=$iface
  29.             break
  30.         fi
  31.     fi
  32. done
  33.  
  34. # Если VPN-интерфейс не найден, создаём эмуляцию VPN через интерфейс dummy (для теста)
  35. if [ -z "$VPN_IF" ]; then
  36.     echo "VPN-соединение не найдено. Создаю эмуляцию VPN через интерфейс vpn0"
  37.     VPN_IF="vpn0"
  38.     ip link add $VPN_IF type dummy
  39.     ip addr add 10.0.0.1/24 dev $VPN_IF
  40.     ip link set $VPN_IF up
  41.     REMOVE_VPN=true
  42. else
  43.     echo "Используем существующий VPN-интерфейс: $VPN_IF"
  44. fi
  45.  
  46.  
  47.  
  48. # Проверяем наличие дефолтного маршрута через VPN
  49. default_vpn_route=$(ip route show | grep "^default .* dev $VPN_IF")
  50.  
  51. if [ -n "$default_vpn_route" ]; then
  52.     echo "Обнаружен дефолтный маршрут через VPN ($VPN_IF): $default_vpn_route"
  53.     echo "Удаляю дефолтный маршрут через $VPN_IF"
  54.     ip route del default dev "$VPN_IF" || echo "Ошибка удаления дефолтного маршрута через $VPN_IF"
  55. else
  56.     echo "Дефолтный маршрут через $VPN_IF не найден"
  57. fi
  58.  
  59.  
  60.  
  61. # Определение активного физического интерфейса. Для маршрутов по умолчанию
  62.  
  63. # Получаем список всех интерфейсов, исключая loopback и VPN
  64. INTERFACES=$(ip link show | awk -F': ' '{print $2}' | grep -Ev "lo|$VPN_IF")
  65.  
  66. # Перебираем физические интерфейсы и проверяем подключение к интернету
  67. PHYS_IF=""
  68. for iface in $INTERFACES; do
  69.     if ip link show "$iface" | grep -q 'state UP'; then
  70.         echo "Проверяю доступность интернета через $iface"
  71.         if ping -c 1 -I "$iface" 8.8.8.8 >/dev/null 2>&1; then
  72.             PHYS_IF=$iface
  73.             echo "Интернет доступен через $iface"
  74.             break
  75.         fi
  76.     fi
  77. done
  78. # Если не нашли такой интерфейс
  79. if [ -z "$PHYS_IF" ]; then
  80.     echo "Не удалось найти активный физический интерфейс"
  81.     [[ "$REMOVE_VPN" == true ]] && ip link delete "$VPN_IF"
  82.     exit 1
  83. fi
  84. echo "Активный физический интерфейс: $PHYS_IF"
  85.  
  86.  
  87.  
  88. # Удаление старых маршрутов
  89. echo "Удаляю маршруты для ресурсов из $INPUT_FILE"
  90. while IFS= read -r resource; do
  91.     # Проверяем является ли ресурс IPv4
  92.     if [[ $resource =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
  93.         ip_address=$resource
  94.     else
  95.         # Если это URL, пытаемся его резолвить в IP
  96.         ip_addresses=$(getent ahosts "$resource" | awk '$1 ~ /^[0-9]+\./ {print $1}' | sort -u)
  97.  
  98.         if [ -n "$ip_addresses" ]; then
  99.             for ip_address in $ip_addresses; do
  100.                 echo "Удаляю маршрут для $ip_address"
  101.                 ip route del "$ip_address" 2>/dev/null
  102.             done
  103.         else
  104.             echo "Не удалось резолвить $resource. Пропускаю."
  105.         fi
  106.     fi
  107.     if [ -n "$ip_address" ]; then
  108.         ip route del "$ip_address" 2>/dev/null
  109.     fi
  110. done < "$INPUT_FILE"
  111.  
  112.  
  113.  
  114. # Установка маршрутов для каждого ресурса из файла
  115.  
  116. echo "Начинаю добавлять маршруты для ресурсов из $INPUT_FILE"
  117. while IFS= read -r resource; do
  118.     # Проверяем, является ли ресурс IPv4
  119.     if [[ $resource =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
  120.         ip_addresses=$resource
  121.         echo "Обрабатываю IP: $resource"
  122.     else
  123.         # Если это URL, пытаемся его резолвить в IP
  124.         echo "Пытаюсь резолвить URL: $resource"
  125.         ip_addresses=$(getent ahosts "$resource" | awk '$1 ~ /^[0-9]+\./ {print $1}' | sort -u)
  126.        
  127.         # Если не удается резолвить, выводим ошибку
  128.         if [ -z "$ip_addresses" ]; then
  129.             echo "Не удалось резолвить $resource. Проверьте подключение к сети или DNS"
  130.             continue
  131.         fi
  132.         echo "URL $resource резолвится в IP: $ip_addresses"
  133.     fi
  134.  
  135.     # Обрабатываем каждый IP-адрес, связанный с ресурсом
  136.     for ip_address in $ip_addresses; do
  137.         echo "Обрабатываю IP $ip_address для $resource"
  138.  
  139.         # Проверяем, существует ли уже маршрут для этого IP
  140.         if ! ip route show | grep -q "$ip_address"; then
  141.             # Если маршрута нет, добавляем его через VPN
  142.             echo "Добавляю маршрут для $ip_address через $VPN_IF"
  143.             ip route add "$ip_address" dev "$VPN_IF" || echo "Ошибка добавления маршрута для $resource ($ip_address)"
  144.         else
  145.             echo "Маршрут для $resource ($ip_address) уже существует"
  146.         fi
  147.     done
  148. done < "$INPUT_FILE"
  149.  
  150.  
  151.  
  152. # Добавляем маршрут по умолчанию через физический интерфейс, если он ещё не настроен
  153. if ! ip route show | grep -q "default"; then
  154.     echo "Добавляю маршрут по умолчанию через $PHYS_IF"
  155.     ip route add default dev "$PHYS_IF" || echo "Ошибка добавления маршрута по умолчанию"
  156. else
  157.     echo "Маршрут по умолчанию уже существует"
  158. fi
  159.  
  160.  
  161.  
  162. echo "Маршруты настроены"
  163.  
  164. # Вывод всех текущих маршрутов
  165. echo "Текущие маршруты:"
  166. ip route show
  167.  
  168. # Удаление VPN-интерфейса для теста скрипта
  169. if [[ "$REMOVE_VPN" == true ]]; then
  170.     echo "Удаляю VPN-интерфейс $VPN_IF"
  171.     ip link delete "$VPN_IF"
  172. fi
  173.  
  174. echo "Скрипт завершён"
  175.  
  176.  
  177. #  ./route_script.sh resources.txt
  178.  
  179. #  ip route show
  180.  
  181. # Пример resources.txt:
  182. # 8.8.8.8
  183. # google.com
  184. # facebook.com
  185. # 192.168.1.100
  186.  
  187. # Пример вывода:
  188.  
  189. # VPN-соединение не найдено. Создаю эмуляцию VPN через интерфейс vpn0
  190. # Дефолтный маршрут через vpn0 не найден
  191. # Проверяю доступность интернета через eth0
  192. # Интернет доступен через eth0
  193. # Активный физический интерфейс: eth0
  194. # Удаляю маршруты для ресурсов из resources.txt
  195. # Удаляю маршрут для 216.239.32.10
  196. # Удаляю маршрут для 216.239.34.10
  197. # Удаляю маршрут для 216.239.36.10
  198. # Удаляю маршрут для 216.239.38.10
  199. # Удаляю маршрут для 216.58.211.14
  200. # Удаляю маршрут для 129.134.30.12
  201. # Удаляю маршрут для 129.134.31.12
  202. # Удаляю маршрут для 157.240.205.35
  203. # Удаляю маршрут для 185.89.218.12
  204. # Удаляю маршрут для 185.89.219.12
  205. # Начинаю добавлять маршруты для ресурсов из resources.txt
  206. # Обрабатываю IP: 8.8.8.8
  207. # Обрабатываю IP 8.8.8.8 для 8.8.8.8
  208. # Добавляю маршрут для 8.8.8.8 через vpn0
  209. # Пытаюсь резолвить URL: google.com
  210. # URL google.com резолвится в IP: 216.239.32.10
  211. # 216.239.34.10
  212. # 216.239.36.10
  213. # 216.239.38.10
  214. # 216.58.211.14
  215. # Обрабатываю IP 216.239.32.10 для google.com
  216. # Добавляю маршрут для 216.239.32.10 через vpn0
  217. # Обрабатываю IP 216.239.34.10 для google.com
  218. # Добавляю маршрут для 216.239.34.10 через vpn0
  219. # Обрабатываю IP 216.239.36.10 для google.com
  220. # Добавляю маршрут для 216.239.36.10 через vpn0
  221. # Обрабатываю IP 216.239.38.10 для google.com
  222. # Добавляю маршрут для 216.239.38.10 через vpn0
  223. # Обрабатываю IP 216.58.211.14 для google.com
  224. # Добавляю маршрут для 216.58.211.14 через vpn0
  225. # Пытаюсь резолвить URL: facebook.com
  226. # URL facebook.com резолвится в IP: 129.134.30.12
  227. # 129.134.31.12
  228. # 157.240.205.35
  229. # 185.89.218.12
  230. # 185.89.219.12
  231. # Обрабатываю IP 129.134.30.12 для facebook.com
  232. # Добавляю маршрут для 129.134.30.12 через vpn0
  233. # Обрабатываю IP 129.134.31.12 для facebook.com
  234. # Добавляю маршрут для 129.134.31.12 через vpn0
  235. # Обрабатываю IP 157.240.205.35 для facebook.com
  236. # Добавляю маршрут для 157.240.205.35 через vpn0
  237. # Обрабатываю IP 185.89.218.12 для facebook.com
  238. # Добавляю маршрут для 185.89.218.12 через vpn0
  239. # Обрабатываю IP 185.89.219.12 для facebook.com
  240. # Добавляю маршрут для 185.89.219.12 через vpn0
  241. # Обрабатываю IP: 192.168.1.100
  242. # Обрабатываю IP 192.168.1.100 для 192.168.1.100
  243. # Добавляю маршрут для 192.168.1.100 через vpn0
  244. # Маршрут по умолчанию уже существует
  245. # Маршруты настроены
  246. # Текущие маршруты:
  247. # default via 172.29.80.1 dev eth0 proto kernel
  248. # 8.8.8.8 dev vpn0 scope link
  249. # 10.0.0.0/24 dev vpn0 proto kernel scope link src 10.0.0.1
  250. # 10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.1
  251. # 129.134.30.12 dev vpn0 scope link
  252. # 129.134.31.12 dev vpn0 scope link
  253. # 157.240.205.35 dev vpn0 scope link
  254. # 172.27.224.0/23 dev as0t0 proto kernel scope link src 172.27.224.1
  255. # 172.27.226.0/23 dev as0t1 proto kernel scope link src 172.27.226.1
  256. # 172.27.228.0/23 dev as0t2 proto kernel scope link src 172.27.228.1
  257. # 172.27.230.0/23 dev as0t3 proto kernel scope link src 172.27.230.1
  258. # 172.27.232.0/23 dev as0t4 proto kernel scope link src 172.27.232.1
  259. # 172.27.234.0/23 dev as0t5 proto kernel scope link src 172.27.234.1
  260. # 172.27.236.0/23 dev as0t6 proto kernel scope link src 172.27.236.1
  261. # 172.27.238.0/23 dev as0t7 proto kernel scope link src 172.27.238.1
  262. # 172.29.80.0/20 dev eth0 proto kernel scope link src 172.29.83.150
  263. # 185.89.218.12 dev vpn0 scope link
  264. # 185.89.219.12 dev vpn0 scope link
  265. # 192.168.1.100 dev vpn0 scope link
  266. # 216.58.211.14 dev vpn0 scope link
  267. # 216.239.32.10 dev vpn0 scope link
  268. # 216.239.34.10 dev vpn0 scope link
  269. # 216.239.36.10 dev vpn0 scope link
  270. # 216.239.38.10 dev vpn0 scope link
  271. # Удаляю VPN-интерфейс vpn0
  272. # Скрипт завершён
Advertisement
Add Comment
Please, Sign In to add comment