Sebastián Maruca via freebsd-jail <freebsd-jail@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





_______________________________________________
freebsd-jail@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-jail
To unsubscribe, send any mail to "freebsd-jail-unsubscr...@freebsd.org"

Reply via email to