Building a WireGuard jail with FreeBSD's standard tools
genneko.github.io
genneko.github.io
But it's far, far easier to just fire up an sshd somewhere and 'sshuttle' makes it possible to turn any ssh server that you have a login on into a VPN endpoint:
https://sshuttle.readthedocs.io/en/stable/
You don't even need to be a privileged user - just any old user login, over ssh, and you need python to exist on the remote system.
I use sshuttle for situations where I don’t have root on a jumphost or only need the tunneling sometimes.
https://blog.jessfraz.com/post/containers-zones-jails-vms/
It is great article.
Bottom line, jails are "in kernel" primitives. Containers are not (or at least they werent when I last checked).
Docker adds packaging and distribution, but the hard work is in kernel.
Quote: "Again, containers were not a top level design, they are something we build from Linux primitives. Zones, Jails, and VMs are designed as top level isolation."
You could NAT IPv6 to use the model as-is, but you could also re-do the model to not need NAT but still use wireguard to get through an ACL state which protects your boundary.
A tap interface can be used by software to make ethernet traffic appear on an interface, i.e. software can write to a tap interface to simulate ethernet traffic being received on that interface, and an application can receive ethernet traffic from it. From the manpage [1]: "A write(2) call passes an Ethernet frame in to be "received" on the pseudo-interface. Each write() call supplies exactly one frame; the frame length is taken from the amount of data provided to write()."
[0]: https://www.freebsd.org/cgi/man.cgi?query=epair&sektion=4&ma... [1]: https://www.freebsd.org/cgi/man.cgi?query=tap&sektion=4&manp...
And, I don't really get why wg-jail also needs default-router to be pointed to bridge0 when the author addms epair-b to bridge0 on the host (which file are the following lines added to anyway?):
----
cloned_interfaces="bridge0 epair0"
ifconfig_bridge0="inet 192.168.20.1/24 addm epair0b up"
ifconfig_epair0b="up"
----
And the explicit default-router definition for wg-jail, in vm/wg/etc/rc.conf:
----
defaultrouter="192.168.20.1"
----
The epair0 interfaces provide the layer 2 (Ethernet) connection between the jail and the host. The jail still needs a default IPv4 (layer 3) gateway so that it can route the traffic coming fron the WireGuard clients back out to the network/Interet (same as any other "router").
(Note: With just a single jail -- such as in this case -- the bridge0 interface isn't actually necessary (and the 192.168.20.1 address would then be assigned to the epair0b, not bridge0, interface on the host). The author went ahead and created a bridge with the intention to create additional jails in the future. This way, multiple jails can all be connected to the same internal "jail network". This is all mentioned in TFA, by the way.)
> which file are the following lines added to anyway?
cloned_interfaces="bridge0 epair0"
ifconfig_bridge0="inet 192.168.20.1/24 addm epair0b up"
ifconfig_epair0b="up"
Those go in /etc/rc.conf on the host. defaultrouter="192.168.20.1"
This goes in /etc/rc.conf on the jail (which corresponds to /vm/wg/etc/rc.conf on the host).I am not familiar with Linux containers, but I read that FreeBSD jails are much, much different from them. As for chroot, it still plays crucial role in FreeBSD jail implementation.
This oversimplifies. The kernel is the same in the jail and the host. But FreeBSD has a Linux syscall emulation layer, and you can definitely install a Linux userspace in a jail and run essentially Linux-but-the-kernel in the jail.
Server is an HP Microserver with an Intel Xeon E3-1265L V2 @ 2.50GHz running FreeBSD 12.1. Client is a custom build with an Intel Core i7-4790K @ 4.00GHz running NixOS 20.03.
$ ip route show
default via 192.168.0.1 dev eno1 proto dhcp src 192.168.0.4 metric 203
192.168.0.0/24 dev eno1 proto dhcp scope link src 192.168.0.4 metric 203
192.168.1.0/24 dev wg0 scope link
$ iperf3 -c 192.168.0.2 # no vpn
Connecting to host 192.168.0.2, port 5201
[ 5] local 192.168.0.4 port 37382 connected to 192.168.0.2 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 115 MBytes 961 Mbits/sec 0 571 KBytes
[ 5] 1.00-2.00 sec 111 MBytes 929 Mbits/sec 0 571 KBytes
[ 5] 2.00-3.00 sec 112 MBytes 939 Mbits/sec 0 571 KBytes
[ 5] 3.00-4.00 sec 111 MBytes 929 Mbits/sec 0 571 KBytes
[ 5] 4.00-5.00 sec 112 MBytes 938 Mbits/sec 0 571 KBytes
[ 5] 5.00-6.00 sec 111 MBytes 929 Mbits/sec 0 571 KBytes
[ 5] 6.00-7.00 sec 112 MBytes 938 Mbits/sec 0 571 KBytes
[ 5] 7.00-8.00 sec 112 MBytes 938 Mbits/sec 0 571 KBytes
[ 5] 8.00-9.00 sec 111 MBytes 929 Mbits/sec 0 571 KBytes
[ 5] 9.00-10.00 sec 112 MBytes 938 Mbits/sec 0 571 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 1.09 GBytes 937 Mbits/sec 0 sender
[ 5] 0.00-10.00 sec 1.09 GBytes 934 Mbits/sec receiver
iperf Done.
$ iperf3 -c 192.168.1.1 # vpn
Connecting to host 192.168.1.1, port 5201
[ 5] local 192.168.1.5 port 60358 connected to 192.168.1.1 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 108 MBytes 905 Mbits/sec 2 274 KBytes
[ 5] 1.00-2.00 sec 106 MBytes 890 Mbits/sec 0 274 KBytes
[ 5] 2.00-3.00 sec 107 MBytes 895 Mbits/sec 0 274 KBytes
[ 5] 3.00-4.00 sec 107 MBytes 895 Mbits/sec 0 289 KBytes
[ 5] 4.00-5.00 sec 107 MBytes 895 Mbits/sec 0 289 KBytes
[ 5] 5.00-6.00 sec 107 MBytes 896 Mbits/sec 0 290 KBytes
[ 5] 6.00-7.00 sec 104 MBytes 874 Mbits/sec 0 290 KBytes
[ 5] 7.00-8.00 sec 106 MBytes 885 Mbits/sec 0 290 KBytes
[ 5] 8.00-9.00 sec 105 MBytes 885 Mbits/sec 0 290 KBytes
[ 5] 9.00-10.00 sec 107 MBytes 896 Mbits/sec 0 290 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 1.04 GBytes 892 Mbits/sec 2 sender
[ 5] 0.00-10.00 sec 1.04 GBytes 891 Mbits/sec receiver
iperf Done.This is a very nice starting point for those interested: https://calomel.org/freebsd_network_tuning.html
I would naively expect that the default kernel settings for both Linux and FreeBSD would allow me to saturate a 1Gbit link in a LAN.
Anyway, this looks like one of those things I could go down the rabbit hole of tuning (so I'm not just copy-pasting swathes of configuration without understanding it), but this was just a quick demo which shows that: "basically, the userspace implementation isn't too slow".
And I do get a point of your test and I agree with the anecdotal conclusion :)
Running the defaults is a good place to start, but if you don't get the results you're seeking, the linked articles show a lot of settings that are worth looking at.
There are a lot of settings that are reasonable to tune for specific uses, which is why they're configurable. Knowing which ones to poke at first is a good thing.
[1]: Netgate is the company behind pfsense, a router/firewall distro of FreeBSD
A kernel space wireguard implementation and something like beehyve are the last 2 things I need to be able to start using fbsd a lot more.
It just started passing packets (ping) last week. It would have been at this point weeks ago, had Jason not baked his e-mail address into the handshake protocol. (Harumph.)