Проброс реального IP в VirtualBox VM

После установки VirtualBox в Debian подобных системах иногда требуется пробросить реальный IP на виртуальную машину. Сама установка VirtualBox и веб-морды к нему подробно описана и чаще всего проблем не вызывает. Особенно, если пользоваться замечательным скриптом для установки, подробно описанного здесь
На самом деле проблема проброса дополнительного внешнего IP не такая сложная, как кажется.

Довольно часто ДЦ предоставляются дополнительные IP адреса с маской 255.255.255.255. Шлюзом для всех дополнительных IP в таких случаях выступает основной IP сервера или шлюз основного IP.
0.Естественно, перво-наперво нужно разрешить форвард пакетов с одного интерфейса на другой в sysctl и включить на сервере маскарадинг сетевой карты, смотрящей в интернет:

# Разрешает форвард пакетов с интерфейсов
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sysctl -p
# Маскарадинг сетевой карты
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Далее я действую так:
1. В настройках сети VirtualBox (File->Preferences->Network) я добавляю Host-only Networks сеть vboxnet0
2. В настройках сети сервера в файле /etc/network/interfaces добавляю маршруты в сеть vboxnet0 на дополнительные IP машин:

up /sbin/ip route add 85.25.79.XX/32 dev vboxnet0
up /sbin/ip route add 85.25.107.XX/32 dev vboxnet0

3. В настройках виртуальной машины выбираем тип соединения Attached to: Host-Only Adapter и указываем тип Name:vboxnet0 После старта сети внутри виртуальной машины необходимо обязательно указать шлюзом IP 192.168.56.1, иначе интернет не работает на виртуалке.
4. Дополнительный внешний IP адрес добавляю на интерфейс виртуалки алиасом с маской сети 255.255.255.255, например:

# Через ip
ip address add 85.25.107.XXX/32 dev enp0s3
# Или через ifconfig
ifconfig enp0s3:0 inet 85.25.107.XXX netmask 255.255.255.255

Для добавления IP адресов при перезагрузке виртуалки удобно использовать скрипт:

#!/bin/bash
# Укажите через пробел IP адреса для добавления на сеть виртуальной машины:
IPs="85.25.79.XX 85.25.157.XX"
Укажите имя сетевой карты, на которой будет работать внешний IP (например eth0)
IFACE="enp0s3"
 
/bin/sleep 29
 
LOG="/var/log/mylogs.log"
 
date > $LOG
 
GW=$(/sbin/ifconfig | /bin/grep -A 1 $IFACE | /bin/grep -w "inet" | /usr/bin/head -1 | /usr/bin/awk '{print $2}'| /usr/bin/awk -F. -v OFS="." '{print $1,$2,$3,"1"}')
 
echo "$GW" >> $LOG
 
/sbin/route add default gw $GW >> $LOG 2>> $LOG
I=0
for IP in $IPs ; do
        /sbin/ifconfig $IFACE:$I inet $IP  netmask 255.255.255.255 broadcast $IP >> $LOG 2>> $LOG
#       /sbin/ip address add $IP/32 dev $IFACE
        ((I++))
done

Этот скрипт можно добавить в крон с паузой при загрузке:
@reboot /bin/sleep 29; /bin/bash /root/addIP.sh
Каждый раз после перезагрузки скрипт будет поднимать IP на интерфейсе виртуалки. Я рекомендую использовать именно ifconfig для добавления адресов на интерфейсы. Некоторое ПО (например, панель VestaCP) некорректно работают с IP, добавленными через ip address add
PS
Важное замечание. Знатоки утверждают, что вместо маскарадинга на сервере следует использовать SNAT, якобы он существенно быстрее работает. Его можно использовать вот так:

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.56.101

Мне удобство использования этого способа кажется сомнительным, так как требуется писать кучу правил для каждой виртуалки отдельно, об этом можно забыть спустя некоторое время и потом долго удивляться, почему нет интернета на виртуалке )). Кроме того, нет уверенности, что скорость интернета существенно возрастет..

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *