Hello,
In testing, I have gotten this setup to work by manually completing the
necessary steps; however, I am now looking to have everything completed
automatically so as to ensure my setup persists over a reboot.
Firstly, an outline of what I am doing:
* I have a Gentoo VM running at home, functioning as my firewall/router, which
works perfectly fine.
* Said VM has established an IPSEC tunnel to a dedicated server using OpenSWAN.
This also works perfectly fine.
* A tun0 interface is created on both devices, setting up an IPIP PPP tunnel
that sits on top of the IPSEC tunnel.
* Firewall and Routing rules are in place to perform policy-based routing over
this tun0 interface. This again, works perfectly fine.
For the rest, the following configuration is worth noting:
* The dedicated server is running CentOS 6, not that this is of necessary
import for this configuration.
* 172.18.0.1 resides on the dedicated server.
* 10.0.0.1 is the management IP of my Gentoo VM, and serves as its identity as
well.
* 172.18.1.0/24 is the network utilized for the tunnel, with 172.18.1.1 on the
dedicated server, and 172.18.1.2 on the Gentoo VM.
In effect, the first thing I need to do, is automate the IPIP PPP tunnel setup
so that the device can persist over a reboot. I can create it manually right
now, no problem, with the following command strings:
# ip tunnel add tun0 mode ipip remote 172.18.0.1 local 10.0.0.1
# ip addr add 172.18.1.2/24 dev tun0
# ip link set tun0 mtu 1500
# i p link set tun0 up
This all works perfectly fine, and tun0 is created after running the first
command. Now I need this to persist a reboot. I wanted to handle this through
OpenRC, since I can then do dependency resolution, and make sure the tunnel
comes up only if the IPSEC tunnel is up and running. That being said, I added
the following to /etc/conf.d/net:
link_tun0="ipsec0"
config_tun0="172.18.1.2 netmask 255.255.255.0 brd 172.18.1.255"
dns_servers_tun0="10.0.1.2"
routes_tun0=(
"64.20.39.38/32 via 172.18.1.1"
"default via 172.18.1.1 table ipsec"
)
mtu_tun0="1500"
iptunnel_tun0_remote="172.18.0.1"
iptunnel_tun0_local="10.0.0.1"
iptunnel_tun0_mode="ipip remote ${iptunnel_tun0_remote} local
${iptunnel_tun0_local} dev ${link_tun0}"
rc_net_tun0_need="ipsec"
preup() {
# If the link does not exist, return now, it's a tunnel!
ip link show dev ${IFACE} 2>/dev/null || return 0
}
Now, the configuration does reflect an additional item not in my original
setup, which links tun0 to the ipsec0 interface. I've tested with and without
this, and it doesn't work. Attempting to bring up the interface using
rc-service results in the following error:
Cannot find device "tun0"
* ERROR: interface tun0 does not exist
* Ensure that you have loaded the correct kernel module for your hardware
* ERROR: net.tun0 failed to start
I could easily script all this out, and probably call it through rc.local, but
I'd rather be able to utilize the dependency resolution to make sure all the
necessary components are up.
Any insights on getting it to behave?
Michael Hill