deploy multiple vnets with VIMAGE/VNET + Production Ready?

Michael Grimm trashcan at ellael.org
Thu Jun 2 18:24:46 UTC 2016


Sebastián Maruca via freebsd-jail <freebsd-jail at freebsd.org> wrote:

> Now we're talking about 10.3-HEAD wiht Jails+vnet... but then again, has anyone tried it? Roger, it seems you are thumbing up my challenge...
> But I guess i'll have to stick with netgraph instead epair/if_bridge because the later is not so documented as the first one…

Preamble: I switched to VNET+epair/if_bridge jails starting 10.2-STABLE, now 10.3-STABLE, and haven't seen any issues, sofar. Currently I do have 10 jails running, firewall is pf at the host, only. My servers are not big scaled ISP like, more small business-like, though. I am considering myself a hobby admin. 


Here's my configuration that may show you one way to get that running, but I am sure your will have to tweak it to your needs:

1) Jails have been created by ezjail in the past, thus they are still at ezjail's infrastructure. But I do no longer use ezjail for starting or stopping my jails due to ezjail's lack of dealing with VNET jails (yet). So I do still have fstab definitions in /etc for all jails, e.g.:

	/etc/fstab.www
		/path-to-your/jails/basejail /path-to-your/jails/www/basejail nullfs ro 0 0 

2) All external IPv4 or IPv6 addresses are NAT'ed or NAT66'ed to 10.1.1.x or fd00:dead:dead:beef::x

3) Networking regarding VNET jails defined in /etc/rc.conf:

	# set up one bridge interface
	cloned_interfaces="bridge0"

	# needed for default routes within jails
	ifconfig_bridge0="inet 10.1.1.254 netmask 255.255.255.0"
	ifconfig_bridge0_ipv6="inet6 fd00:dead:dead:beef::254 prefixlen 64"

4) Thus, jails are controlled by jail(8) (shown for 3 example jails):

	/etc/rc.conf
		———————————————BEGIN------------------------
		jail_enable="YES"
		jail_reverse_stop="YES"
		jail_list="dns www mail"
		———————————————-END————————————

	/etc/jail.conf:
		#
		# host dependent global settings
		#
		$ip6prefixLOCAL		 = "fd00:dead:dead:beef";
		
		#
		# global jail settings
		#
		host.hostname		 = "${name}";
		path			 = "/path-to-your/jails/${name}";
		mount.fstab		 = "/etc/fstab.${name}";
		exec.consolelog 	 = "/var/log/jail_${name}_console.log";
		vnet			 = "new";
		vnet.interface		 = "epair${jailID}b";
		exec.clean;
		mount.devfs;
		persist;
		
		#
		# network settings to apply/destroy during start/stop of every jail
		#
		exec.prestart		 = "sleep 2";
		exec.prestart		+= "ifconfig epair${jailID} create up";
		exec.prestart		+= "ifconfig bridge0 addm epair${jailID}a";
		exec.start		 = "/sbin/ifconfig lo0 127.0.0.1 up";
		exec.start		+= "/sbin/ifconfig epair${jailID}b inet ${ip4_addr}";
		exec.start		+= "/sbin/ifconfig epair${jailID}b inet6 ${ip6_addr}";
		exec.start		+= "/sbin/route add default -gateway 10.1.1.254";
		exec.start		+= "/sbin/route add -inet6 default -gateway ${ip6prefixLOCAL}::254";
		#exec.stop		 = "/sbin/route del default";
		#exec.stop		+= "/sbin/route del -inet6 default";
		exec.stop		+= "/bin/sh /etc/rc.shutdown";
		exec.poststop 		 = "ifconfig epair${jailID}a destroy";
		
		#
		# individual jail settings
		#
		mail {
			$jailID		 = 1;
			$ip4_addr	 = 10.1.1.1;
			$ip6_addr	 = ${ip6prefixLOCAL}::1/64;
			exec.start	+= "/bin/sh /etc/rc";
		}
		
		www {
			$jailID		 = 2;
			$ip4_addr	 = 10.1.1.2;
			$ip6_addr	 = ${ip6prefixLOCAL}::2/64;
			exec.start	+= "/bin/sh /etc/rc";
		}
		
		dns {
			$jailID		 = 3;
			$ip4_addr	 = 10.1.1.3;
			$ip4_addr_2	 = 10.1.1.4;
			$ip6_addr	 = ${ip6prefixLOCAL}::3/64;
			$ip6_addr_2	 = ${ip6prefixLOCAL}::4/64;
			exec.start	+= "/sbin/ifconfig epair${jailID}b inet  ${ip4_addr_2} alias";
			exec.start	+= "/sbin/ifconfig epair${jailID}b inet6 ${ip6_addr_2} alias";
			exec.start	+= "/bin/sh /etc/rc";
		}
		
	Now you can use "service jail" to start/stop your jails, e.g.:

		service jail stop 
		service jail restart dns
		service jail start dns mail

5) NOTE: I am refraining from restarting VNET jails the hard way as shown above, and I am using a similar approach as iocage, namely "soft restarts". As this functionality isn't available in 10.3-STABLE (IIRC) I am using a homemade shell script instead. This script has to be run *inside* a jail which can be triggered from the outside (still using ezjail-admin) by e.g.: "sudo ezjail-admin console -e '/usr/local/etc/_JAIL_SOFT_RESTART' www"

	#!/bin/csh
	
	#
	# restart jail services without removing jail and its network
	#
	
	#
	# global definitions
	#
	set LOGGER = "/usr/bin/logger -p user.info -t _JAIL_SOFT_RC"
	set RCDIR = "/usr/local/etc/rc.d"
	set TAB = "        "
	
	#
	# evaluate list of rc files in /usr/local/etc/rc.d
	#
	set RCFILES = `rcorder ${RCDIR}/* |& grep -v ^rcorder:`
	
	#
	# evaluate reverse order of RCFILES
	#
	set RCFILES_REVERSE = ""
	foreach rcname ( ${RCFILES} )
		set RCFILES_REVERSE = "${rcname} ${RCFILES_REVERSE}"
	end
	
	#
	# stop rc services
	#
	echo "stopping:"
	foreach rcname ( ${RCFILES_REVERSE} )
		${LOGGER} stopping ${rcname}
		${rcname} stop >& /dev/null
		echo "${TAB}" ${rcname}
	end
	
	#
	# start rc services
	#
	echo "starting:"
	foreach rcname ( ${RCFILES} )
		${LOGGER} starting ${rcname}
		${rcname} start >& /dev/null
		echo "${TAB}" ${rcname}
	end
	
	exit 0

This script isn't perfect, and if you start or stop a jail you need to separate the relevant part. This can easily be coded into that script, I know. But I was lazy ;-)

I hope that helps for a start. Again, I am sure you may need some tweaking at your site.

Regards,
Michael







More information about the freebsd-jail mailing list