Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # Проверяем, передан ли файл через консоль
- if [ -z "$1" ]; then
- echo "Ошибка: укажите файл с ресурсами при запуске скрипта."
- echo "Пример: $0 <filename>"
- exit 1
- fi
- INPUT_FILE="$1"
- # Проверка существования файла с ресурсами
- if [ ! -f "$INPUT_FILE" ]; then
- echo "Файл $INPUT_FILE не найден"
- exit 1
- fi
- # Инициализация переменных
- VPN_IF=""
- REMOVE_VPN=false
- # Проверка наличия активного VPN-интерфейса (tun0, ppp0, wg0)
- for iface in $(ip link show | awk -F': ' '{print $2}'); do
- if [[ "$iface" =~ ^(tun|ppp|wg)[0-9]+$ ]]; then
- if ip link show "$iface" | grep -q "state UP"; then
- VPN_IF=$iface
- break
- fi
- fi
- done
- # Если VPN-интерфейс не найден, создаём эмуляцию VPN через интерфейс dummy (для теста)
- if [ -z "$VPN_IF" ]; then
- echo "VPN-соединение не найдено. Создаю эмуляцию VPN через интерфейс vpn0"
- VPN_IF="vpn0"
- 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
- else
- echo "Используем существующий VPN-интерфейс: $VPN_IF"
- fi
- # Проверяем наличие дефолтного маршрута через VPN
- default_vpn_route=$(ip route show | grep "^default .* dev $VPN_IF")
- if [ -n "$default_vpn_route" ]; then
- echo "Обнаружен дефолтный маршрут через VPN ($VPN_IF): $default_vpn_route"
- echo "Удаляю дефолтный маршрут через $VPN_IF"
- ip route del default dev "$VPN_IF" || echo "Ошибка удаления дефолтного маршрута через $VPN_IF"
- else
- echo "Дефолтный маршрут через $VPN_IF не найден"
- 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
- echo "Проверяю доступность интернета через $iface"
- if ping -c 1 -I "$iface" 8.8.8.8 >/dev/null 2>&1; then
- PHYS_IF=$iface
- echo "Интернет доступен через $iface"
- break
- fi
- fi
- done
- # Если не нашли такой интерфейс
- if [ -z "$PHYS_IF" ]; then
- echo "Не удалось найти активный физический интерфейс"
- [[ "$REMOVE_VPN" == true ]] && ip link delete "$VPN_IF"
- exit 1
- fi
- echo "Активный физический интерфейс: $PHYS_IF"
- # Удаление старых маршрутов
- echo "Удаляю маршруты для ресурсов из $INPUT_FILE"
- while IFS= read -r resource; do
- # Проверяем является ли ресурс IPv4
- if [[ $resource =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
- ip_address=$resource
- else
- # Если это URL, пытаемся его резолвить в IP
- ip_addresses=$(getent ahosts "$resource" | awk '$1 ~ /^[0-9]+\./ {print $1}' | sort -u)
- if [ -n "$ip_addresses" ]; then
- for ip_address in $ip_addresses; do
- echo "Удаляю маршрут для $ip_address"
- ip route del "$ip_address" 2>/dev/null
- done
- else
- echo "Не удалось резолвить $resource. Пропускаю."
- fi
- fi
- if [ -n "$ip_address" ]; then
- ip route del "$ip_address" 2>/dev/null
- fi
- done < "$INPUT_FILE"
- # Установка маршрутов для каждого ресурса из файла
- echo "Начинаю добавлять маршруты для ресурсов из $INPUT_FILE"
- while IFS= read -r resource; do
- # Проверяем, является ли ресурс IPv4
- if [[ $resource =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
- ip_addresses=$resource
- echo "Обрабатываю IP: $resource"
- else
- # Если это URL, пытаемся его резолвить в IP
- echo "Пытаюсь резолвить URL: $resource"
- ip_addresses=$(getent ahosts "$resource" | awk '$1 ~ /^[0-9]+\./ {print $1}' | sort -u)
- # Если не удается резолвить, выводим ошибку
- if [ -z "$ip_addresses" ]; then
- echo "Не удалось резолвить $resource. Проверьте подключение к сети или DNS"
- continue
- fi
- echo "URL $resource резолвится в IP: $ip_addresses"
- fi
- # Обрабатываем каждый IP-адрес, связанный с ресурсом
- for ip_address in $ip_addresses; do
- echo "Обрабатываю IP $ip_address для $resource"
- # Проверяем, существует ли уже маршрут для этого 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
- 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
- # ip route show
- # Пример resources.txt:
- # 8.8.8.8
- # google.com
- # facebook.com
- # 192.168.1.100
- # Пример вывода:
- # VPN-соединение не найдено. Создаю эмуляцию VPN через интерфейс vpn0
- # Дефолтный маршрут через vpn0 не найден
- # Проверяю доступность интернета через eth0
- # Интернет доступен через eth0
- # Активный физический интерфейс: eth0
- # Удаляю маршруты для ресурсов из resources.txt
- # Удаляю маршрут для 216.239.32.10
- # Удаляю маршрут для 216.239.34.10
- # Удаляю маршрут для 216.239.36.10
- # Удаляю маршрут для 216.239.38.10
- # Удаляю маршрут для 216.58.211.14
- # Удаляю маршрут для 129.134.30.12
- # Удаляю маршрут для 129.134.31.12
- # Удаляю маршрут для 157.240.205.35
- # Удаляю маршрут для 185.89.218.12
- # Удаляю маршрут для 185.89.219.12
- # Начинаю добавлять маршруты для ресурсов из resources.txt
- # Обрабатываю IP: 8.8.8.8
- # Обрабатываю IP 8.8.8.8 для 8.8.8.8
- # Добавляю маршрут для 8.8.8.8 через vpn0
- # Пытаюсь резолвить URL: google.com
- # URL google.com резолвится в IP: 216.239.32.10
- # 216.239.34.10
- # 216.239.36.10
- # 216.239.38.10
- # 216.58.211.14
- # Обрабатываю IP 216.239.32.10 для google.com
- # Добавляю маршрут для 216.239.32.10 через vpn0
- # Обрабатываю IP 216.239.34.10 для google.com
- # Добавляю маршрут для 216.239.34.10 через vpn0
- # Обрабатываю IP 216.239.36.10 для google.com
- # Добавляю маршрут для 216.239.36.10 через vpn0
- # Обрабатываю IP 216.239.38.10 для google.com
- # Добавляю маршрут для 216.239.38.10 через vpn0
- # Обрабатываю IP 216.58.211.14 для google.com
- # Добавляю маршрут для 216.58.211.14 через vpn0
- # Пытаюсь резолвить URL: facebook.com
- # URL facebook.com резолвится в IP: 129.134.30.12
- # 129.134.31.12
- # 157.240.205.35
- # 185.89.218.12
- # 185.89.219.12
- # Обрабатываю IP 129.134.30.12 для facebook.com
- # Добавляю маршрут для 129.134.30.12 через vpn0
- # Обрабатываю IP 129.134.31.12 для facebook.com
- # Добавляю маршрут для 129.134.31.12 через vpn0
- # Обрабатываю IP 157.240.205.35 для facebook.com
- # Добавляю маршрут для 157.240.205.35 через vpn0
- # Обрабатываю IP 185.89.218.12 для facebook.com
- # Добавляю маршрут для 185.89.218.12 через vpn0
- # Обрабатываю IP 185.89.219.12 для facebook.com
- # Добавляю маршрут для 185.89.219.12 через vpn0
- # Обрабатываю IP: 192.168.1.100
- # Обрабатываю IP 192.168.1.100 для 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
- # 129.134.30.12 dev vpn0 scope link
- # 129.134.31.12 dev vpn0 scope link
- # 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
- # 185.89.218.12 dev vpn0 scope link
- # 185.89.219.12 dev vpn0 scope link
- # 192.168.1.100 dev vpn0 scope link
- # 216.58.211.14 dev vpn0 scope link
- # 216.239.32.10 dev vpn0 scope link
- # 216.239.34.10 dev vpn0 scope link
- # 216.239.36.10 dev vpn0 scope link
- # 216.239.38.10 dev vpn0 scope link
- # Удаляю VPN-интерфейс vpn0
- # Скрипт завершён
Advertisement
Add Comment
Please, Sign In to add comment