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 -s
mv /etc/network/interfaces /etc/network/interfaces_alt
vi /etc/network/interfaces
dann in die neue Datei folgendes rein:
auto lo
iface lo inet loopback
auto eth0
iface 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 -F
iptables -t nat -F
# ...und Forwarding aktivieren
echo 1 > /proc/sys/net/ipv4/ip_forward
# Routing von ppp0 nach eth0 + NAT
iptables -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 raus
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Raus ins Internet darf alles
iptables -A OUTPUT -o ppp0 -j ACCEPT
# Im LAN ist auch alles erlaubt
iptables -A OUTPUT -o eth0 -j ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT
# Sonstige eingehende Pakete ablehnen
iptables -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/bash
poff -a
pon 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 Chain
iptables -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 FACEBOOK
iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 69.63.176.0-69.63.191.255 --dport 443 -j FACEBOOK
iptables -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 FACEBOOK
iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 66.220.144.0-66.220.159.255 --dport 80 -j FACEBOOK
iptables -I FORWARD -m tcp -p tcp -m iprange --dst-range 69.63.176.0-69.63.191.255 --dport 80 -j FACEBOOK
iptables -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 ACCEPT
iptables -A FACEBOOK -s 192.168.1.3 -j ACCEPT
# Die anderen Rechner vor Facebook schützen
iptables -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-Karte
interface=wlan0
# Der zu verwendende Treiber (hängt von der Karte ab)
driver=nl80211
# Logging aktivieren
logger_stdout=1
logger_stdout_level=2
# Unsere Einstellungen für das WLAN
ssid=MerlinNet
hw_mode=g
channel=4
auth_algs=3
# Maximale Clientanzahl. Wenn keine Begrenzung da sein soll, die Zeile einfach weglassen
max_num_sta=5
# Verschlüsselung
wpa=2
wpa_passphrase=rennmausfutter
wpa_key_mgmt=WPAPSK
wpa_pairwise=TKIP CCMP
rsn_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/hosts
192.168.1.1 poco.euda.lan poco
192.168.1.2 sternchen.euda.lan sternchen
192.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 lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.1.1
netmask 255.255.255.0
network 192.168.1.0
dns-nameservers 8.8.8.8
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 restart
sudo /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.gz
tar -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!)