Überrouter
Uit DeVliegendeWiki
In 2009 hebben we een hotspot-infrastructuur aangelegd in een hotel. Daarbij hadden we het probleem, dat vroeg of laat besmette computers op dat netwerk zouden komen, en we dus traffic shaping moesten toepassen om te voorkomen dat de provder de verbinding zou verbreken. In oktober 2011 hadden we dezelfde situatie in een ander hotel.
Hiervoor hebben we een eigen router samengesteld. De router is een computer met twee netwerkkaarten, waarbij de eerte (eth0) verbonden wordt met de modem, en middels dhcp een ip-adres toegewezen krijgt. De andere netwerkkaart (eth1) heeft een vast ip-adres, zodat clients kunnen aanloggen. De router omvat een dhcp-server en een dns-server.
Dit artikel is voornamelijk gebaseerd op http://ubuntuforums.org/showthread.php?t=111972. In de volgende hoofdstukken worden diverse aspecten behandeld. Aan het eind van het hoofdstuk worden concrete configuraties behandeld.
Vergeet de crosscable niet: Wanneer je de NIC-poorten van twee computers met elkaar verbindt, heb je crosscables nodig. Anders doet-ie helemaal NIX, zefs geen lampjes. Zie ook Antamedia Bandwidth Manager - een verrassend Windows-alternatief.
De genummerde hoofdstukken behandelen installatie en configuratie. De overige hoofdstukken gaan overwegend over gebruik.
Inhoud |
Aan- en uitzetten
In mijn ervaring kun je een Überrouter probleemloos uitzetten door de voedingsstekker eruit te halen, en deze er daarna weer in te stoppen. Na een relatief lange tijd (bv. een minuut) zijn de netwerkverbindingen weer hersteld, en doet-ie 't weer.
1. Netwerkkaarten
- Neem een computer met twee netwerkkaarten;
- De NIC die het LAN bedient, is device eth1 en krijgt een vast IP-adres;
- Test de netwerkkaarten met bv. de volgende configuratie (/etc/network/interfaces):
# The loopback network interface # auto lo iface lo inet loopback # The primary network interface # auto eth0 iface eth0 inet dhcp # Test-configuratie voor eth1: # Werk-ie als deze verbonden is met de modem? auto eth1 iface eth1 inet dhcp
We gebruiken steeds dezelfde ip-ranges en -adressen.
De uiteindelijke netwerkconfiguratie (/etc/network/interfaces):
# The loopback network interface # auto lo iface lo inet loopback # The primary network interface # auto eth0 iface eth0 inet dhcp # eth1: NIC aan de client-kant, # met vast ip-adres # auto eth1 iface eth1 inet static address 172.16.255.254 netmask 255.255.255.0 network 172.16.255.0 broadcast 172.16.255.255 gateway 192.168.178.1 # Waarschijnlijk nu niet nodig omdat deze computer zelf DHCP-server is
2. DHCP-server
De DHCP-server kun je installeren middels:
apt-get install dhcp3-server
Voorbeeld /etc/dhcp3/dhcpd.conf:
# dhcpd.conf file
# Strompf - April 2009
#
ddns-update-style ad-hoc;
option domain-name "my-dhcp-server.com";
option domain-name-servers 176.16.0.1;
default-lease-time 60000000;
max-lease-time 720000000;
subnet 176.16.0.0 netmask 255.255.0.0 {
range 176.16.0.2 176.16.0.99;
option routers 176.16.0.1;
option broadcast-address 176.16.255.255;
}
Voorbeeld /etc/default/dhcp3-server:
# Defaults for dhcp initscript # sourced by /etc/init.d/dhcp # installed at /etc/default/dhcp3-server by the maintainer scripts # # This is a POSIX shell fragment # # On what interfaces should the DHCP server (dhcpd) serve DHCP requests? # Separate multiple interfaces with spaces, e.g. "eth0 eth1". INTERFACES="eth1"
3. Bind
Once you've got it working your ready to now setup DNS. DNS is a snap, all you should need to do is type, sudo apt-get install bind9 Boom you have a small DNS server on you box! This is so computers connecting to your router will be able to resolve web addresses based on their URL instead of their IP [1].
4. Masquerading
Now there is just one more thing needed, and thats a script enabling IP Masquerade. I was able to figure this out by consulting.... (by the way I highly recommended reading over their site, it's very comprehensive and was a key part in me figuring out how to get this to work) [2]. http://www.tldp.org/HOWTO/IP-Masquerade-HOWTO/
Masquerading wil zeggen dat computer die zich op een LAN bevinden, naar buiten toe via één publiekelijk IP-adres gerepresenteerd worden. Het zorgt ervoor dat computers binnen een LAN van buiten af onzichtbaar zijn. Daarnaast kan masquerading een belanrijke rol spelen in de beveiliging van een netwerk [3]. Masquerading lijkt op NAT, maar is net iets anders: bij NAT is er een 1:1-correspondentie tussen een extern poortnummer en een intern ip-adres en poortnummer. Bij masquerading is er een 1:veel-relatie tussen externe en interne ip-adressen.
5. Filteren
In de praktijk kan masquerading en filtering in één iptables-script gevoegd worden. Zie elders voor voorbeelden
6. Automatisch opstarten
1. Masquerading/iptables-scripts plaatsen in etc/iptables
2. In /etc/init.d een bestand iptables aanmaken dat verwijst naar het actuele script. bv.
#! /bin/sh # # Start script # /etc/iptables/script01
3. In de map van het betreffende runlevel een symbolische link maken naar het script in init.d. Normaliter is dat runlevel 2. Bv.:
sudo ln -sf ../init.d/iptables S80iptables
7. Laatste details
- Test dat de Überrouter ook werkt zonder toetsenbord;
- Hardisk-spindown zou prettig zijn. Misschien dat http://linux.die.net/man/8/hdparm kan helpen;
- Test dat de Überrouter het gewoon weer doet als je 'm hardhandig uit- en aanzet.
Wat filteren?
Het doel van de Überrouter is om ongewenst verkeer van besmette computers tegen te houden. Tja, wat is precies gewenst en ongewenst?
Telfort
Dit is wat Telfort adviseert:
Wij adviseren alles behalve 80 en 443 te filteren en zelfs dat met een proxy ertussen welke de content op virussen scant.
Port 443 wordt gebruikt voor https. Alleen die twee poorten openen, is draconisch. Die opmerking van die proxy is wel interessant, maar maakt het probleem verrekte lastig: Nu moet je op grotere schaal filteren dan alleen in losse pakketjes. En je moet een virusscanner gebruiken. Misschien iets voor Squid, of voor kant-en-klare virusscanners?
Toestaan
- WWW
- POP/IMAP
- FTP
- SSH
- Ping en vergelijkbare commando's
- Skype
- SMTP via poort 465 (SSL)
Ongewenst
- NetBIOS-trio
Filteren
- SMTP via poort 25
iptables
Dit is slechts een voorbeeldscript voor traffic shaping en masquerading.
#!/bin/sh # WAN="eth0" LAN="eth1" # --------------------------------------- # Verwijder alle iptables-instellingen # --------------------------------------- # # Verwijder alle chains & tables: # iptables -F iptables -F INPUT iptables -F OUTPUT iptables -F FORWARD iptables -F -t mangle iptables -F -t nat iptables -F -t filter # Verwijder eventuele chains die door gebruikers zijn aangemaakt: # iptables -X # ----------------------------------------------------------- # Defineer default policies # ----------------------------------------------------------- # Let op: Deze policies zijn op zichzelf onvoldoende om een # functionerend systeem te hebben: Je moet additionele regels # toevoegen. # iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT # ----------------- # SMTP dichtzetten # ----------------- # iptables -A INPUT -p tcp -i $LAN --dport 25 -j DROP iptables -A OUTPUT -p tcp -o $WAN --dport 25 -j DROP iptables -A INPUT -p tcp -i $LAN --sport 25 -j DROP iptables -A OUTPUT -p tcp -o $WAN --sport 25 -j DROP iptables -A FORWARD -p tcp -i $LAN --dport 25 -j DROP iptables -A FORWARD -p tcp -i $LAN --dport 25 -j DROP # Bron: http://www.cyberciti.biz/tips/linux-iptables-15-how-to-block-or-open-mail-serversmtp-protocol.html iptables -A INPUT -p tcp -s 0/0 --sport 1024:65535 --dport 25 -m state --state NEW,ESTABLISHED -j REJECT # -------------------------------------- # Sta SSH toe (zowel vanaf LAN als WAN) # -------------------------------------- # Omdat geen table wordt meegegeven, is dit automatisch 'filter'. # Er wordt geen netwerk-device aangegeven, dus het geldt voor # alle netwerkdevices (neem ik aan) # iptables -A INPUT -p tcp --dport 22 -j ACCEPT # ------------------------------------- # Sta verkeer toe on the local loopback # ------------------------------------- # iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # ----------------------------------- # Sta WWW outbound port 80 & 443 toe # ----------------------------------- # iptables -A INPUT -i $WAN -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -o $WAN -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i $WAN -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -o $WAN -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT # ------------------------------ # Allow DNS # ------------------------------ # Bron: http://www.linuxhomenetworking.com/forums/showthread.php?t=454 # iptables -A OUTPUT -p udp -o $WAN --dport 53 --sport 1024:65535 -j ACCEPT iptables -A INPUT -p udp -i $WAN --sport 53 --dport 1024:65535 -j ACCEPT # ----------------------------- # Incoming ping # ----------------------------- # Bron: http://www.cyberciti.biz/tips/linux-iptables-9-allow-icmp-ping.html # Oorspronkelijke voorbeeld van bron bevatte een additioneel -d en -s veld, # maar dat snap ik niet # iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type 0 -d 0/0 -m state --state ESTABLISHED,RELATED -j ACCEPT # ---------------------------- # Outgoing ping # ---------------------------- # Bron: http://www.cyberciti.biz/tips/linux-iptables-9-allow-icmp-ping.html # Oorspronkelijke voorbeeld bevatte een additioneel -d en -s veld, # maar dat snap ik niet. # iptables -A OUTPUT -p icmp --icmp-type 8 -d 0/0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p icmp --icmp-type 0 -s 0/0 -m state --state ESTABLISHED,RELATED -j ACCEPT # ------------------------------- # NAT/Masquerade # ------------------------------ # iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE # --------------------------------- # Activate forwarding in the kernel # --------------------------------- echo "1" > /proc/sys/net/ipv4/ip_forward # ------------------------ # NAT-gedeelte # ------------------------ # iptables -t nat -A PREROUTING -i eth1 -p udp -m multiport --dports domain,bootps -j REDIRECT iptables -t nat -A PREROUTING -d 172.31.255.254 -i eth1 -p tcp -m tcp --dport 443 -j REDIRECT # iptables -t nat -A PREROUTING -i eth1 -p tcp -m multiport --dports http,webcache,tproxy,8082 -j REDIRECT --to-ports 3128 # Blokkeert http op clients # # iptables -A PREROUTING -i eth1 -j LOL # # iptables -A PREROUTING -i eth1 -j CCC # iptables -t nat -A PREROUTING -i eth1 -p tcp -m multiport --dports https -j DNAT --to-destination 172.16.255.254 # # iptables -t nat -A PREROUTING -i eth1 -p icmp -m icmp --icmp-type 8 -j ACCEPT # iptables -t nat -A PREROUTING -i eth1 -j DROP # Blokkeert http op clients (en waarschijnlijk de rest ook) # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # # iptables -t -A SPOOF -p tcp -m tcp --dport 25 -j DNAT --to-destination 172.31.255.254 # # iptables -t -A SPOOF -j ACCEPT # ------ # Mangle # ------ # # iptables -t mangle -A PREROUTING -i eth1 -p icmp -m limit --limit 1/sec --limit-burst 100 -j ACCEPT # iptables -t mangle -A PREROUTING -i eth1 -p icmp -j DROP # iptables -t mangle -A PREROUTING -i eth1 -p udp -m multiport --dports 135,netbios-ns,netbios-dgm,netbios-ssn,1863,1900 -j DROP # iptables -t mangle -A PREROUTING -i eth1 -p tcp -m multiport --dports 135,netbios-ns,netbios-dgm,netbios-ssn,1863,1900 -j DROP # iptables -t mangle -A PREROUTING -i eth1 -p udp -m multiport --sports 135,netbios-ns,netbios-dgm,netbios-ssn,1863,1900 -j DROP # iptables -t mangle -A PREROUTING -i eth1 -p tcp -m multiport --sports 135,netbios-ns,netbios-dgm,netbios-ssn,1863,1900 -j DROP # -------------------------------------- # Filter # -------------------------------------- # iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -i eth0 -p udp -m udp --sport 67 --dport 68 -j ACCEPT iptables -A INPUT -i eth0 -p tcp -m tcp --dport 655 -j ACCEPT iptables -A INPUT -i eth0 -p icmp -m state --state NEW -j ACCEPT iptables -A INPUT -i eth0 -p tcp -m multiport --dports auth,ssh -m state --state NEW -j ACCEPT iptables -A INPUT -i eth1 -p tcp -m multiport --dports https -m state --state NEW -j ACCEPT iptables -A INPUT -i eth1 -p udp -m multiport --dports domain -m state --state NEW -j ACCEPT iptables -A INPUT -i eth1 -p icmp -j ACCEPT iptables -A INPUT -i eth1 -p udp -m udp --sport 68 --dport 67 -j ACCEPT iptables -A INPUT -p udp -m multiport --sports netbios-ns,netbios-dgm,netbios-ssn -j DROP iptables -A INPUT -p udp -m multiport --dports netbios-ns,netbios-dgm,netbios-ssn -j DROP iptables -A INPUT -p tcp -m multiport --sports 135,1863,1900 -j DROP iptables -A INPUT -p tcp -m multiport --dports 135,1863,1900 -j DROP iptables -A INPUT -j LOG --log-prefix "Fin: " iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i eth1 -o eth0 -m state --state NEW -j ACCEPT iptables -A FORWARD -j LOG --log-prefix "Fwd: " iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT iptables -A OUTPUT -o eth0 -p udp -m udp --sport 68 --dport 67 -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp -m tcp --dport 655 -j ACCEPT iptables -A OUTPUT -o eth0 -p icmp -m state --state NEW -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp -m multiport --dports ftp,ssh,sftp,http,https,rtsp,tinc,smtp -m state --state NEW -j ACCEPT iptables -A OUTPUT -o eth0 -p udp -m multiport --dports domain,ntp -m state --state NEW -j ACCEPT iptables -A OUTPUT -o eth1 -p icmp -j ACCEPT iptables -A OUTPUT -o eth1 -p udp -m udp --sport 67 --dport 68 -j ACCEPT # -A OUTPUT -d 192.168.50.107 -p tcp -m tcp --dport 5001 -m state --state NEW -j ACCEPT iptables -A OUTPUT -o eth1 -p icmp -j ACCEPT iptables -A OUTPUT -j LOG --log-prefix "Error: "
'Not configured to listen on any interfaces'
Bovenstaande foutmelding dook op in het logbestand
/var/log/syslog
en http://www.basicconfig.com/linuxnetwork/configure_dhcp_server_ubuntu lijkt er raad mee te weten.
Procedure #1
Dit zijn de uiteindelijke instellingen die gebruikt zijn in de Überrouter uit 2009:
/etc/dhcp3/dhcpd.conf
ddns-update-style ad-hoc;
option domain-name “my-dhcp-server.com”;
option domain-name-servers 172.16.255.254
default-lease-time 6000000;
max-lease-time 72000000;
authoritative;
subnet 172.16.255.0 netmask 255.255.255.0
{
range 172.16.255.2 172.16.255.99;
option routers 172.16.255.254;
option broadcast-address 172.16.255.255;
}
De waarde voor option domain-name-servers en option routers is het vaste IP-adres van de netwerkkaart aan de LAN-kant
etc/default/dhcp3-server
INTERFACES=”eth1”
Procedure #2
Dit betrof computer Rajka, voor gebruik in een hotel, oktober 2011:
1. Basisinstallatie
- Ubuntu 10.04 Server vanaf cd geïnstalleerd;
- Geen additionele software tijdens installatie geïnstalleerd;
- Installatie bijgewerkt middels apt-get update en apt-get upgrade;
- OpenSSH geïnstalleerd middels apt-get install openssh-server
2. Netwerkkaarten
/etc/network/interfaces als volgt aangepast om de tweede netwerkkaart te testen:
# The primary network interface # auto eth0 # iface eth0 inet dhcp # Test auto eth1 iface eth1 inet dhcp
Let op: Pas nadat ik de computer opnieuw opstartte, werkte dit. Met alleen ifdown en ifup kreeg ik 't niet aan de praat.
Daarna de volgende configuratie toegepast:
# The loopback network interface
#
auto lo
iface lo inet loopback
# The primary network interface
#
auto eth0
iface eth0 inet dhcp
# eth1: NIC aan de client-kant,
# met vast ip-adres
#
iface eth1 inet static
address 172.16.255.1 # Dus aan het begin van het gebied
network 172.16.255/24
netmask 255.255.255.0
broadcast 172.16.255.255
auto eth1
Let op: De configuratie van eth1 is afwijkend van hiervoor. Zonder dat bleef ik foutmeldingen krijgen bij het opstarten van de dhcp-server, die ik kon terugvinden in /var/log/syslog, zoals
Oct 4 21:56:29 rajka dhcpd: Wrote 0 leases to leases file. Oct 4 21:56:29 rajka dhcpd: Oct 4 21:56:29 rajka dhcpd: No subnet declaration for eth1 (0.0.0.0). Oct 4 21:56:29 rajka dhcpd: ** Ignoring requests on eth1. If this is not what Oct 4 21:56:29 rajka dhcpd: you want, please write a subnet declaration Oct 4 21:56:29 rajka dhcpd: in your dhcpd.conf file for the network segment Oct 4 21:56:29 rajka dhcpd: to which interface eth1 is attached. ** Oct 4 21:56:29 rajka dhcpd: Oct 4 21:56:29 rajka dhcpd: Oct 4 21:56:29 rajka dhcpd: Not configured to listen on any interfaces!
Na deze afwijkende declaratie werkte 't in een keer. Met dank aan http://ubuntuforums.org/showthread.php?t=1209620
3. DHCP
Installatie:
sudo apt-get install dhcp3-server
/etc/dhcp3/dhcpd.conf:
option domain-name-servers 172.16.255.1;
default-lease-time 6000000;
max-lease-time 72000000;
authoritative;
subnet 172.16.255.0 netmask 255.255.255.0
{
range 172.16.255.2 172.16.255.99
option routers 172.16.255.1
option broadcast-address 172.16.255.255
}
etc/default/dhcp3-server:
# Defaults for dhcp initscript # sourced by /etc/init.d/dhcp # installed at /etc/default/dhcp3-server by the maintainer scripts # # This is a POSIX shell fragment # # On what interfaces should the DHCP server (dhcpd) serve DHCP requests? # Separate multiple interfaces with spaces, e.g. "eth0 eth1". INTERFACES="eth1"
Server herstarten middels
sudo /etc/init.d/dhcp3-server restart
gaf het resultaat:
strompf@rajka:~$ sudo /etc/init.d/dhcp3-server restart * Stopping DHCP server dhcpd3 [fail] * Starting DHCP server dhcpd3 [ OK ]
En een aangesloten laptop kreeg ook een ip-adres toegewezen.
4. DNS
sudo apt-get install bind9
Da's alles.
5. Masquerade
Het masquerade-script dient om de twee netwerkkaarten aan elkaar te knopen, en om de machines achter de router zich te laten representeren door het WAN-adres van de router. Het is een iptables-script.
iptables Wordt met alle versies van Ubuntu meegeleverd. Test:
sudo iptables -L
Standaard is de configuratie leeg. Dat ziet er zo uit:
Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Standaardlocatie voor een iptables-script is /etc/iptables.rules. Het masquerade-script slaan we echter op in
/etc/init.d/masquerade.sh
om het bij opstarten te laten uitvoeren
