XEN network masqu/routing
XEN Netzwerk mit Masquerading/Routing auf SuSE 10.1 Notebook
Ich verwende folgendes Script unter SuSE 10.1 auf einem Notebook und WLAN mittels ndiswrapper in einer sehr speziellen Konfiguration: Da ich mit dem WLAN-Device wlan0 keine Standard-XEN-Bridge (peth0,eth0 -> xenbr0) zum laufen bekomme (evtl. wegen dem ndiswrapper?) muss ich Routing und Masquerading auf dem WLAN-Device verwenden. Dazu gebe ich den beiden XEN-Bridges (GREEN und RED) jeweils eine IP-Adresse und benutze die Firewall über normales Routing.
Notebook mittels WLAN (ndiswrapper) und Routing/Masquerading (wlan0)
route -n Kernel IP Routentabelle Ziel Router Genmask Flags Metric Ref Use Iface 10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 xenbr0 # GREEN 10.0.1.0 0.0.0.0 255.255.255.0 U 0 0 0 xenbr1 # RED 10.0.2.0 10.0.0.1 255.255.255.0 UG 0 0 0 xenbr0 # ORANGE 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0 # WLAN 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 wlan0 # not used 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo 0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 wlan0 # WLAN
SuSE 10.1: Startup XEN-Network on Boot
/etc/init.d/after.local
#!/bin/sh
netdev=$(ip route list | awk '/^default / { print $NF }')
if [ -n "${netdev}" ]; then
echo "Starting EFW2 XEN Network Setup "
/etc/xen/scripts/network-fw3wlan start
echo "Starting EFW2 (XEN) "
xm create efw
echo "Starting DMZ (XEN) "
xm create dmz
#echo "Starting DEVEL (XEN) "
#xm create devel
/sbin/rcSuSEfirewall2 start
fi
3-Zonen Konfiguration mit Routing/Masquerading
#!/bin/sh
#============================================================================
# Xen network start/stop script.
#
# Xend calls a network script when it starts.
# The script name to use is defined in /etc/xen/xend-config.sxp
# in the network-script field.
# ---------------------------------------------------------------------------
# It creates a XEN network setup with 3 bridges for a firewall in a domU
# like IPCop / Shorewall / Endian Firewall with GREEN, RED and ORANGE net.
#
# This script creates 3 bridges (default xenbr0-2), gives the first
# bridge (xenbr0 = GREEN) an IP address, and the 2.nd bridge (xenbr1 = RED)
# optional also. It will set a route to the net's definded for the bridges.
# ---------------------------------------------------------------------------
# If all goes well, this should ensure that networking stays up.
# However, some configurations are upset by this, especially
# NFS roots. If the bridged setup does not meet your needs,
# configure a different script, for example using routing instead.
#
# Usage: network-fw3wlan (start|stop|status) {VAR=VAL}*
#
# Vars (all optional):
#
# bridge[0-2] The bridge to use (default xenbr${vifnum}).
#
# bridgeip[0-1] Holds the ip address the bridge should have in the
# the form ip/mask (10.0.0.1/24).
#
# brnet[0-2] Holds the network of the bridge (10.0.0.1/24).
#
# netdev The network device of dom0 (default from defaultroute)
#
# vifnum Virtual device number to use (default 0). Numbers >=8
# require the netback driver to have nloopbacks set to a
# higher value than its default of 8.
#
# start:
# Create the bridges, set up IP addresses and routes
#
# stop:
# Removes all routes from the bridge
# Removes any devices on the bridge from it.
# Deletes bridge
#
# status:
# Print addresses, interfaces, routes
#
#============================================================================
dir=$(dirname "$0")
. "$dir/xen-script-common.sh"
. "$dir/xen-network-common.sh"
findCommand "$@"
evalVariables "$@"
vifnum=${vifnum:-$(ip route list | awk '/^default / { print $NF }' | sed 's/^[^0-9]*//')}
vifnum=${vifnum:-0}
netdev=${netdev:-$(ip route list | awk '/^default / { print $NF }')}
netdev=${netdev:-eth${vifnum}}
antispoof=${antispoof:-no}
pdev="p${netdev}"
vdev="veth${vifnum}"
vif0="vif0.${vifnum}"
link_exists () {
if ip link show "$1" >/dev/null 2>/dev/null
then
return 0
else
return 1
fi
}
# Usage: show_status dev bridge
# Print ifconfig and routes.
show_status () {
local dev=$1
local bridge=$2
echo '============================================================'
ip addr show ${dev}
ip addr show ${bridge}
echo ' '
brctl show ${bridge}
echo ' '
ip route list
echo ' '
route -n
echo '============================================================'
}
# check for default XEN interfaces
check_xen_if () {
if ! link_exists "$vdev"; then
if link_exists "$pdev"; then
# The device is already up.
return
else
echo "
Link $vdev is missing.
This may be because you have reached the limit of the number of interfaces
that the loopback driver supports. If the loopback driver is a module, you
may raise this limit by passing it as a parameter (nloopbacks=<N>); if the
driver is compiled statically into the kernel, then you may set the parameter
using loopback.nloopbacks=<N> on the domain 0 kernel command line.
" >&2
exit 1
fi
fi
}
op_start () {
check_xen_if
###
# GREEN LAN:
# EFW (eth0: 10.0.0.1/24)
# |
# xenbr0------- more XEN domU's in LAN (10.0.0.x/24)
# |
# +--Dom0 (xenbr0: 10.0.0.254/24)
bridge=${bridge0:-xenbr0}
bridgeip=${br0ip:-10.0.0.254}
brnet=${br0net:-10.0.0.0/24}
brcast=${br0cast:-10.0.0.255}
br0gw=${br0gw:-$(echo $brnet | cut -d/ -f1 | cut -d. -f-3).1}
brnm="`echo $brnet | cut -d/ -f2`"
create_bridge ${bridge}
if link_exists "${bridge}"; then
ip link set ${bridge} up arp on
# Add IP-Address to Bridge if wlan is default-gateway
if [ "${netdev}" = "wlan${vifnum}" ]; then
if [ -n "${bridgeip}" ]; then
ip address add ${bridgeip}/${brnm} broadcast ${brcast} dev ${bridge} || true
#ip route add to ${brnet} dev ${bridge} || true
fi
fi
fi
###
# RED INTERFACE:
# EFW (eth1: 10.0.1.1/24)
# |
# xenbr1 $netdev (masquerade)
# | |
# +--Dom0--+
# (routing via xenbr1: 10.0.1.254)
bridge=${bridge1:-xenbr1}
bridgeip=${br1ip:-10.0.1.254}
brnet=${br1net:-10.0.1.0/24}
brcast=${br1cast:-10.0.1.255}
brnm="`echo $brnet | cut -d/ -f2`"
create_bridge ${bridge}
if link_exists "$bridge"; then
ip link set ${bridge} up arp on
# Add $netdev or IP-Address to Bridge
if [ "${netdev}" != "wlan${vifnum}" ]; then
if link_exists "${netdev}"; then
if ! ifdown ${netdev}; then
ip link set ${netdev} down
ip addr flush ${netdev}
fi
setup_bridge_port ${netdev}
add_to_bridge ${bridge} ${netdev}
fi
else
if [ -n "${bridgeip}" ]; then
ip address add ${bridgeip}/${brnm} broadcast ${brcast} dev ${bridge} || true
#ip route add to ${brnet} dev ${bridge} || true
fi
fi
fi
###
# ORANGE DMZ: setup route via EFW
# EFW (eth2: 10.0.2.1/24)
# |
# xenbr2----- more XEN domU's in DMZ (10.0.2.x/24)
# |
# +--DMZ1 (eth0: 10.0.2.x/24)
bridge=${bridge2:-xenbr2}
brnet=${br2net:-10.0.2.0/24}
create_bridge ${bridge}
if link_exists ${bridge}; then
ip link set ${bridge} up arp on
if [ -n "${br0gw}" ]; then
ip route add to ${brnet} via ${br0gw} || true
fi
fi
}
op_stop () {
###
# GREEN:
bridge=${bridge0:-xenbr0}
bridgeip=${br0ip:-10.0.0.254}
brnet=${br0net:-10.0.0.0/24}
br0gw=${br0gw:-$(echo $brnet | cut -d/ -f1 | cut -d. -f-3).1}
if link_exists ${bridge}; then
ip route del to ${brnet} dev ${bridge} || true
ip address del dev ${bridge} ${bridgeip}/32 || true
ip link set ${bridge} down arp off || true
##FIXME: 1st disconnect the correct interfaces from the bridge
brctl delif ${bridge} vif1.0 || true
brctl delbr ${bridge}
fi
###
# RED INTERFACE:
bridge=${bridge1:-xenbr1}
bridgeip=${br1ip:-10.0.1.254}
brnet=${br1net:-10.0.1.0/24}
if link_exists ${bridge}; then
ip route del to ${brnet} dev ${bridge} || true
ip address del dev ${bridge} ${bridgeip}/32 || true
ip link set ${bridge} down arp off || true
##FIXME: 1st disconnect the correct interfaces from the bridge
brctl delif ${bridge} vif1.1 || true
brctl delbr ${bridge}
fi
###
# ORANGE DMZ:
# Bridge has no IP
bridge=${bridge2:-xenbr2}
brnet=${br2net:-10.0.0.0/24}
if link_exists ${bridge}; then
ip route del to ${brnet} via ${br0gw}/32 || true
ip link set ${bridge} down arp off || true
##FIXME: 1st disconnect the correct interfaces from the bridge
brctl delif ${bridge} vif1.2 || true
brctl delif ${bridge} vif2.0 || true
brctl delbr ${bridge}
fi
rcSuSEfirewall2 start
}
case "$command" in
start)
op_start
;;
stop)
op_stop
;;
status)
show_status ${netdev} ${bridge}
;;
*)
echo "Unknown command: $command" >&2
echo 'Valid commands are: start, stop, status' >&2
exit 1
esac