If you plan to use an OpenVPN tunnel to reach your default gateway,
which would make the tun interface in the egress
group, and use
tun0
in your pf.conf
which is loaded before OpenVPN starts?
Here are the few tips I use to solve the problems.
Remove your current default gateway
We don’t want a default gateway on the system. You need to know
the remote address of the VPN server.
If you have a /etc/mygate
file, remove it.
The /etc/hostname.if
file (with if being your interface name,
like em0 for example), should look like this:
192.168.1.200
up
!route add -host A.B.C.D 192.168.1.254
- First line is the IP on my lan
- Second line is to make the interface up.
- Third line is means you want to reach
A.B.C.D
via 192.168.1.254
,
with the IP A.B.C.D
being the remote VPN server.
Create the tun0 interface at boot
Create a /etc/hostname.tun0
file with only up
as content,
that will create tun0
at boot and make it available to pf.conf
and you prevent it from loading the configuration.
You may think one could use “egress” instead of the interface name,
but this is not allowed in queuing.
Don’t let OpenVPN manage the route
Don’t use redirect-gateway def1 bypass-dhcp
from the OpenVPN
configuration, this will create a route which is not default
and
so the tun0 interface won’t be in the egress group, which is not
something we want.
Add those two lines in your configuration file, to execute
a script once the tunnel is established, in which we will make
the default route.
script-security 2
up /etc/openvpn/script_up.sh
In /etc/openvpn/script_up.sh
you simply have to write
#!/bin/sh
/sbin/route add -net default X.Y.Z.A
If you have IPv6 connectivity, you have to add this line:
/sbin/route add -inet6 2000::/3 fe80::%tun0
(not sure it’s 100% correct for IPv6 but it works fine for me! If
it’s wrong, please tell me how to make it better).