Contents
Konfiguration unserer Public IP Gateways
Diese Dokumentation beschreibt die Konfiguration unserer Public IP Gateways. Details zu unseren Public IPs können auf der Seite PublicIP gefunden werden. Informationen zu allen anderen Servern kann auf der Seite ServerDokumentation gefunden werden.
Allgemeines
Im großen und Ganzen erfüllen unsere Public IP Gateways 3 Aufgaben:
- Announcement unseres Public IP Address Bereich per BGP im Internet
- Announcement der Gateway Anycast Adresse (10.12.34.56) im Funkfeuer-Netz
- Ein und Auspacken der Pakete in die intern verwendeten IP-IP Tunnel
Für ersteres wird quagga verwendet. Der zweite Punkt wird von olsrd erledigt und letzeres ein Konstrukt aus Policy Routing und IP-IP Tunnel.
Quagga (BGP)
Auf unseren Gateways laufen 2 Daemons innerhalb von quagga: zebra und bgpd. Die konfigurationsdateien liegen in /etc/quagga. Die empfohlene Art die Daemons zu steuern ist allerdings die vtysh. Diese muss entweder als root gestartet werden oder von einem User der der Gruppe quaggavty angehört. Sollte das BGP Announcement aus irgendeinem Grund abgeschaltet werden sollte besser für die Dauer des Ausfalls olsrd entweder ganz beendet werden oder das Annoucement der Anycast Gateway Adresse deaktiviert werden.
olsrd
Die Konfigurationsdatei des Daemons ist unter /etc/olsrd/olsrd.conf zu finden. Auf gw-cc.ffgraz.net findet sich folgende Version:
# # OLSR.org routing daemon config file # This file is shipped with Funkfeuer Graz Debian Packages # # Lines starting with a # are discarded # DebugLevel 0 IpVersion 4 Pollrate 0.025 FIBMetric "flat" RtTable 111 RtTableDefault 112 UseNiit no SmartGateway no Hna4 { # Anycast DNS 10.12.0.10 255.255.255.255 # Anycast Gateway 10.12.34.56 255.255.255.255 # Spektral/Housing Interconnect Subnet 10.12.208.0 255.255.255.224 # Loopback Address 193.33.150.1 255.255.255.255 } #Hna6 #{ #} UseHysteresis no TcRedundancy 2 MprCoverage 7 LinkQualityLevel 2 LinkQualityAlgorithm "etx_ff" LinkQualityAging 0.05 LinkQualityFishEye 1 LoadPlugin "olsrd_txtinfo.so.0.1" { PlParam "port" "2006" PlParam "Accept" "127.0.0.1" } LoadPlugin "olsrd_nameservice.so.0.3" { PlParam "name" "gw-cc.housing" PlParam "10.12.34.56" "Funkfeuer-Graz.gateway" PlParam "10.12.0.10" "dns.anycast" PlParam "hosts-file" "/var/run/olsrd.hosts" PlParam "resolv-file" "/var/run/olsrd.resolv" } InterfaceDefaults { HelloInterval 3.0 HelloValidityTime 125.0 TcInterval 2.0 TcValidityTime 500.0 MidInterval 25.0 MidValidityTime 500.0 HnaInterval 10.0 HnaValidityTime 125.0 } Interface "eth1" { Mode "ether" # LinkQualityMult 192.168.0.1 0.5 # LinkQualityMult default 0.8 }
Wichtig ist dabei das nebem dem Announcement der Anycast Gateway Adresse mittels RtTable und RtTableDefault die Policy Routing Fähigkeit von olsrd genutzt wird. Sollte aus irgendeinem Grund olsrd beendet werden oder das Anycast Announcement deaktiviert werden sollte besser auch das BGP Announcement abgeschaltet werden (zb durch stoppen von quagga).
Firewall und Routing
Alle nötigen Konfigurationsscritte für iptables etc werden von dem Script /etc/init.d/routenfirewall erledigt. Damit dieses Script richtig arbeitet darf bei der Interface Konfiguration (/etc/network/interfaces) bei keinem Interface ein Gateway angegeben werden. Auf gw-cc.ffgraz.net findet sich folgende Version des Scriptes:
#! /bin/sh ### BEGIN INIT INFO # Provides: routenfirewall # Required-Start: $network $remote_fs $syslog # Required-Stop: $network $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: /etc/init.d/routenfirewall: configure advanced routing and firewall ### END INIT INFO # # Route and Firewall Script DEFAULT_GW=217.29.149.65 EXTERN_IFACE="eth0" OLSR_IFACES="eth1" PUBLIC_IFACE="public" PUBLIC_NET="193.33.150.0/23" ANYCAST_IP="10.12.34.56" UNREACHABLE_NETS="10.0.0.0/8 172.16.0.0/12 169.254.0.0/16 192.168.0.0/16 $PUBLIC_NET" OTHERGW_IP=193.33.151.1 case "$1" in start) ip route add default via $DEFAULT_GW table default ip rule add lookup main ip rule add lookup olsr ip rule add fwmark 2 lookup public-in ip rule del pref 32766 ip rule add pref 32766 fwmark 1 lookup olsr-default for i in $OLSR_IFACES; do iptables -t mangle -A PREROUTING -i $i -j MARK --set-mark 1 done iptables -t mangle -A PREROUTING -i $EXTERN_IFACE \! -d $OTHERGW_IP -j MARK --set-mark 2 for net in $UNREACHABLE_NETS; do ip route add unreachable $net done ip tunnel add $PUBLIC_IFACE mode ipip local $ANYCAST_IP ttl 255 ip link set up dev $PUBLIC_IFACE ip addr add dev $PUBLIC_IFACE $ANYCAST_IP/32 ip route add $PUBLIC_NET dev $PUBLIC_IFACE table public-in iptables -t mangle -A PREROUTING -i $PUBLIC_IFACE -j MARK --set-mark 0 ;; stop) ip rule del pref 32766 ip rule add pref 32766 lookup main ip rule del lookup main ip rule del lookup olsr ip rule del fwmark 2 lookup public-in ip route del default via $DEFAULT_GW table default ip route del $PUBLIC_NET dev $PUBLIC_IFACE table public-in for i in $OLSR_IFACES; do iptables -t mangle -D PREROUTING -i $i -j MARK --set-mark 1 done iptables -t mangle -D PREROUTING -i $EXTERN_IFACE -d \! 193.33.151.1 -j MARK --set-mark 2 for net in $UNREACHABLE_NETS; do ip route del unreachable $net done iptables -t mangle -D PREROUTING -i $PUBLIC_IFACE -j MARK --set-mark 0 ip tunnel del $PUBLIC_IFACE ;; *) echo "Usage: /etc/init.d/routenfirewall {start|stop}" exit 1 ;; esac exit 0
und auf gw-mur.ffgraz.net folgende Version:
#! /bin/sh ### BEGIN INIT INFO # Provides: routenfirewall # Required-Start: $network $remote_fs $syslog # Required-Stop: $network $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: /etc/init.d/routenfirewall: configure advanced routing and firewall ### END INIT INFO # # Route and Firewall Script DEFAULT_GW="89.106.210.41" EXTERN_IFACE="eth0" OLSR_IFACES="eth1 eth2" PUBLIC_IFACE="public" PUBLIC_NET="193.33.150.0/23" ANYCAST_IP="10.12.34.56" UNREACHABLE_NETS="10.0.0.0/8 172.16.0.0/12 169.254.0.0/16 192.168.0.0/16 $PUBLIC_NET" MUR_NET="89.106.208.0/21" OTHERGW_IP="193.33.150.1" case "$1" in start) ip route add default via $DEFAULT_GW table default ip rule add lookup main ip rule add lookup olsr ip rule add fwmark 2 lookup public-in ip rule del pref 32766 ip rule add pref 32766 fwmark 1 lookup olsr-default for i in $OLSR_IFACES; do iptables -t mangle -A PREROUTING -i $i -j MARK --set-mark 1 done iptables -t mangle -A PREROUTING -i $EXTERN_IFACE \! -s $MUR_NET \! -d $OTHERGW_IP -j MARK --set-mark 2 for net in $UNREACHABLE_NETS; do ip route add unreachable $net done ip tunnel add $PUBLIC_IFACE mode ipip local $ANYCAST_IP ttl 255 ip link set up dev $PUBLIC_IFACE ip addr add dev $PUBLIC_IFACE $ANYCAST_IP/32 ip route add $PUBLIC_NET dev $PUBLIC_IFACE table public-in iptables -t mangle -A PREROUTING -i $PUBLIC_IFACE -j MARK --set-mark 0 ;; stop) ip rule del pref 32766 ip rule add pref 32766 lookup main ip rule del lookup main ip rule del lookup olsr ip rule del fwmark 2 lookup public-in ip route del default via $DEFAULT_GW table default ip route del $PUBLIC_NET dev $PUBLIC_IFACE table public-in for i in $OLSR_IFACES; do iptables -t mangle -D PREROUTING -i $i -j MARK --set-mark 1 done iptables -t mangle -D PREROUTING -i $EXTERN_IFACE \! -s 89.106.208.0/21 \! -d 193.33.150.1 -j MARK --set-mark 2 for net in $UNREACHABLE_NETS; do ip route del unreachable $net done iptables -t mangle -D PREROUTING -i $PUBLIC_IFACE -j MARK --set-mark 0 ip tunnel del $PUBLIC_IFACE ;; *) echo "Usage: /etc/init.d/routenfirewall {start|stop}" exit 1 ;; esac exit 0
Damit diese Scripte funktionieren können müssen in der Datei /etc/iproute2/rt_tables die folgenden Einträge hinzugefügt werden:
100 public-in 111 olsr 112 olsr-default