После установки VirtualBox и web-морды к нему выполняем настройки, чтобы обеспечить удобство использования этой связки. Первым делом создаем виртуальную сеть, в которой будут работать виртуальные машины. VBox из коробки предоставляет возможность создать сеть vboxnet и даже может выдавать в ней IP адреса. Первое нам пригодится, а вот второе мы будем выполнять за него самостоятельно, использую для этого dnsmasq
Для этого заходим в Файл-Настройки-Сеть-Виртуальные сети хоста и создаем новую сеть. У меня это vboxnet0
Нужно снять птичку с включить DHCP-сервер, выключить его.
# устанавливаем dnsmasq cd /usr/ports/dns/dnsmasq make install clean sysrc dnsmasq_enable="YES" # echo 'conf-dir=/usr/local/etc/dnsmasq.d' >> /usr/local/etc/dnsmasq.conf mkdir /usr/local/etc/dnsmasq.d
nano /usr/local/etc/dnsmasq.d/vbox.conf
dhcp-range=set:vboxnet0, 192.168.56.2, 192.168.56.50, 255.255.255.0, 10m dhcp-option=tag:vboxnet0, option:netmask, 255.255.255.0 dhcp-option=tag:vboxnet0, option:router, 192.168.56.1 dhcp-option=tag:vboxnet0, option:dns-server, 192.168.56.1 dhcp-option=tag:vboxnet0, option:ntp-server, 192.168.56.1 log-facility=/var/log/dnsmasq.log interface=vboxnet0 # CloudFlare server=1.1.1.1 server=1.0.0.1 # OpenDNS server=208.67.222.222 server=208.67.220.220 # Google server=8.8.8.8 server=8.8.4.4 # Настройки VM dhcp-host=08:00:27:c0:12:1e, app, 192.168.56.10, 30d,set:vboxnet0 address=/app/192.168.56.10 address=/app.local/192.168.56.10
В данном конфиге нас интересуют только последние три строки. В первой мы указываем MAC виртуалки и IP, который хотим ей присвоить. После создания VM нужно вписать сюда по аналогии. Две другие строки - для задания hostname виртуалке, которое будет доступно в данной локальной сети. Например: mysql, app, redis и т.п.
lsof -i :67 -P COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME dnsmasq 2115 nobody 4u IPv4 0xfffff801036345d0 0t0 UDP *:67
Обращаю пристальное внимание на то, что по-умолчанию VBox создает виртуалки за NAT, который он организовывает сам. Поскольку у нас собственная локальная сеть на vboxnet0, то создавать свои виртуалки мы будем на ней и NAT нам нужно теперь организовать самостоятельно.
Начнем использовать ipfw kernel NAT, который нужно включить во FreeBSD. Действуем внимательно, так как при ошибках в конфиге можно легко потерять доступ к серверу по SSH
# Включаем Русский язык sysrc keymap="ru" tee -a /boot/loader.conf << END # RUS kern.vty=vt #-- END tee -a /etc/profile << END # RUS LANG=ru_RU.UTF-8 export LANG MM_CHARSET=UTF-8 export MM_CHARSET export EDITOR=/usr/local/bin/nano #-- END
tee -a /boot/loader.conf << END # IPFW ipfw_load="YES" ipfw_nat_load="YES" firewall_logif="YES" #-- END # включаем FreeBSD, как шлюз - разрешаем ходить трафику между интерфейсами sysrc gateway_enable="YES"
#!/bin/sh cmd="/sbin/ipfw -q" $cmd -f flush $cmd enable one_pass $cmd add allow all from any to any via lo0 $cmd add deny all from any to 127.0.0.0/8 $cmd add deny all from 127.0.0.0/8 to any $cmd add deny all from any to any frag $cmd add check-state $cmd add allow tcp from any to any established $cmd add allow all from any to any out keep-state # ssh $cmd table admin create missing $cmd table admin add 46.160.0.0/19 $cmd add allow ip from "table(admin)" to me 22 # HTTP && HTTPS $cmd add allow tcp from any to me 443 in limit src-addr 50 $cmd add allow tcp from any to me 80 in limit src-addr 20 # Mail $cmd add allow tcp from me to any 25 out $cmd add allow tcp from any 25 to me in # Ping $cmd add allow icmp from "table(admin)" to me in icmptype 8 $cmd add allow icmp from me to "table(admin)" out icmptype 0,8 $cmd add deny log all from any to any
sysrc firewall_script="/etc/ipfw.script" sysrc firewall_enable="yes"