Про 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> |