# LPIC-3 334.4: Virtual private networks
A WireGuard tunnel, an OpenVPN tunnel with its own PKI, and an IPsec
connection, between this VM as the server and the peer as the client.
OpenVPN and strongSwan need an extra repository on the RHEL family, so
this lab runs on Ubuntu only.
## Before you start
The peer, at `10.99.0.2` (name `peer`), is the VPN client. It sits on this
VM's second network, `10.99.0.0/24`, where this VM is `10.99.0.1` on
interface `le-host`. It shares this VM's files and programs, so there is
nothing to copy over the network: write the client's files where the
tasks say, and the lab's units start the client in the peer.
- `le-lab-peer-wg.service` runs `wg-quick up` in the peer with
`/etc/netns/lepeer/wireguard/wg0.conf`. (In a peer shell, made with
`sudo ip netns exec lepeer bash`, that file is `/etc/wireguard/wg0.conf`.)
- `le-lab-peer-openvpn.service` runs OpenVPN in the peer with
`/etc/netns/lepeer/openvpn/lab.conf`.
- `le-lab-peer-ipsec.service` already runs strongSwan in the peer, with
its side of the IPsec connection set up: IKEv2 from `10.99.0.2` to
`10.99.0.1`, its own ID `peer`, your ID `server`, the pre-shared key
`lab-ipsec-psk-for-testing-only`, proposals
`aes256gcm16-prfsha256-ecp256` (IKE) and `aes256gcm16-ecp256` (ESP),
transport mode, started by traffic (`trap`). Its configuration is in
`/etc/le-lab-peer-ipsec/`.
The firewall, if it's running, is yours to open. Keep your PKI and keys
under `/root/vpn`.
## Tasks
1. Install `wireguard-tools`, `openvpn` and `easy-rsa` (setup installed
strongSwan already, for the peer). Make WireGuard keys for both ends,
private keys straight into files, never shown. Bring up `wg0` here,
`10.40.0.1/24` on port 51820, with the peer allowed as `10.40.0.2/32`,
from `/etc/wireguard/wg0.conf` readable by root only, and make it start
at boot. Write the client configuration (`10.40.0.2/24`, endpoint
`10.99.0.1:51820`, allowed `10.40.0.0/24`, a keepalive), and enable and
start `le-lab-peer-wg.service`. The peer must reach `10.40.0.1`.
2. Build an OpenVPN PKI with easy-rsa in `/root/vpn/ca`: a CA, a server
certificate `server` and a client certificate `peer`, and a
`tls-crypt` key. Run a routed server, `openvpn-server@lab`, on UDP port
1194 for `10.8.0.0/24` (subnet topology, no DH parameters, dropping
privileges to `nobody`), enabled at boot.
3. Write the client's configuration with everything inline (CA,
certificate, key and `tls-crypt` key), checking that the server's
certificate is a server certificate, and enable and start
`le-lab-peer-openvpn.service`. The peer must reach `10.8.0.1`.
4. Set up this VM's side of the IPsec connection with swanctl to match the
peer's, in `/etc/swanctl/conf.d/`, load it, and bring it up. Traffic
between `10.99.0.1` and `10.99.0.2` must then travel as ESP.
## Hints
- `wg genkey | tee KEY | wg pubkey > PUB`, `umask 077`; `[Interface]`
(`Address`, `ListenPort`, `PrivateKey`) and `[Peer]` (`PublicKey`,
`AllowedIPs`, `Endpoint`, `PersistentKeepalive`);
`systemctl enable --now wg-quick@wg0`, `wg show`.
- `make-cadir`, `EASYRSA_BATCH=1 ./easyrsa init-pki`, `build-ca nopass`,
`build-server-full server nopass`, `build-client-full peer nopass`;
`openvpn --genkey secret ta.key`. Files in `/etc/openvpn/server/`:
`server 10.8.0.0 255.255.255.0`, `topology subnet`, `dh none`,
`tls-crypt ta.key`, `user nobody`, `group nogroup`.
- `client`, `dev tun`, `remote 10.99.0.1 1194`, `remote-cert-tls server`,
then `...`, ``, ``, `` blocks.
`journalctl -u le-lab-peer-openvpn`.
- `connections { NAME { version = 2; local_addrs; remote_addrs;
proposals; local { auth = psk; id = server } remote { ... } children {
NAME { mode = transport; esp_proposals; start_action = trap } } } }` and
`secrets { ike-NAME { id-a = server; id-b = peer; secret = "..." } }`;
`systemctl restart strongswan`, `swanctl --load-all`, `swanctl
--initiate --child NAME`, `swanctl --list-sas`, `ip xfrm policy`,
`tcpdump -ni le-host esp`.