Eins vorweg: Diese Anleitung ist noch nicht fertig, wird aber, wie die Bootserver-Anleitung, noch wachsen. Feedback und konstruktive Kritik sind erwünscht.
Moin,
in dieser Anleitung möchte ich euch zeigen, wie ihr einen Linux-Rechner als DSL-Router einsetzen könnt. Der Router routet dann nicht nur, sondern macht direkt auch Firewalling.
Was wird gebraucht? / Hardware
- Computer mit Linux, in diesem Falle Ubuntu Server 12.04
- Zwei Netzwerkkarten
- DSL-Modem
- Switch
Wenn wir das nun alles zusammen haben, verbinden wir die eine Netzwerkkarte mit dem Switch (an dem dann auch die anderen Rechner hängen) sowie dem DSL-Modem.
In diesem Beispiel ist eth0 für unser LAN zuständig und eth1 hängt am DSL-Modem. Sobald die DSL-Verbindung hergestellt wird, kommt das Internet über PPP0.
Im Voraus MUSS das Paket pppoeconf installiert werden: sudo apt-get install pppoeconf
Die Netzwerkeinstellungen
Ich gehe einfach mal davon aus, dass unser LAN einen IP-Adressbereich von 192.168.1.0/24 haben soll (also von 192.168.1.1 bis 192.168.1.254). Dazu passen wir die Datei /etc/network/interfaces an.
sudo -smv /etc/network/interfaces /etc/network/interfaces_altvi /etc/network/interfaces
dann in die neue Datei folgendes rein:
auto loiface lo inet loopback
auto eth0iface eth0 inet static address 192.168.1.1 netmask 255.255.255.0 network 192.168.1.0
auto eth1
Und das ganze mittels restart networking übernehmen. Damit ist dann schon mal die Netzwerkkarte konfiguriert, die für das LAN genutzt wird.
Die PPP-Verbindung
Nun richten wir die eigentliche DSL-Verbindung ein. Debian und Ubuntu bieten hierfür einen hervorragenden Assistenten namens pppoeconf. Die Fragen des Assistenten sind eigentlich selbsterklärend. Wir starten den Einrichtungsassistenten mittels pppoeconf
Wichtig ist hier der Benutzername. Bei T-Online lautet er AnschlusskennungTonlineNummer#0001@t-online.de
Bei anderen Providern am besten mal in deren FAQs gucken.
Falls Fehler auftreten, stehen nach Eingabe des Befehls plog weitere Infos zur Verfügung.
Hergestellt wird die DSL-Verbindung mittels pon dsl-provider (das heißt wirklich dsl-provider, hier mus sman nichts einsetzen)
Trennen kann man die Verbindung mittels poff -a
Damit die Verbindung bei jedem Boot automatisch hergestellt wird, machen wir wieder die /etc/rc.local im Editor auf und setzen eine Zeile über exit 0 die Zeile pon dsl-provider ein.
Das Routing-Script
Damit unser Router brav routet, müssen wir ein kleines Script mit Routing- und Firewallregeln erstellen. Ich nenne es in diesem Falle einfach mal /usr/local/bin/routing.sh.
vi /usr/local/bin/routing.sh
Folgendes kommt rein:
#!/bin/bash
# Erstmal alle Regeln flushen/leeren...iptables -Fiptables -t nat -F
# ...und Forwarding aktivierenecho 1 > /proc/sys/net/ipv4/ip_forward
# Routing von ppp0 nach eth0 + NATiptables -t nat -A POSTROUTING -o ppp0 -d 0.0.0.0/0 -j MASQUERADE
# Antworten auf Paketanfragen erlauben (Kann man prima am State nachschauen lassen)iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# ICMP erlauben (wichtig für ping, traceroute und co)iptables -A INPUT -p icmp -j ACCEPT
# Auf Loopback darf alles rein und rausiptables -A INPUT -i lo -j ACCEPTiptables -A OUTPUT -o lo -j ACCEPT
# Raus ins Internet darf allesiptables -A OUTPUT -o ppp0 -j ACCEPT
# Im LAN ist auch alles erlaubtiptables -A OUTPUT -o eth0 -j ACCEPTiptables -A INPUT -i eth0 -j ACCEPT
# Sonstige eingehende Pakete ablehneniptables -A INPUT -i ppp0 -j REJECT
Nachdem wir das ganze gespeichert haben, müssen wir es noch ausführbar machen.
chmod +x /usr/local/bin/routing.sh
Damit das Routing nach jedem Boot läuft, tragen wir unser Script noch in die /etc/rc.local ein.
vi /etc/rc.local
Hier setzen wir vor der Zeile "exit 0" noch folgende Zeile ein:
/usr/local/bin/routing.sh
(den Dateinamen natürlich anpassen, wenn ihr das Script anders genannt habt)
Erster Test
Jetzt wollen wir das ganze mal testen. Am besten den Server mal kurz neu starten, dann sieht man auch, ob die rc.local durchläuft. Wenn der Server hochgefahren ist, gehen wir mal an einen der Client-PCs und stellen dort als IP einfach mal 192.168.1.2 ein, als Gateway dient die 192.168.1.1 und als DNS-Server 8.8.8.8
Nachdem wir das eingetragen haben, prüfen wir einfach mal, ob wir das Internet nutzen können.
DSL-Reconnect nach Zwangstrennung
Nach 24 Stunden machen die DSL-Provider eine Zwangstrennung, das ist unvermeidlich. Wir werden diese Zwangstrennung auf 3 Uhr morgens verlegen und dann um diese Zeit einen Reconnect durchführen.
Dazu legen wir als erstes ein kleines Script an.
vi /usr/local/bin/zwangstrennung.sh
Folgender Inhalt kommt rein:
#!/bin/bashpoff -apon dsl-provider
Und noch ausführbar machen: chmod +x /usr/local/bin/zwangstrennung.sh
Jetzt müssen wir noch dafür sorgen, dass das Script jedes Mal um 3 Uhr morgens ausgeführt wird.
vi /etc/crontab
Und folgendes in eine neue Zeile rein:
* 3 * * * root /usr/local/bin/zwangstrennung.sh
Und den cron-Daemon neu starten: restart cron
Portweiterleitungen
Oft kommt es vor, dass wir auf einem der Clients Serverdienste laufen lassen wollen, die von außen erreichbar sein sollen. Hierzu ist eine Portweiterleitung nötig. Diese fügen wir einfach in unsere /usr/local/bin/routing.sh hinzu:
Beispiel:
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2:80
Hier wird der Port 80 (TCP) der Maschine 192.168.1.2 weitergeleitet, sodass auf Port 80 (TCP) der öffentlichen IP vom DSL der Port 80 (TCP) von 192.168.2.2 erreichbar ist. Für UDP einfach udp statt tcp hinschreiben.
Portfreigaben direkt am Router
Wenn irgendwelche auf dem Router laufende Serverdienste aus dem Internet erreichbar sein sollen, kann man folgendermaßen Ports freigeben:
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
In diesem Fall handelt es sich um Port 80 (TCP). Für UDP einfach udp statt tcp hinschreiben.
DHCP-Server
Da viele sicherlich keine Lust haben, auf den Clients die IP manuell einzustellen, bietet es sich an, einen DHCP-Server laufen zu lassen. Das ist einfacher als es klingt und schnell erledigt.
Erstmal installieren: apt-get install isc-dhcp-server
Und folgendes rein in die /etc/dhcp3/dhcpd.conf:
ddns-update-style none;default-lease-time 315360000;max-lease-time 315360000;authoritative;log-facility local7;
# Später hilfreich, sobald wir DNS haben: Domain (jetzt noch auskommentiert, später wirds gebraucht)# option domain-name "meinnetz.lan";
subnet 192.168.1.0 netmask 255.255.255.0{ range 192.168.1.2 192.168.1.254; option routers 192.168.1.1; # später wenn wir DNS haben kommt da natürlich 192.168.1.1 hin. option domain-name-servers 8.8.8.8;}
Wenn wir für einen Rechner eine IP reservieren wollen (sprich dafür sorgen, dass er immer diese bekommt), geht das mit folgendem Vierzeiler:
host milka { hardware ethernet 08:00:ca:ff:ee; fixed-address 192.168.1.23; }
In diesem Fall wird dem Host Milka mit der MAC-Adresse 08:00:ca:ff:ee die IP 192.168.1.23 zugewiesen.
Schlussendlich starten wir noch den DHCP-Server neu: restart isc-dhcp-server
Facebook blockieren
Hier mal kurz ein paar Zeilen für die /usr/local/bin/routing.sh, um Facebook zu blockieren:
# Für Facebook gibts eine extra Chainiptables -N FACEBOOK
# Die IP-Ranges könnten sich ändern, dann anpassen ;)iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 66.220.144.0-66.220.159.255 --dport 443 -j FACEBOOKiptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 69.63.176.0-69.63.191.255 --dport 443 -j FACEBOOKiptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 69.171.224.39-69.171.224.39 --dport 80 -j FACEBOOK iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 69.171.224.39-69.171.224.39 --dport 443 -j FACEBOOK iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 204.15.20.0-204.15.23.255 --dport 443 -j FACEBOOKiptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 66.220.144.0-66.220.159.255 --dport 80 -j FACEBOOKiptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 69.63.176.0-69.63.191.255 --dport 80 -j FACEBOOKiptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 204.15.20.0-204.15.23.255 --dport 80 -j FACEBOOK
# Sonderregelung für Kisten die dürfen (nach belieben erweitern oder ganz weglassen)iptables -A FACEBOOK -s 192.168.1.2 -j ACCEPTiptables -A FACEBOOK -s 192.168.1.3 -j ACCEPT
# Die anderen Rechner vor Facebook schützeniptables -A FACEBOOK -j DROP
WLAN-Accesspoint
Hierfür benötigen wir eine WLAN-Karte, die sich unter Linux in den Master-Modus bringen läßt. Am besten mal beim jeweiligen Hersteller nachfragen.
Als erstes installieren wir das Paket hostapd
apt-get install hostapd
Und folgendes in die Datei /etc/hostapd.conf schreiben:
# Das Interface der WLAN-Karteinterface=wlan0
# Der zu verwendende Treiber (hängt von der Karte ab)driver=nl80211
# Logging aktivierenlogger_stdout=1logger_stdout_level=2
# Unsere Einstellungen für das WLANssid=MerlinNethw_mode=gchannel=4auth_algs=3
# Maximale Clientanzahl. Wenn keine Begrenzung da sein soll, die Zeile einfach weglassenmax_num_sta=5
# Verschlüsselungwpa=2wpa_passphrase=rennmausfutterwpa_key_mgmt=WPAPSKwpa_pairwise=TKIP CCMPrsn_pairwise=CCMP
Anschließend starten wir hostapd mittels restart hostapd neu.
DNS-Server
Natürlich wollen wir die Rechner in unserem LAN auch mit Namen ansprechen! Dazu brauchen wir einen DNS-Server.
Also installieren wir das Paket dnsmasq mittels sudo apt-get install dnsmasq
Nun brauchen wir einen Domänen-Namen. Ich nenne die Domain einfach mal euda.lan
Jetzt tragen wir die DNS-Einträge einfach in die /etc/hosts des Servers ein. In diesem Beispiel einfach mal zwei Einträge.
sudo vi /etc/hosts192.168.1.1 poco.euda.lan poco192.168.1.2 sternchen.euda.lan sternchen192.168.1.3 merlin.shadownet.lan merlin
Nun brauchen wir noch einen DNS-Server, den unser DNS fragt, wenn er Einträge nicht kennt (etwa vom Internet)
Also bearbeiten wir wieder unsere /etc/network/interfaces und ändern sie entsprechend ab (in diesem Falle mit Googles DNS-Server, siehe fettgedrucktes):
auto loiface lo inet loopback
auto eth0iface eth0 inet static address 192.168.1.1 netmask 255.255.255.0 network 192.168.1.0 [b]dns-nameservers 8.8.8.8[/b]auto eth1
Nun noch mit sudo /etc/init.d/networking restart den Netzwerkkram neu starten.
Jetzt haben wir zwar einen DNS-Server, aber die andern Rechner wissen garnicht, dass sie diesen nutzen sollen. Also bearbeiten wir noch schnell unsere /etc/dhcp3/dhcpd.conf:
Hier ändern wir
option domain-name-servers 8.8.8.8;
in
option domain-name-server 192.168.1.1;
ab und speichern sie.
Nun noch DHCP und DNS neu starten:
sudo /etc/init.d/isc-dhcp-server restartsudo /etc/init.d/dnsmasq restart
Und nun haben wir auch DNS
Dynamisches DNS mittels No-IP.org
Jetzt wo alles fertig ist, möchten wir vielleicht auch noch Serverdienste betreiben. Da nervt es natürlich unglaublich, jedes mal die IP durchzugeben, die sich auch noch alle 24 Stunden ändert. Da wäre es doch toll, den Server immer unter einer Domain erreichbar zu haben, die immer die aktuelle IP hat. Nichts leichter als das! Wir registrieren und zunächst auf der Webseite http://www.no-ip.org für einen Account. Wenn wir das gemacht haben, brauchen wir den passenden Client. Also denn:
wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gztar -xvf noip-duc-linux.tar.gz
Bei x86-Systemen:
sudo cp noip-2.1.9-1/binaries/noip2-i686 /usr/local/bin/noip2
Bei x86_64-Systemen:
sudo cp noip-2.1.9-1/binaries/noip2-x86_64 /usr/local/bin/noip2
sudo chmod +x /usr/local/bin/noip2
Jetzt konfigurieren wir noip2:
sudo noip2 -C
Wenn wir alle Fragen beantwortet haben, machen wir uns noch einen Eintrag in unsere /etc/rc.local (natürlich eine Zeile über dem exit 0):
/usr/local/bin/noip2
Das wars dann auch schon, nun sollte es funzen.
Coming soon (ohne feste Reihenfolge):
- Basteln eines Webinterfaces (Au je, das wird noch Arbeit!)