Freifunk-BGP-Gateway: Unterschied zwischen den Versionen

Aus Freifunk Franken
Wechseln zu:Navigation, Suche
Keine Bearbeitungszusammenfassung
(22 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
In dieser Anleitung geht es darum, wie man BGP (hier mit Bird) spricht und diese Routen ins Layer 3 (Babel) Freifunknetz verteilt.
{{Outdated}}
 
In dieser Anleitung geht es darum, wie man BGP spricht und diese Routen ins Babel verteilt, um Adressen aus einem eigenen AS für Freifunk zur Verfügung zu stellen.


Das ganze ist alles noch im Aufbau und die Anleitung ist auch den ersten Livesystem entstanden. Es kann durchaus sein, das hier noch viel Optimierungspotential vorhanden ist.
Das ganze ist alles noch im Aufbau und die Anleitung ist auch den ersten Livesystem entstanden. Es kann durchaus sein, das hier noch viel Optimierungspotential vorhanden ist.


== Grundlegendes ==
== Grundlegendes ==
Routing im Linux aktivieren
* Routing im Linux aktivieren
Alle Partner die im Babel das v6 Netz mit rumschubsen wollen, müssen folgende Config auf den genutzen GRE Tunnels aktivieren:
* Wir legen 2 Kernel Routingtabellen an. In einer landet der Freifunk Kram in der anderen die Internet Routen.
https://wiki.freifunk-franken.de/mediawiki/index.php?title=Freifunk-Gateway_aufsetzen&curid=536&diff=9745&oldid=9608


== Bird installieren und einrichten ==
== Bird installieren und einrichten ==


Zuerst installieren wir bird:
bird installieren.
<pre>
<pre>
apt-get install bird
apt-get install bird
Zeile 16: Zeile 17:


=== Peering Interfaces ===
=== Peering Interfaces ===
Zudem muss ein Partner vorhanden sein, mit dem man Bird sprechen kann. In dieser Beispielconfig ist es Hurricane Electric per Tunnel worüber es auch Transit gibt und ein privates Peering über einen GRE Tunnel.  
Es muss ein Partner vorhanden sein, mit dem man BGP sprechen kann. Entweder direkt oder per Tunnel. HE bietet kostenlos einen entsprechenden Tunnel an: [https://tunnelbroker.net Tunnelbroker]


==== HE Tunnel ====
<pre>
auto he-ipv6
iface he-ipv6 inet6 static
address EIGENE-IPv6_TUNNEL_IP/64
pre-up ip tunnel add $IFACE mode sit remote HE-IPV4 local EIGENE-IPv4 ttl 255


post-down ip tunnel del $IFACE
</pre>
==== Privates Peering ====
==== Privates Peering ====
(Beispiel, am Ende muss zusammen ausgehandelt werden wie man peert)
(Beispiel, am Ende muss zusammen ausgehandelt werden wie man peert)
Zeile 43: Zeile 36:


=== Bird config ===
=== Bird config ===
Dies ist nur eine funktionierende Beispielconfig:
Dies ist die Konfiguration von fff-zeus um die F3N Freifunk IP's zu announcen.
Die konkreten Werte müssen für ein eigenes Border-Gateway '''UNBEDINGT''' angepasst werden!
<pre>
<pre>
router id x.x.x.x; #z.b. eigene IPv4 Adresse
router id <ipv4-adresse>;
 
 
# Get interface information
protocol device {
    scan time 15;
}


# Export all known Routes into ft, which is used as default table
protocol kernel {
protocol kernel {
# learn;
scan time 15;
scan time 25;
device routes;
import all;
export all;
export all;
kernel table 100;
kernel table 100;
}
}


protocol device {
# Identify F3N IP's
scan time 15;
filter net_f3n {
    if (net ~ <prefix_to_announce_routes_inside>) then {
        # route is inside F3N Prefix
        if (net.len != 48) then {
            # add penalty to less backup-routes
            bgp_path.prepend(205100);
            bgp_path.prepend(205100);
}
        accept;
    } else {
        reject;
    }
}
 
# Configure F3N IP's static
protocol static static_f3n {
    import all;
    route <prefix_to_announce> reject;
}
}


protocol static {
protocol bgp he {
import all;
    local as <local_as>;
route  v6Subnetz/48 via "INTERFACE"; #v6Subnetz/48 durch das eigene Subnetz und Interface durch das Peering Interface ersetzen
    source address <peering_ip_local>;
    neighbor <peering_ip_remote> as <remote_as>;
    import all;
    export filter net_f3n;
}
}
</pre>
Einzelne Protokolle können ab/aufgewertet werden. Dazu ist folgender Schalter in das Protokoll mit einzubauen:
<pre>
    default bgp_local_pref 10;
</pre>
* default ist 100
* kleiner ist niedrigere Prio, höher ist höhere Prio.
Paar wichtige CLI Befehle rund um bird:


* birdc6 show route export $PROTOCOL
* birdc6 show protocols all
* birdc6 show route protocol $PROTOCOL primary
== Babel ==


function network_he() {
=== Babel config ===
return net ~ [  
Die Babelconfig kann so aussehen:
    v6Subnetz/48  #v6Subnetz/48 durch das eigene Subnetz ersetzen
<pre>
];
[...]
}
redistribute local ip <prefix_to_announce_local_addresses_from>
redistribute local deny
redistribute ip ::/0 src-ip <only_match_src_specific_routes_inside_this_prefix> src-eq <and_this_src_prefix_length>
redistribute ip ::/0 src-ip <only_match_src_specific_routes_inside_this_prefix> metric 512    # backup-route
[...]
</pre>
 
 
=== Babel Interface ===
 
Die Konfiguration eines babel-Interface kann so aussehen:
<pre>
auto ens7
iface ens7 inet6 manual


# to f3n
post-up ip -6 rule add to 2a0b:f4c0::/40 pref 5000 lookup fff
pre-down ip -6 rule del to 2a0b:f4c0::/40 pref 5000 lookup fff


protocol bgp WÄHLBARER_NAME {
# from f3n
local as OWNAS;
post-up ip -6 rule add from 2a0b:f4c0::/40 pref 1000 lookup ft
source address OWN_PEERING_IP;
pre-down ip -6 rule del from 2a0b:f4c0::/40 pref 1000 lookup ft
neighbor NEIGHBOR_IP as NEIGHBOR_AS;
post-up ip -6 rule add from 2a0b:f4c0::/40 pref 5000 lookup fff
import all;
pre-down ip -6 rule del from 2a0b:f4c0::/40 pref 5000 lookup fff
export filter {
# here we export the whole net
if network_he() then {
accept;
}
reject;
};


}


# add default routes for fff
post-up ip -6 route replace default from <default_src_prefix> dev $IFACE table fff proto static
pre-down ip -6 route del default from <default_src_prefix> dev $IFACE table fff proto static
# less specific (fallback)
post-up ip -6 route replace default from 2a0b:f4c0::/40 dev $IFACE table fff proto static
pre-down ip -6 route del default from 2a0b:f4c0::/40 dev $IFACE table fff proto static
</pre>


protocol bgp cd {
Mit dieser Konfiguration ist eine default-Route für das <default_src_prefix> nun im ganzen Babelnetz bekannt und jeder kann theoretisch im Babelnetz sich nun daraus Subnetze "herausziehen" und z.b. in eine Hood weiter verteilen.
local as OWNAS;
Hier muss noch diskutiert werden ob und wie das ganze am sinnvollsten gefiltert werden sollte.
source address OWN_PEERING_IP;
neighbor NEIGHBOR_IP as NEIGHBOR_AS;
import all;
export filter {
# here we export the whole net
if network_he() then {
accept;
}
reject;
};


}
== Freifunk Gateway IPv6 verteilen ==


Wie oben bereits gesagt, kann nun aus diesem verteilten Netzblock von oben auf jedem anderen Server im L3 Netz ein /64 herausgezogen und in eine Hood verteilt werden. Dazu ist es zwingend nötig das auf dem ganzen Peeringweg zum BGP Gateway mindestens an jeden GRE Interface die Rule:
* post-up ip -6 rule add iif $IFACE table fff
dran hängt. Dies ist mittlerweile auch in der Gateway Anleitung fest geschrieben war aber früher nie der Fall.
Sinnvoll ist natürlich jederzeit ein direktes Peering und dann auch eine Peering IP (am besten eine /128 aus dem Subnetz) auf dem GRE Interface.
Ein Babel Peeringinterface kann z.b. dann so aussehen:
<pre>
iface eth1 inet6 static
address OWN_PEERING_IP/128
post-up ip -6 rule add from all iif eth1 lookup fff
ip -6 rule add from all to OWN_SUBNET/48 lookup fff
</pre>
</pre>


== Babel ==
schon jetzt sollte das BGP Gateway erreichbar sein.
 
Danach nimmt man sich aus dem /48 ein /64 (falls man das BGP Gateway nicht selbst betreibt nach Rückfrage mit dem Betreiber, da dieser evtl. filtert!) und hängt sich davon eine IP ans batX Interface, setzt eine Route in die fff Tabelle und verteilt per radvd RA's in die Hood:


=== Babel config ===
batX:
Die Babelconfig sollte so aussehen:
<pre>
<pre>
[...]
[...]
redistribute local ip 10.50.0.0/16
post-up ip -6 route add OWN_SUBNET:1::/64 dev $IFACE proto static tab fff
redistribute local ip 10.83.0.0/16
post-up ip -6 rule add iif batX lookup fff
redistribute local ip fd43:5602:29bd::/48
post-up ip -6 rule add from OWN_SUBNET/48 lookup fff
redistribute local ip OWN_IP_SUBNET # eigenes Public Subnetz
post-up ip -6 addr add OWN_SUBNET:1::1/64 dev batX
redistribute local deny
redistribute ip 10.50.0.0/16
redistribute ip 10.83.0.0/16
redistribute ip fd43:5602:29bd::/48
redistribute ip ::/0
[...]
[...]
</pre>
</pre>


=== Babel Interface ===
Babel muss auch noch ein bisschen erweitert werden:
<pre>
<pre>
iface lo inet manual
redistribute local ip 10.50.0.0/16
        up ip rule add to 10.0.0.0/8 lookup fff
redistribute local ip 10.83.0.0/16
        up ip rule add to 172.20.0.0/14 lookup fff
redistribute local ip fd43:5602:29bd::/48
        up ip -6 rule add to fc00::/7 lookup fff
redistribute local ip OWN_NET::/32
redistribute local deny
redistribute ip 10.50.0.0/16
redistribute ip 10.83.0.0/16
redistribute ip 144.76.70.189/32
redistribute ip fd43:5602:29bd::/48
redistribute ip OWN_NET::/32
</pre>
</pre>


Dies muss für jedes Babel Interface gemacht werden:
Es wird dringend empfohlen Babel 1.8 zu installieren. Gibt babeld --v keine Version mit aus ist auf jeden Fall <1.7 installiert.
<pre>
Achtung:
auto ens7
Das Init Script von den Debian Repos zeigt auf ein anderes Verzeichnis als wenn man Babel selbst baut. Entweder die Binary ins richtige Verzeichnis kopieren oder das Init Script anpassen!
iface ens7 inet6 static
 
address OWN_PEERING_IP/128
Version kann man auch herausfinden wenn man sich mit nc ::1 33123 auf die Babelkonsole verbindet, dort wir die aktuell laufende Version ausgegeben.


# rules
post-up ip -6 rule add to OWN_SUBNET/48 lookup fff priority 1000
post-up ip -6 rule add from OWN_SUBNET/48 lookup ft priority 2000
pre-down ip -6 rule del to OWN_SUBNET/48 lookup fff priority 1000
pre-down ip -6 rule del from OWN_SUBNET/48 lookup ft priority 2000


# route
/etc/radvd.conf:
post-up ip -6 route add unreachable OWN_SUBNET/48 table fff
<pre>
post-down ip -6 route del unreachable OWN_SUBNET/48 table fff
interface batX {
        AdvSendAdvert on;
        MinRtrAdvInterval 60;
        MaxRtrAdvInterval 300;
        AdvDefaultLifetime 600;
        prefix OWN_SUBNET:1::/64 {
                AdvOnLink on;
                AdvAutonomous on;
        };
};


# route
post-up ip -6 route add default from OWN_SUBNET/48 dev $IFACE table fff proto static
pre-down ip -6 route del default from OWN_SUBNET/48 dev $IFACE table fff proto static
</pre>
</pre>

Version vom 28. Juli 2019, 13:22 Uhr


In dieser Anleitung geht es darum, wie man BGP spricht und diese Routen ins Babel verteilt, um Adressen aus einem eigenen AS für Freifunk zur Verfügung zu stellen.

Das ganze ist alles noch im Aufbau und die Anleitung ist auch den ersten Livesystem entstanden. Es kann durchaus sein, das hier noch viel Optimierungspotential vorhanden ist.

Grundlegendes

  • Routing im Linux aktivieren
  • Wir legen 2 Kernel Routingtabellen an. In einer landet der Freifunk Kram in der anderen die Internet Routen.

Bird installieren und einrichten

bird installieren.

apt-get install bird

Peering Interfaces

Es muss ein Partner vorhanden sein, mit dem man BGP sprechen kann. Entweder direkt oder per Tunnel. HE bietet kostenlos einen entsprechenden Tunnel an: Tunnelbroker


Privates Peering

(Beispiel, am Ende muss zusammen ausgehandelt werden wie man peert)

auto cd-bgp
iface cd-bgp inet6 static
	address EIGENE-IPv6_TUNNEL_IP/64
	pre-up ip tunnel add $IFACE mode ip6gre remote PARTNER-PUBLIC-IP local EIGENE_PUBLIC_IP ttl 255
	post-down ip tunnel del $IFACE

#       --------
#      /|_| |_| \       o
#     |         |   o
#      --O---O--==

Bird config

Dies ist die Konfiguration von fff-zeus um die F3N Freifunk IP's zu announcen. Die konkreten Werte müssen für ein eigenes Border-Gateway UNBEDINGT angepasst werden!

router id <ipv4-adresse>;


# Get interface information
protocol device {
    scan time 15;
}

# Export all known Routes into ft, which is used as default table
protocol kernel {
	scan time 15;
	export all;
	kernel table 100;
}

# Identify F3N IP's
filter net_f3n {
    if (net ~ <prefix_to_announce_routes_inside>) then {
        # route is inside F3N Prefix
        if (net.len != 48) then {
            # add penalty to less backup-routes
            bgp_path.prepend(205100);
            bgp_path.prepend(205100);
	}
        accept;
    } else {
        reject;
    }
}

# Configure F3N IP's static
protocol static static_f3n {
    import all;
    route <prefix_to_announce> reject;
}

protocol bgp he {
    local as <local_as>;
    source address <peering_ip_local>;
    neighbor <peering_ip_remote> as <remote_as>;
    import all;
    export filter net_f3n;
}

Einzelne Protokolle können ab/aufgewertet werden. Dazu ist folgender Schalter in das Protokoll mit einzubauen:

    default bgp_local_pref 10;
  • default ist 100
  • kleiner ist niedrigere Prio, höher ist höhere Prio.

Paar wichtige CLI Befehle rund um bird:

  • birdc6 show route export $PROTOCOL
  • birdc6 show protocols all
  • birdc6 show route protocol $PROTOCOL primary

Babel

Babel config

Die Babelconfig kann so aussehen:

[...]
redistribute local ip <prefix_to_announce_local_addresses_from>
redistribute local deny
redistribute ip ::/0 src-ip <only_match_src_specific_routes_inside_this_prefix> src-eq <and_this_src_prefix_length>
redistribute ip ::/0 src-ip <only_match_src_specific_routes_inside_this_prefix> metric 512    # backup-route
[...]


Babel Interface

Die Konfiguration eines babel-Interface kann so aussehen:

auto ens7
iface ens7 inet6 manual

	# to f3n
	post-up ip -6 rule add to 2a0b:f4c0::/40 pref 5000 lookup fff
	pre-down ip -6 rule del to 2a0b:f4c0::/40 pref 5000 lookup fff

	# from f3n
	post-up ip -6 rule add from 2a0b:f4c0::/40 pref 1000 lookup ft
	pre-down ip -6 rule del from 2a0b:f4c0::/40 pref 1000 lookup ft
	post-up ip -6 rule add from 2a0b:f4c0::/40 pref 5000 lookup fff
	pre-down ip -6 rule del from 2a0b:f4c0::/40 pref 5000 lookup fff


	# add default routes for fff
	post-up ip -6 route replace default from <default_src_prefix> dev $IFACE table fff proto static
	pre-down ip -6 route del default from <default_src_prefix> dev $IFACE table fff proto static
	# less specific (fallback)
	post-up ip -6 route replace default from 2a0b:f4c0::/40 dev $IFACE table fff proto static
	pre-down ip -6 route del default from 2a0b:f4c0::/40 dev $IFACE table fff proto static

Mit dieser Konfiguration ist eine default-Route für das <default_src_prefix> nun im ganzen Babelnetz bekannt und jeder kann theoretisch im Babelnetz sich nun daraus Subnetze "herausziehen" und z.b. in eine Hood weiter verteilen. Hier muss noch diskutiert werden ob und wie das ganze am sinnvollsten gefiltert werden sollte.

Freifunk Gateway IPv6 verteilen

Wie oben bereits gesagt, kann nun aus diesem verteilten Netzblock von oben auf jedem anderen Server im L3 Netz ein /64 herausgezogen und in eine Hood verteilt werden. Dazu ist es zwingend nötig das auf dem ganzen Peeringweg zum BGP Gateway mindestens an jeden GRE Interface die Rule:

  • post-up ip -6 rule add iif $IFACE table fff

dran hängt. Dies ist mittlerweile auch in der Gateway Anleitung fest geschrieben war aber früher nie der Fall. Sinnvoll ist natürlich jederzeit ein direktes Peering und dann auch eine Peering IP (am besten eine /128 aus dem Subnetz) auf dem GRE Interface. Ein Babel Peeringinterface kann z.b. dann so aussehen:

iface eth1 inet6 static
address OWN_PEERING_IP/128
post-up ip -6 rule add from all iif eth1 lookup fff
ip -6 rule add from all to OWN_SUBNET/48 lookup fff

schon jetzt sollte das BGP Gateway erreichbar sein.

Danach nimmt man sich aus dem /48 ein /64 (falls man das BGP Gateway nicht selbst betreibt nach Rückfrage mit dem Betreiber, da dieser evtl. filtert!) und hängt sich davon eine IP ans batX Interface, setzt eine Route in die fff Tabelle und verteilt per radvd RA's in die Hood:

batX:

[...]
post-up ip -6 route add OWN_SUBNET:1::/64 dev $IFACE proto static tab fff
post-up ip -6 rule add iif batX lookup fff
post-up ip -6 rule add from OWN_SUBNET/48 lookup fff 
post-up ip -6 addr add OWN_SUBNET:1::1/64 dev batX
[...]

Babel muss auch noch ein bisschen erweitert werden:

 redistribute local ip 10.50.0.0/16
 redistribute local ip 10.83.0.0/16
 redistribute local ip fd43:5602:29bd::/48
 redistribute local ip OWN_NET::/32
 redistribute local deny
 redistribute ip 10.50.0.0/16
 redistribute ip 10.83.0.0/16
 redistribute ip 144.76.70.189/32
 redistribute ip fd43:5602:29bd::/48
 redistribute ip OWN_NET::/32

Es wird dringend empfohlen Babel 1.8 zu installieren. Gibt babeld --v keine Version mit aus ist auf jeden Fall <1.7 installiert. Achtung: Das Init Script von den Debian Repos zeigt auf ein anderes Verzeichnis als wenn man Babel selbst baut. Entweder die Binary ins richtige Verzeichnis kopieren oder das Init Script anpassen!

Version kann man auch herausfinden wenn man sich mit nc ::1 33123 auf die Babelkonsole verbindet, dort wir die aktuell laufende Version ausgegeben.


/etc/radvd.conf:

interface batX {
        AdvSendAdvert on;
        MinRtrAdvInterval 60;
        MaxRtrAdvInterval 300;
        AdvDefaultLifetime 600;
        prefix OWN_SUBNET:1::/64 {
                AdvOnLink on;
                AdvAutonomous on;
        };
};