Überrouter

Uit DeVliegendeWiki

Ga naar: navigatie, zoeken

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

Tjakka! dhcp-server doet 't: Deze aangesloten laptop krijg een ip-adres toegewezen. Je kunt nog niet surfen, omdat masquerading nog niet aanstaat, en je schijnt ook te moeten voorzien in dns

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

Bronnen

Persoonlijke instellingen