Вопрос или проблема
Хост: Ubuntu 20.04
Прокси-клиент и сервер: V2ray
Прокси-клиент подключен к серверу и доступен на хосте по адресу 127.0.0.1:10808 для Socks и 127.0.0.1:10809 для http.
Виртуальные машины: Несколько виртуальных машин, работающих на хосте с использованием qemu-kvm и libvirt
Моя цель: маршрутизировать весь трафик ВМ через прокси, работающий на хосте.
Ранее я мог использовать OpenConnect на хосте, и, так как это влияло на трафик всех машин (думаю), это решало все задачи. Но теперь мне приходится использовать V2Ray, и я не могу понять, как маршрутизировать весь трафик ВМ через прокси-клиент на хосте.
Когда я говорю “весь трафик”, я имею в виду, что мне удалось использовать стороннее программное обеспечение, такое как v2raya, которое имеет опции, такие как системный прокси и ip-переадресация. Это влияло на браузер в ВМ, но при использовании команды dig
для проверки публичного IP ВМ, например: dig +short myip.opendns.com @resolver1.opendns.com
, это не влияло. Мне нужно не настраивать ВМ ВООБЩЕ!
Я пробовал iptables, но я совсем новичок в сетевых технологиях и думаю, что делаю что-то неправильно.
Вот что я пробовал:
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.conf.all.forwarding=1
sysctl -w net.ipv4.conf.all.send_redirects=0
iptables -t nat -A PREROUTING -i virbr0 -p tcp --dport 80 -j REDIRECT --to-port 10809
iptables -t nat -A PREROUTING -i virbr0 -p tcp --dport 443 -j REDIRECT --to-port 10809
ip6tables -t nat -A PREROUTING -i virbr0 -p tcp --dport 80 -j REDIRECT --to-port 10809
ip6tables -t nat -A PREROUTING -i virbr0 -p tcp --dport 443 -j REDIRECT --to-port 10809
virbr0 – это сетевая интерфейс, автоматически создаваемый libvirt при установке и выполняющий сетевые функции для ВМ (назначение IP и т.д.).
Что мне делать? Я также открыт для любых предложений, которые могут сработать.
Спасибо
Шаг 1: Включите IP-переадресацию
Сначала убедитесь, что IP-переадресация включена как для IPv4, так и для IPv6:
bash
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1
Сделайте эти настройки постоянными, добавив их в /etc/sysctl.conf:
bash
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding = 1" | sudo tee -a /etc/sysctl.conf
Шаг 2: Настройка iptables для прокси V2Ray
Вам нужно переадресовать весь исходящий трафик с ВМ на локальный прокси V2Ray. Вот как это можно сделать для всего трафика:
bash
# Очистите существующие правила, чтобы они не мешали
sudo iptables -F
sudo iptables -t nat -F
# Переадресуйте весь исходящий TCP-трафик на порт V2Ray Socks (10808)
sudo iptables -t nat -A PREROUTING -i virbr0 -p tcp -j REDIRECT --to-port 10808
# Для HTTP и HTTPS вы можете специально их переадресовать при необходимости:
# sudo iptables -t nat -A PREROUTING -i virbr0 -p tcp --dport 80 -j REDIRECT --to-port 10809
# sudo iptables -t nat -A PREROUTING -i virbr0 -p tcp --dport 443 -j REDIRECT --to-port 10809
# Если вы хотите переадресовать UDP, что менее распространено для веба, но может потребоваться для DNS:
# sudo iptables -t nat -A PREROUTING -i virbr0 -p udp -j REDIRECT --to-port 10808
# Разрешите трафик в обход (так как V2Ray работает на локальном хосте)
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
# Убедитесь, что вы можете все еще получить доступ к хосту с ВМ:
sudo iptables -A FORWARD -i virbr0 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o virbr0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Выполните маскарадинг трафика, чтобы он выглядел как исходящий от хоста
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Шаг 3: Настройка IPv6
Для IPv6 применяются аналогичные правила:
bash
# Очистите существующие правила IPv6
sudo ip6tables -F
sudo ip6tables -t nat -F
# Переадресуйте весь исходящий TCP-трафик на порт V2Ray HTTP для IPv6
sudo ip6tables -t nat -A PREROUTING -i virbr0 -p tcp -j REDIRECT --to-port 10809
# Разрешите в обход и для IPv6
sudo ip6tables -A INPUT -i lo -j ACCEPT
sudo ip6tables -A OUTPUT -o lo -j ACCEPT
# Правила переадресации для IPv6
sudo ip6tables -A FORWARD -i virbr0 -o eth0 -j ACCEPT
sudo ip6tables -A FORWARD -i eth0 -o virbr0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Маскарадинг для IPv6
sudo ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Ответ или решение
Для того чтобы маршрутизировать весь трафик виртуальных машин (VM) через прокси-сервер V2Ray, работающий на хосте Ubuntu 20.04, необходимо выполнить определенные настройки в вашей системе. Опишем детально процесс и необходимые шаги для достижения вашей цели.
Введение
Хост: Ubuntu 20.04
Прокси-сервер и клиент: V2Ray, доступный через 127.0.0.1:10808 для Socks и через 127.0.0.1:10809 для HTTP.
Виртуальные машины: Запущены на хосте при помощи qemu-kvm и libvirt.
Цель: Маршрутизировать весь трафик ВМ через прокси V2Ray на хосте без необходимости конфигурации самих виртуальных машин.
Шаг 1: Включение IP-маршрутизации
Для начала убедитесь, что в вашей системе включена IP-маршрутизация для IPv4 и IPv6:
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1
Эти параметры следует сделать постоянными, добавив их в файл /etc/sysctl.conf
:
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding = 1" | sudo tee -a /etc/sysctl.conf
Шаг 2: Настройка iptables для прокси V2Ray
Нам необходимо перенаправить весь исходящий трафик от ВМ на локальный прокси V2Ray.
- Очистите существующие правила, чтобы они не мешали:
sudo iptables -F
sudo iptables -t nat -F
- Настройте перенаправление всего исходящего TCP-трафика на порт 10808, используемый для V2Ray Socks:
sudo iptables -t nat -A PREROUTING -i virbr0 -p tcp -j REDIRECT --to-port 10808
- Разрешите трафик через интерфейс loopback, так как V2Ray работает на localhost:
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
- Обеспечьте доступ к хосту с ВМ:
sudo iptables -A FORWARD -i virbr0 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o virbr0 -m state --state ESTABLISHED,RELATED -j ACCEPT
- Настройте маскарадинг (скрытие исходных IP-адресов) трафика:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Шаг 3: Настройка IPv6
Настройка для IPv6 выполняется аналогично:
- Очистите существующие правила для IPv6:
sudo ip6tables -F
sudo ip6tables -t nat -F
- Перенаправьте весь исходящий TCP-трафик для IPv6 на порт 10809:
sudo ip6tables -t nat -A PREROUTING -i virbr0 -p tcp -j REDIRECT --to-port 10809
- Разрешите трафик для loopback и настройте правила форвардинга для IPv6.
Эти действия обеспечат маршрутизацию всего трафика виртуальных машин через прокси-сервер, работая исключительно на стороне хоста, без необходимости внесения изменений в конфигурацию самих ВМ.
Заключение
Следуя шагам, описанным выше, вы сможете эффективно маршрутизировать весь сетевой трафик ваших виртуальных машин через V2Ray. Особое внимание пока настраивались правила iptables и обеспечивалась поддержка как IPv4, так и IPv6. Это особенно важно для того, чтобы вся сеть работала прозрачно и без перебоев.