Как маршрутизировать трафик с виртуальной машины VirtualBox только через VPN?

10

У меня есть VM VirtualBox (и Ubuntu Maverick, и хост, и гость). Мой провайдер VPN использует OpenVPN для настройки TUN. Я хотел бы настроить все так, чтобы трафик от виртуальной машины проходил только через VPN и просто сбрасывался, если VPN отключается (это произошло). Предложения? Мой iptables-fu немного слаб

То, что я пробовал: использовать VirtualBox «только для хоста», который дает вам петлевой интерфейс vboxnet0 на хосте для гостя, но не может правильно определить iptables / маршруты. Я бы хотел избежать NAT на ВМ, так как я уже использую двойной NAT (ISP и домашний маршрутизатор), и еще один уровень заставит меня задуматься.

Другие возможности: переход на TAP (как?) И переход на VM. Создание VPN внутри виртуальной машины и фильтрация всего трафика eth0, кроме VPN-соединения с iptables (но см. Ниже)

Бонусные баллы: если вы можете сказать мне, как использовать разные точки выхода VPN на хосте и госте без двойного туннелирования трафика от гостя через VPN хоста.

pfein
источник

Ответы:

4

Будут и другие решения, но вот о чем я думаю:

  1. Настройте виртуальную машину в режиме моста. Это даст вашей виртуальной машине IP-адрес в той же сети, что и ваш хост.
  2. Настройте VPN на хосте, скажем, это tun0.
  3. Включить маршрутизацию на хосте echo 1 > /proc/sys/net/ipv4/ip_forward
  4. Настройте виртуальную машину с IP-адресом хоста в качестве gw по умолчанию.

На этом этапе хост имеет VPN-соединение, и виртуальная машина направит весь трафик на хост. Все, что осталось сделать, это ограничить хост, чтобы он не позволял гостю направлять любой трафик, который не будет проходить через устройство tun0. Вы можете сделать это с помощью набора правил iptables примерно так:

iptables -P FORWARD DROP
iptables -A FORWARD -o tun0 -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

Это должно работать. Первое правило устанавливает политику по умолчанию для пакетов DROP в цепочке FORWARD. Это влияет только на пакеты, которые ваш хост будет маршрутизировать, а не пакеты на хост (INPUT) или с хоста (OUTPUT). Второе правило разрешает любой трафик, который направляет tun0 - вы можете усилить это с --source, если хотите. И последнее правило должно позволять ответам возвращаться из tun0 для маршрутизации обратно на ВМ.

Будет ли ваша VPN ожидать, что все пакеты на интерфейсе tun будут с одного IP? Если это так, вы также захотите добавить правило NAT. Вероятно, что-то вроде:

iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source {your host tun0 ip}
Grep
источник