Locked History Actions

PublicIPGateway

Konfiguration unserer Public IP Gateways

{i} 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