Магия

Прячем виртуальный хост в малиновый пирог

МагияПро OpenVPN написано уже довольно дофига. И даже мной. Но вот возникла необходимость сделать ВЖУХ.


Итак:
Сервер на Raspberry-pi, eth0 в мост с tap1
Клиент на libvirt хост, VPN поднимает хост, отдает мостом (br1 tap1) гостю. Гость прозрачно сидит в локальной сети, про VPN не знает.
Можно отключить гостю virbr0, тогда он еще и в интернет ходить будет через впн. Такая вот петрушка.
Имеем — без малинки сервера нет, но малинка сама по себе не знает откуда он берется, изучать её на в другом месте или при выключенном VPN-клиенте бессмыслительно. Еще логи в /dev/null переправить и предусмотреть аварийное выключение VPN клиента.
А еще порт понестандартнее и ваще огонь.
Конфиги чуть внизу.

Keys generation:

$ sudo apt-get install easy-rsa
$ make-cadir keys_dir && cd keys_dir
$ vim vars 
$ source ./vars
$ ./build-dh
$ ./build-ca
$ ./build-key-server server
$ ./build-key client
$ openvpn --genkey --secret ta.key

Server config

port 1194
proto udp
dev tap1
cert /etc/openvpn/server.crt
key  /etc/openvpn/server.key
dh   /etc/openvpn/dh2048.pem
ca   /etc/openvpn/ca.crt
tls-auth /etc/openvpn/ta.key 0 
server-bridge nogw  # не подменять шлюз выданный через DHCP, я с этой хернёй полчаса бился, а RTFM
client-to-client
duplicate-cn
keepalive 10 120
comp-lzo
persist-key
persist-tun
log        /var/log/openvpn.log
verb 0
sndbuf 393216 # хер знает, но вроде бы с таким буфером побыстрее
rcvbuf 393216
push "sndbuf 393216"
push "rcvbuf 393216"
cipher camellia-128-cbc # AES-128 на R-Pi работает в два раза тормознее, один хер - пока не ломается.
auth sha1

Client config (bridge)

client
dev tap1
proto udp
remote ip.add.here 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/client/ca.crt
dh /etc/openvpn/dh2048.pem
cert /etc/openvpn/client/client.crt
key /etc/openvpn/client/client.key
tls-auth /etc/openvpn/client/ta.key 1
ns-cert-type server
comp-lzo
verb 0
log /var/log/openvpn_client.log
cipher camellia-128-cbc
auth sha1

Отключим DHCPCD на eth0 интерфейсе (/etc/dhcpcd.conf):

    denyinterfaces eth0

Interfaces, server:

auto br1
iface br1 inet dhcp
#iface br1 inet static        # если вдруг DHCP нет
#  address 192.168.0.2
#  netmask 255.255.255.0
#       если не указать адрес - может меняться 
#       и DHCP будет насиловать мозг
        hwaddress ether 01:02:03:04:05:06  
    bridge_ports eth0 tap1  # объединяем порты VPN и локальный
    bridge_stp off
    bridge_fd 0
    bridge_maxwait 0
    pre-up openvpn --mktun --dev tap1
    post-down openvpn --rmtun --dev tap1

Interfaces, client:

auto br1
iface br1 inet manual
    bridge_ports tap1   # Остальные порты подключит libvirt
    pre-up openvpn --mktun --dev tap1
    post-down openvpn --rmtun --dev tap1
    bridge_stp off
    bridge_fd 0

libvirt client host interface:

<interface type='bridge'>
      <source bridge='br1'/>
      <model type='virtio'/>
</interface>