Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 18 May 2013 23:29:45 +0000
From:      "Teske, Devin" <Devin.Teske@fisglobal.com>
To:        Joe <fbsd8@a1poweruser.com>
Cc:        "<freebsd-questions@freebsd.org>" <freebsd-questions@freebsd.org>
Subject:   Re: netgraph network setup for jail(8) vnet jails.
Message-ID:  <13CA24D6AB415D428143D44749F57D7201F5076A@ltcfiswmsgmb26>
In-Reply-To: <5197A06A.9080401@a1poweruser.com>
References:  <5197A06A.9080401@a1poweruser.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Sorry for top-post, but just wanted to add a quick note:

The output of "ngctl dot" would be very helpful to others in debugging your=
 setup.
--=20
Devin

On May 18, 2013, at 8:38 AM, Joe wrote:

> Hello list
>=20
> I cant get to the internet using this netgraph setup script.
> I sure would appreciate giving this console log a look over for
> errors. My netgraph knowledge level is not sufficient to see what is
> wrong. The goal is to run this script to setup and break down a netgraph
> network for a single vnet jail at a time. rl0 is the real nic interface
> device name of the nic facing the internet. This box is on my lan and
> the gateway box does NAT for all lan boxes. The host running this script =
can ping the internet ok.
>=20
> Thank you very much for your help.
>=20
>=20
>=20
>=20
>=20
> The host's kernel has modules with vimage & ipfw compiled in.
>=20
> From the host
> # /root >ifconfig
> rl0: flags=3D8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu
> 	options=3D2008<VLAN_MTU,WOL_MAGIC>
> 	ether 00:0c:6e:09:8b:74
> 	inet 10.0.10.5 netmask 0xfffffff8 broadcast 10.0.10.7
> 	nd6 options=3D29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
> 	media: Ethernet autoselect (100baseTX <full-duplex>)
> 	status: active
> plip0: flags=3D8810<POINTOPOINT,SIMPLEX,MULTICAST> metric 0 mtu 1500
> 	nd6 options=3D29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
> ipfw0: flags=3D8801<UP,SIMPLEX,MULTICAST> metric 0 mtu 65536
> 	nd6 options=3D29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
> lo0: flags=3D8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
> 	options=3D600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
> 	inet6 ::1 prefixlen 128
> 	inet6 fe80::1%lo0 prefixlen 64 scopeid 0x8
> 	inet 127.0.0.1 netmask 0xff000000
> 	nd6 options=3D21<PERFORMNUD,AUTO_LINKLOCAL>
>=20
> The jails config file
> # /root >cat /usr/local/etc/vnet/vdir4
> vdir4 {
> host.hostname       =3D  "vdir4";
> path                =3D  "/usr/jails/vdir4";
> mount.fstab         =3D  "/usr/local/etc/fstab/vdir4";
> vnet;
> persist;
> }
>=20
> The netgraph script
> # /root >cat /usr/local/bin/vnet.ng.test
> #!/bin/sh
> # snip comments for displaying here
> # This script is based on this /usr/share/examples/netgraph/virtual.lan
>=20
> # Give the name of ethernet interface.
> ETHER_INTF=3D"rl0"
>=20
> # List the names of virtual nodes and their IP addresses. Use ':'
> # character to separate node name from node IP address and netmask.
>=20
> #TARGET_TOPOLOGY=3D"c1|10.0.2.20/24 c2|10.0.2.21/24 c3|10.0.2.22/24"
> TARGET_TOPOLOGY=3D"vdir4|10.0.2.20/24"
>=20
> # MAC manufacturer prefix. This can be modified according to needs.
> MAC_PREFIX=3D"00:1d:92"
>=20
> # Temporary file is important for proper execution of script.
> TEMP_FILE=3D"/var/tmp/virtual.lan.tmp"
>=20
> virtual_lan_start() {
>=20
> # Load netgraph KLD's as necessary.
>=20
> for KLD in ng_ether ng_bridge ng_eiface; do
> 	if ! kldstat -v | grep -qw ${KLD}; then
> 		echo -n "Loading ${KLD}.ko... "
> 		kldload ${KLD} || exit 1
> 		echo "done"
> 	fi
> done
>=20
> # Reset all interfaces and jails. If temporary file can not be found
> # script assumes that there is no previous configuration.
>=20
> if [ ! -e ${TEMP_FILE} ]; then
>  echo "No previous configuration(${TEMP_FILE}) found to clean-up."
> else
>  echo -n "Cleaning previous configuration..."
>  virtual_lan_stop
>  echo "done"
> fi
>=20
> # Create temporary file for usage. This file includes generated
> # interface names and jail names. All bridges, interfaces and jails
> # are written to file while created. In clean-up process written
> # objects are cleaned (i.e. removed) from system.
>=20
> if [ -e ${TEMP_FILE} ]; then
> 	touch ${TEMP_FILE}
> fi
>=20
> echo -n "Verifying ethernet interface existence..."
> # Verify ethernet interface exist.
> if ! ngctl info ${ETHER_INTF}: >/dev/null 2>&1; then
> 	echo "Error: interface ${ETHER_INTF} does not exist"
> 	exit 1
> fi
>=20
> ifconfig ${ETHER_INTF} up || exit 1
> echo "done"
>=20
> # Get current number of bridge interfaces in the system. This number
> # is used to create a name for new bridge.
> BRIDGE_COUNT=3D`ngctl l | grep bridge | wc -l | sed -e "s/ //g"`
> BRIDGE_NAME=3D"bridge${BRIDGE_COUNT}"
>=20
> # Create new ng_bridge(4) node and attach it to the ethernet interface.
> # Connect ng_ether:lower hook to bridge:link0 when creating bridge and
> # connect ng_ether:upper hook to bridge:link1 after bridge name is set.
>=20
> echo "Creating bridge interface: ${BRIDGE_NAME}..."
> ngctl mkpeer ${ETHER_INTF}: bridge lower link0 || exit 1
> ngctl name ${ETHER_INTF}:lower ${BRIDGE_NAME} || exit 1
> ngctl connect ${ETHER_INTF}: ${BRIDGE_NAME}: upper link1 || exit 1
> echo "Bridge ${BRIDGE_NAME} is created and ${ETHER_INTF} is connected."
>=20
> # In the above code block two hooks are connected to bridge interface,
> # therefore LINKNUM is set to 2 indicating total number of connected
> # hooks on the bridge interface.
> LINKNUM=3D2
>=20
> # Write name of the bridge to temp file. Clean-up procedure will use
> # this name to shutdown bridge interface.
> echo "bridge ${BRIDGE_NAME}" > ${TEMP_FILE}
>=20
>=20
> # Attach vnet jail.
> for NODE in ${TARGET_TOPOLOGY}; do
>=20
>  # Virtual nodes are defined in TARGET_TOPOLOGY variable. They
>  # have the form of 'nodeName|IPaddr'. Below two lines split
>  # node definition to get node name and node IP.
>=20
>  NODE_NAME=3D`echo ${NODE} | awk -F"|" '{print $1}'`
>  NODE_IP=3D`echo ${NODE} | awk -F"|" '{print $2}'`
>=20
>  # Create virtual node (jail) with given name
>  echo -n "Creating virtual node (jail) ${NODE_NAME}..."
>=20
>  jail -f "/usr/local/etc/vnet/${NODE_NAME}" -c ${NODE_NAME}
>  if [ $? -ne 0 ]; then
>    echo "Error: /usr/sbin/jail failed to start jail ${NODE_NAME}."
>    virtual_lan_stop
>    exit 2
>  fi
>  echo "done"
>=20
>  # Write name of the jail to temp file. Clean-up procedure will
>  # use this name to remove jail.
>=20
>  echo "node ${NODE_NAME}" >> ${TEMP_FILE}
>=20
>  # Create a ng_eiface object for virtual node. ng_eiface
>  # object has a hook that can be connected to one of bridge
>  # links. After creating interface get its automatically
>  # generated name for further usage.
>=20
>  echo "Creating eiface interface for virtual node ${NODE_NAME}."
>  ngctl mkpeer eiface ether ether
>  EIFACE=3D`ngctl l | grep ngeth | tail -n 1| awk '{print $2}'`
>  echo "Interface ${EIFACE} is created."
>=20
>  # Write name of the interface to temp file. Clean-up procedure
>  # will use this name to shutdown interface.
>=20
>  echo "interface ${EIFACE}" >> ${TEMP_FILE}
>=20
>  # Move virtual interface to virtual node. Note that Interface
>  # name will not be changed at the end of this movement. Moved
>  # interface can be seen at the output of ifconfig command in
>  # jail: 'jexec jailname ifconfig'
>=20
>  echo "Moving ${EIFACE} to ${NODE_NAME}"
>  ifconfig ${EIFACE} vnet ${NODE_NAME}
>=20
>  # Make lo0 interface localhost.
>  jexec ${NODE_NAME} ifconfig lo0 localhost
>=20
>  # Generate a random mac address for virtual interface. First
>  # three octets can be changed by user. Last three octets are
>  # generated randomly.
>  M4=3D`od -An -N2 -i /dev/random | sed -e 's/ //g' | \
> 		awk '{ print $1 % 256 }'`
>  M5=3D`od -An -N2 -i /dev/random | sed -e 's/ //g' | \
> 		awk '{ print $1 % 256 }'`
>  M6=3D`od -An -N2 -i /dev/random | sed -e 's/ //g' | \
> 	awk '{ print $1 % 256 }'`
>=20
>  MAC=3D`printf ${MAC_PREFIX}:%02x:%02x:%02x ${M4} ${M5} ${M6}`
>=20
>  # Set the link address (mac address) of virtual interface in
>  # virtual node to randomly generated MAC.
>  echo "Setting MAC address of ${EIFACE} to '${MAC}'"
>  jexec ${NODE_NAME} ifconfig ${EIFACE} link $MAC
>=20
>  # Either IPv4 or IPv6 can be used in this script. Ifconfig
>  # IP setting syntax differs slightly for two IP versions.
>  # For version 4 'inet' keyword is used whereas for version 6
>  # 'inet6' is used. Below line tries to decide which IP version
>  # is given and sets IPVER to 'inet' or 'inet6'.
>=20
>  IPVER=3D`echo ${NODE_IP} | awk -F"." '{ split($4,last,"/"); \
> 	if( NF=3D=3D4 && $1>0 && $1<256 && $2<256 && $3<256 && \
> 	last[1]<256) print "inet"; else print "inet6"}'`
>=20
>  # Set IP address of virtual interface in virtual node.
>  echo "Setting IP address of ${EIFACE} to '${NODE_IP}'"
>  jexec ${NODE_NAME} ifconfig ${EIFACE} ${IPVER} ${NODE_IP}
>=20
>  # Connect virtual interface to bridge interface. Syntax is :
>  # ngctl connect INTERFACE: BRIDGE: INTERFACE_HOOK EMPTY_LINK.
>  # Interface has one hook named 'ether' and below line connects
>  # ether hook to bridge's first unconnected link.
>=20
>  echo -n "Connecting ${EIFACE}:ether to ${BRIDGE_NAME}:link${LINKNUM}..."
>=20
>  ngctl connect ${EIFACE}: ${BRIDGE_NAME}: ether link${LINKNUM} \
> 	|| exit 1
>  echo "done"
>=20
>  # Now, bridge has one more connected link thus link count is
>  # incremented.
>  LINKNUM=3D`expr ${LINKNUM} + 1`
> done
> echo "Virtual LAN established successfully!"
>=20
> }
>=20
>=20
> # Stop routine.
> virtual_lan_stop() {
>=20
> if [ ! -e ${TEMP_FILE} ]; then
>  echo "Nothing to stop! ${TEMP_FILE}: temp file not found"
> else
>  echo -n "Shutdown bridge interface.."
>  OBJECTS=3D`cat ${TEMP_FILE} | grep bridge | awk '{print $2}'`
>  for BRIDGE in ${OBJECTS}; do
>    ngctl shutdown ${BRIDGE}: >/dev/null 2>&1
>  done
>  echo "done"
>=20
>  echo -n "Shutdown all eiface interfaces..."
>  OBJECTS=3D`cat ${TEMP_FILE} | grep interface | awk '{print $2}'`
>  for INTERFACE in ${OBJECTS}; do
>    ngctl shutdown ${INTERFACE}: >/dev/null 2>&1
>  done
>  echo "done"
>=20
>  echo -n "Removing all jails..."
>  OBJECTS=3D`cat ${TEMP_FILE} | grep node | awk '{print $2}'`
>  for NODE in ${OBJECTS}; do
>     jail -f "/usr/local/etc/vnet/${NODE}" -r ${NODE}
>  done
>  echo "done"
>=20
>  echo "Removing tempfile ${TEMP_FILE}"
>  rm ${TEMP_FILE}
> fi
> echo "Virtual LAN objects removed successfully!"
>=20
> }
>=20
>=20
> # Main entry point.
>=20
> case $# in
> 	1)
> 		case $1 in
>                        start)
>                                echo -n "Creating default target topology:"
> 				echo " ${TARGET_TOPOLOGY}"
>                                virtual_lan_start
>                                ;;
>                        stop)
>=20
> 				if [ ! -e ${TEMP_FILE} ]; then
> 					echo -n "Noting to stop! ${TEMP_FILE}:"
> 					echo " temp file not found"
> 				else
> 					virtual_lan_stop
> 				fi
>                                ;;
>                        help)
>                                virtual_lan_usage
> 				exit 1
>                                ;;
>                        *)
>                                virtual_lan_usage
>                                exit 1
>=20
>                esac
> 		;;
> 	2)
> 	        case $1 in
> 			start)
>                        	TARGET_TOPOLOGY=3D$2
>                                echo -n "Creating target topology:"
> 				echo "${TARGET_TOPOLOGY}"
>                                virtual_lan_start
>                                ;;
>                        *)
>                        	virtual_lan_usage
>                                exit 1
>                esac
> 		;;
>=20
> 	*)
>                virtual_lan_usage
>                exit 1
> esac
>=20
>=20
> # /root >vnet.ng.test start
> Creating default target topology: vdir4|10.0.2.20/24
> Loading ng_ether.ko... done
> Loading ng_bridge.ko... done
> Loading ng_eiface.ko... done
> No previous configuration(/var/tmp/virtual.lan.tmp) found to clean-up.
> Verifying ethernet interface existence...done
> Creating bridge interface: bridge0...
> Bridge bridge0 is created and rl0 is connected.
> Creating virtual node (jail) vdir4...vdir4: created
> done
> Creating eiface interface for virtual node vdir4.
> Interface ngeth0 is created.
> Moving ngeth0 to vdir4
> Setting MAC address of ngeth0 to '00:1d:92:df:92:8e'
> Setting IP address of ngeth0 to '10.0.2.20/24'
> Connecting ngeth0:ether to bridge0:link2...done
> Virtual LAN established successfully!
>=20
>=20
> # /root >ngctl ls -l
> There are 5 total nodes:
>  Name: rl0             Type: ether           ID: 00000001   Num hooks: 2
>  Local hook      Peer name       Peer type    Peer ID         Peer
> hook
>  ----------      ---------       ---------    -------
> ---------
>  upper           bridge0         bridge       00000006        link1
>=20
>  lower           bridge0         bridge       00000006        link0
>=20
>  Name: ipfw0           Type: ether           ID: 00000002   Num hooks: 0
>  Name: bridge0         Type: bridge          ID: 00000006   Num hooks: 3
>  Local hook      Peer name       Peer type    Peer ID         Peer
> hook
>  ----------      ---------       ---------    -------
> ---------
>  link2           ngeth0          eiface       0000000a        ether
>=20
>  link1           rl0             ether        00000001        upper
>=20
>  link0           rl0             ether        00000001        lower
>=20
>  Name: ngeth0          Type: eiface          ID: 0000000a   Num hooks: 1
>  Local hook      Peer name       Peer type    Peer ID         Peer
> hook
>  ----------      ---------       ---------    -------
> ---------
>  ether           bridge0         bridge       00000006        link2
>=20
>  Name: ngctl1513       Type: socket          ID: 0000000d   Num hooks: 0
>=20
>=20
> # /root >jexec vdir4 tcsh
> vdir4 / >ping -c 1 8.8.178.135
> PING 8.8.178.135 (8.8.178.135): 56 data bytes
> ping: sendto: No route to host
>=20
> --- 8.8.178.135 ping statistics ---
> 1 packets transmitted, 0 packets received, 100.0% packet loss
> vdir4 / >exit
> exit
>=20
>=20
> # /root >vnet.ng.test stop
> Shutdown bridge interface..done
> Shutdown all eiface interfaces...done
> Removing all jails...vdir4: removed
> done
> Removing tempfile /var/tmp/virtual.lan.tmp
> Virtual LAN objects removed successfully!
>=20
> # /root >jls
>   JID  IP Address      Hostname                      Path
>=20
> # /root >ngctl ls -l
> There are 3 total nodes:
>  Name: ngctl1540       Type: socket          ID: 00000010   Num hooks: 0
>  Name: rl0             Type: ether           ID: 00000001   Num hooks: 0
>  Name: ipfw0           Type: ether           ID: 00000002   Num hooks: 0
>=20
>=20
>=20
>=20
> _______________________________________________
> freebsd-questions@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-questions
> To unsubscribe, send any mail to "freebsd-questions-unsubscribe@freebsd.o=
rg"

_____________
The information contained in this message is proprietary and/or confidentia=
l. If you are not the intended recipient, please: (i) delete the message an=
d all copies; (ii) do not disclose, distribute or use the message in any ma=
nner; and (iii) notify the sender immediately. In addition, please be aware=
 that any message addressed to our domain is subject to archiving and revie=
w by persons other than the intended recipient. Thank you.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?13CA24D6AB415D428143D44749F57D7201F5076A>