Layer2 bridge over ssh

De fleste bredbåndsudbydere har en eller anden ide om at “almindelige forbrugere” aldrig nogensinde kan have brug for mere end én ip adresse, hvis det er rigtigt slemt kan de lige anstrenge sig til at give dig 5 … men aldrig uden bøvl.

Derudover er 5 ip adresser da ved gud heller ikke særlig meget, jeg mener, hvis du skal emulere bare et mellemstort hosting-setup så løber du tør for ip adresser langt hurtigere end det.

Set i lyset af det, og så det at vi på vores nye kontor i Århus kun har en 111/11 mbit linie fra Stofa med én fast ip adresse på, så besluttede jeg mig at bruge lidt tid på at finde en elegant løsning på det problem, og jeg syntes selv det gik ret godt.

Jeg har købt en server hos Hetzner, nu havde vi i forvejen behov for en server men hvis ikke du har det kan du nøjes med at købe den mindste de har, de starter ved 19€/mdr dertil kommer 37 € for yderligere 32 IP-Adresser, eller dvs. det er ifølge prislisten, i realiteten er jeg aldrig blevet faktureret ekstra for IP-Adresser, jeg ved ikke om det er en fejl eller om det er politik ved gode kunder,men jeg har ihvertfald ikke tænkt mig at spørge dem, man kunne jo risikere det var en fejl ?

IP Adresserne får du tildelt i ranges og de bliver routed ind, i modsætning til mange andre steder hvor udbyderen enten har ét stort netværks segment eller laver routingen for dig. Jeg fik rangen 78.46.137.32/27, hvilket betyder at jeg har ip adresserne 78.46.137.32 – 78.46.137.63 tilrådighed, og så får man selvfølgelig også en fin whois med eget navn og adresse i, samt mulighed for at skrive en note om f.eks. abuse:

inetnum:         78.46.137.32 - 78.46.137.63
netname:         MIKJAER-APS
descr:           www.mikjaer.com
country:         DE
admin-c:         MC18471-RIPE
tech-c:          MC18471-RIPE
status:          ASSIGNED PA
remarks:         For abuse and security related questions please 
                 contact abuse@mikjaer.com
mnt-by:          HOS-GUN
source:          RIPE # Filtered
 
person:          Mikkel Christensen
address:         Mikjaer Aps
address:         Vesterbrogade 74, 3sal
address:         1620 Koebenhavn V
address:         DENMARK
phone:           +4544401337
nic-hdl:         MC18471-RIPE
mnt-by:          HOS-GUN
source:          RIPE # Filtered

I den modsatte ende har jeg et netværk, med en router leveret af min udbyder som jeg ikke kan (vil) pille ved eller skifte ud, derfor har jeg valgt at jeg vil lave en Layer 2 bridge til mine ip-adresser, det gør jeg ved at tage en Linux maskine som sider på mit netværk og lave en tunnel til min maskine hos Hetzner, og eksponere min range overfor min bridge.

Først scriptet, og så gennemgår jeg det bagefter:

#!/bin/sh
echo Setting up interfaces
brctl addbr br0
brctl addif br0 eth0
ifconfig eth0 up
ifconfig br0 up
ifconfig br0 10.0.1.38/24 up
ifconfig br0:0 78.46.137.35/27 up
ip route add 85.10.210.229 via 10.0.1.1 dev br0
echo Waiting 10 seconds for bridge to settle
 
ping -c 4 85.10.210.229 > /dev/null
sleep 2
ping -c 4 85.10.210.229 > /dev/null
sleep 2
 
echo Tunneling to offshore
ssh -o Tunnel=ethernet -f -w 0:0 85.10.210.229 true
ifconfig tap0 up
brctl addif br0 tap0
sleep 3
echo Setting up routing
ssh 85.10.210.229 ifconfig tap0 78.46.137.34/27 up
route add default gw 78.46.137.34

Scriptet forudsætter at der er installeret SSH-Keys således at ssh kan etablere forbindelse uden at du skal taste din kode hver gang.

Linie 2 og 3 opretter bridge interfacet “br0” , du kan i princippet kalde det hvad du vil, men typisk kalder man det br0, bridge0 el. lign. Derefter (linie 5-8) upper vi vores interfaces og sætter ip adresser op på dem.

Som du kan se i linie 7 hedder mit lokalnet 10.0.1.1/24 og den ip adresse jeg har valgt til mit endpoint på kontoret hedder 78.46.137.35 og både interfaces og ip adresser skal helst være på plads før vores bridge etableres.

I linie 9 opsætter jeg en route til en enkelt ip adresse, nemlig ip adressen på vores server hos Hetzner, bemærk servere ligger helt uden for vores egen range. På den her måde kan vores lokale maskine nu kommunikere med vores server hos Hetzner, men også kún den. (hvilket inkluderer DNS, hvorfor vi netop bruger IP Adresser istedet for hostnames i scriptet).

Installer bridge-utils og kør scriptet:

# apt-get install bridge-utils

Broen skal nu have lidt tid til at finde til rette, jeg har ikke fundet nogen fornuftig forklaring på dette, ligesom jeg heller ikke kan svare på hvorfor mit workaround virker, men det virker ?

Så derfor i linie 10-16 holder vi brugeren lidt for nar mens vi pinger lidt og “sover” lidt, resultatet er at forbindelsen kommer op og bliver klar til linie 18 hvor vi opsætter selve Layer 2 tunellen til serveren.

Den kommando opretter automatisk et interface på hver maskine ved navn hhv. tap0 og tap0 (-w 0:0), i linie 19 up’er jeg interfacet og i linie 20 tilføjer jeg det til min bridge således at den nu “hænger sammen med” mit lan.

I linie 23 logger jeg på serveren i den anden ende igen, og opsætter tap0 interfacet på denne og til sidst afslutter jeg med at sætte default gateway … til maskinen i den anden ende. Efter et par sekunder burde du nu kunne pinge igennem vores fine nye “bro”, test evt. ved at pinge den ip der hos dig svarer til 78.46.137.35 fra en maskine ude på internettet eller evt. fra din telefon, næste skridt er at sætte det op til test på en af de maskiner i mit lab. som har behov for offentlige ip’er til test, og det blærede ved netop den her opsætning er at jeg nu kan sætte maskinerne op _fuldstændig_ som sad de direkte på de offentlige ip’er net.

# ifconfig eth0 78.46.137.45/27
# route add default gw 78.46.137.34

Og nu hvor broen er i luften kan jeg benytte samme fremgangsmåde til at få offentlige ip adresser på samtlige maskiner i kontoret / test lab.’et.

Hvis du gerne vil starte scriptet automatisk når maskinen booter så kald det fra /etc/rc.local … jeg orker ikke at skrive et initscript iaften, klokken er halv fire ?

Dette indlæg blev udgivet i Knowledge Base, Networking, Old Base. Bogmærk permalinket.

Skriv et svar