DNS-Auflösung und Reverse Lookup

$ host www.wikiberd.de
$ host -A www.wikiberd.de
$ host 188.246.6.99

$ nslookup www.wikiberd.de
$ nslookup 188.246.6.99

ICMP Echo-Request

$ ping www.wikiberd.de
$ ping -I l2tp-vpn1 www.wikiberd.de

Flood Ping erfordert Root-Rechte. Für jedes gesendete Packet wird ein Punkt und für jede Antwort wird ein Backspace ausgegeben. Die Anzahl der Punkt zeigt daher die verlorenen Pakete.

$ sudo ping -I l2tp-vpn1 -f www.wikiberd.de
PING www.wikiberd.de (188.246.6.99) 56(84) bytes of data.
....^C
--- www.wikiberd.de ping statistics ---
13850 packets transmitted, 13846 received, 1% packet loss, time 1958ms
rtt min/avg/max/mdev = 0.123/0.129/0.285/0.013 ms, ipg/ewma 0.141/0.131 ms

Einfache Netfilter-Regeln (iptables, ip6tables)

-4, -6
Regel nur für IPv4 oder IPv6
-t table
Auswahl einer Tabelle (Default: filter):
filter, nat, mangle, raw, rsecurity
-N chain
Anlage einer neuen Kette in der Tabelle
-P chain policy
Standardverhalten einer Kette: ACCEPT, REJECT, DROP
-A chain rule
Anhängen einer neuen Regel ans Ende der Kette
-D chain rule
Löschen einer Regel in der Kette
-I chain [nr] rule
Einfügen einer neuen Regel in der Mitte
-R chain nr rule
Ersetzen einer Regel
-L [chain]
Auflisten aller Regeln
-F [chain]
Alle Regeln verwerfen (Flush)
-X
Alle Benutzerdefinierte Ketten löschen
-Z
Alle Zähler zurücksetzen
!
Verneinung der folgenden Option
-i, -o
INPUT und OUTPUT-Interface
-p protocol
Protokoll: tcp, udp, imcp, icmpv6, all, ...
-s ip, -sport nr
Quelladresse, Quellport
-d ip, -dport nr
Zieladresse, Zielport
-m module --parameter
Auswahl eines Moduls mit Modulparametern
-m state --state state
Verbindungsstatus: NEW, ESTABLISHED, RELATED, ...
-p tcp --tcp-flags X,X,X Y,Y,Y
Prüfe TCP-Flags X,X,X, wenn Y,Y,Y gesetzt sind (Maske)
SYN, ACK, FIN, RST, URG, PSH, ALL, NONE
-j chain
Absprung zu Kette ACCEPT, REJECT, RETURN, ...

Firewall zurücksetzen:
$ iptables -P INPUT ACCEPT
$ iptables -F INPUT
$ iptables -P OUTPUT ACCEPT
$ iptables -F OUTPUT
$ iptables -P FORWARD DROP
$ iptables -F FORWARD
$ iptables -t nat -F

Einzelne Ports öffnen, ohne NAT:
$ iptables -F INPUT
$ iptables -P INPUT ACCEPT

$ iptables -A INPUT -i lo -j ACCEPT
$ iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

$ iptables -A INPUT -4 -p icmp -m limit --limit 10/second --limit-burst 2 -j ACCEPT
$ iptables -A INPUT -6 -p icmpv6 -m limit --limit 10/second --limit-burst 2 -j ACCEPT

$ iptables -A INPUT -i eth0 -p tcp --dport tinc -m state --state NEW -j ACCEPT
$ iptables -A INPUT -i eth0 -p udp --dport tinc -m state --state NEW -j ACCEPT
$ iptables -A INPUT -i eth0 -p tcp -m multiport --dports http,https -m state --state NEW -j ACCEPT

$ iptables -A INPUT -j LOG --log-prefix "iptables reject (input): " --log-level 4
$ iptables -A INPUT -j REJECT

Regeln auflisten:
$ iptables -t nat -n -L -v

NAT und Masquerading

Destination NAT: Portweiterleitung, Anfragen werden an interne Hosts weitergeleitet
Source NAT: Austausch der Quelladresse für ausgehende Anfragen
IP-Masquerade: Versteckt ein internes Netzwerk hinter einer öffentlichen IP-Adresse

Aktivieren der Weiterleitung:
$ sysctl -w net.ipv4.ip_forward=1

Auf ppp0 ins Internet gehende Verbindungen maskieren:
$ iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
$ iptables -A FORWARD -i eth0 -o ppp0 -j ACCEPT
$ iptables -A FORWARD -i ppp0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT

Portweiterleitung an einen internen Webserver. Durch die zweite Regel können auch interne Hosts die externe IP aufrufen:
$ iptables -t nat -A PREROUTING -p tcp -d 188.246.6.99 --dport 80 -j DNAT --to 192.168.1.99:80
$ iptables -t nat -A POSTROUTING -p tcp -d 188.246.6.99 --dport 80 -s 192.168.1.0/24 -j SNAT --to 192.168.1.99:80

Wenn die externe IP dynamisch ist, müssen die Firewall-Regeln bei jedem IP-Wechsel neugeladen werden!

Einfache Statische Routen

Hier werden nur die einfachen Routen anhand der Zieladresse beschrieben. Erweitertete Routingentscheidungen s.u. bei Policy Routing.

Auflisten der Routing-Tabelle:
$ netstat -r
$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         router-extern.l 0.0.0.0         UG        0 0          0 eth1
188.246.0.50    router-extern.l 255.255.255.255 UGH       0 0          0 eth1
188.246.4.1     *               255.255.255.255 UH        0 0          0 l2tp-vpn1
192.168.0.0     *               255.255.255.0   U         0 0          0 eth1
192.168.0.0     *               255.255.0.0     U         0 0          0 vpn0
192.168.1.0     *               255.255.255.0   U         0 0          0 br-lan

$ ip route list
$ ip route show
default via 192.168.0.1 dev eth1  proto static
188.246.0.50 via 192.168.0.1 dev eth1  proto static
188.246.4.1 dev l2tp-vpn1  proto kernel  scope link  src 188.246.6.99
192.168.0.0/24 dev eth1  proto kernel  scope link  src 192.168.0.11
192.168.0.0/16 dev vpn0  proto kernel  scope link  src 192.168.1.1
192.168.1.0/24 dev br-lan  proto kernel  scope link  src 192.168.1.1 

Anzeige des Routing Caches:
$ ip route show cache
8.8.4.4 from 192.168.1.227 via 192.168.0.1 dev eth1  src 192.168.1.1
    cache <src-direct>  iif br-lan
local 192.168.1.1 from 192.168.1.13 dev lo  src 192.168.1.1
    cache <local,src-direct>  iif br-lan
192.168.1.100 from 148.251.90.84 dev br-lan  src 192.168.0.11
    cache  ipid 0xbd81 iif eth1
...

Zurücksetzen des Caches, damit veränderte Regeln aktiv werden:
$ ip route flush cache

Arten von Routing-Regeln:

unicastBeschreibt eine Zieladresse/Zielnetzwerk (Standard)
broadcast
i.d.R. nur in der local-Tabelle vorhanden für link-layer Broadcasts
local
Lokale IP-Adressen, die vom Kernel automatisch in local eingetragen werden
unreachable
Führt dazu, dass eine ICMP Unreachable-Nachricht an den Absender geht
prohibit
Führt dazu, dass eine ICMP Probited-Nachricht an den Absender geht
blackhole
Die Pakete werden stillschweigend ohne ICMP-Antwort verworfen
throw
Explizites Ende der Regelsuche in dieser Tabelle, Suche ggf. in weiteren Tabellen.

Pflege einfacher Unicast-Regeln:
$ ip route add default via 193.7.255.1
$ ip route add 192.168.0.0/24 via 192.168.100.5
$ ip route add 10.40.0.0/16 via 10.72.75.254 dev l2tp-vpn1

Routing ablehnen:
$ ip route add unreachable 172.16.82.184
$ ip route add prohibit 172.28.113.0/28
$ ip route add blackhole default
$ ip route add throw 10.79.0.0/16

Minimales Routing-Setup für eine Workstation ohne DHCP:
$ ip address add 192.168.11.54/24 dev eth0
$ ip route add default via 192.168.11.1

Policy Routing

Konventionalles Routing basiert auf dem Longest Prefix Match-Algorithmus und orientiert sich dabei nur an der Zieladresse eines Pakets. Policy Routing ermöglicht es, viel flexiblere Routingentscheidungen anhand beliebiger Merkmale zu treffen. Im einfachsten Fall erfolgt die Auswahl der Route anhand einem der folgenden Merkmale: Quell-IP, empfangendes Interface, Type Of Service-Flag, Firewall-Mark. Dabei handelt es sich beim FW-Mark um eine interne Markierung, die einem Paket innerhalb der Netfilter-Firewall gegeben wird. Gerade diese Kombination mit Netfilter erlaubt es, beliebig komplexe Routingentscheidungen zu treffen. Es muss jedoch beachtet werden, dass das IP-Routing unter Linux immer zustandslos ist und daher eingehende und ausgehende Pakete gleichermaßen konfiguriert werden müssen, um z.B. Antwortpakete richtig zu routen!

Vorgehen des Kernels zur Auswahl einer Route (Suchmerkmale s. Tabelle, kursive Merkmale sind optional):

  1. Suche im Routing Cache, bei Erfolg: Ende
  2. Suche einer Tabelle in der Routing Policy Database
  3. Suche der Route innerhalb der Tabelle anhand Longest Prefix
route cacheRPDBroute table
destinationsourcedestination
sourcedestinationToS
ToSToSscope
fwmarkfwmarkout interface
in interfacein interface 

Polilcy Routing Database ausgeben. local ist die Tabelle für link-lokale Adressen und main die Standardtabelle, die auch ohne PBR zum Einsatz kommt. default ist oft leer. Mit dem veralteten route-Befehl kann nur die main-Tabelle verändert werden. Sie ist auch der Standard für ip route. ifconfig und ip address verändern i.d.R. auch die local-Tabelle.

$ ip rule show
0:      from all lookup local
32765:  from all fwmark 0x1 lookup VPN1
32766:  from all lookup main
32767:  from all lookup default

Anzeige der Regeln einer Tabelle:
$ ip route show table main
default via 192.168.0.1 dev eth1  proto static
188.246.0.50 via 192.168.0.1 dev eth1  proto static
188.246.4.1 dev l2tp-vpn1  proto kernel  scope link  src 188.246.6.99
192.168.0.0/24 dev eth1  proto kernel  scope link  src 192.168.0.11
192.168.0.0/16 dev vpn0  proto kernel  scope link  src 192.168.1.1
192.168.1.0/24 dev br-lan  proto kernel  scope link  src 192.168.1.1

Neue Tabellen müssen in der Datei /etc/iproute2/rt_tables angelegt werden:
$ cat /etc/iproute2/rt_tables
# reserved values
255    local
254    main
253    default
0      unspec
# local tables
100    VPN1

Setzen der Default-Route in der Tabelle:
$ ip -4 route flush table VPN1
$ ip -4 route add table VPN1 default dev vpn1 via 192.168.99.99

$ ip -6 route flush table VPN1
$ ip -6 route add table VPN1 default dev vpn1 via fdd1:90f:...

Anlage einer Regel zur Auswahl der Routing-Tabelle:
$ ip -4 rule del from all fwmark 1 2> /dev/null
$ ip -4 rule add fwmark 1 table VPN1
$ ip -4 route flush cache


$ ip -6 rule del from all fwmark 1 2> /dev/null
$ ip -6 rule add fwmark 1 table VPN1
$ ip -6 route flush cache

Zusammenspiel mit Netfilter, in dem dort das Connmark gesetzt wird:
iptables -t mangle -N MARK_VPN1
iptables -t mangle -A MARK_VPN1 -j MARK --set-mark 1
iptables -t mangle -A MARK_VPN1 -j CONNMARK --save-mark
iptables -t mangle -A PREROUTING -i vpn1 -m conntrack --ctstate NEW  -j MARK_VPN1
iptables -t mangle -A PREROUTING -i vpn1 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark


ip6tables -t mangle -N MARK_VPN1
ip6tables -t mangle -A MARK_VPN1 -j MARK --set-mark 1
ip6tables -t mangle -A MARK_VPN1 -j CONNMARK --save-mark
ip6tables -t mangle -A PREROUTING -i vpn1 -m conntrack --ctstate NEW  -j MARK_VPN1
ip6tables -t mangle -A PREROUTING -i vpn1 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark

Vgl. http://backreference.org/2012/10/07/policy-routing-multihoming-and-all-that-jazz/
Vgl. http://linux-ip.net/PRIVOXY-FORCE/html/adv-multi-internet.html

Mehrere Ethernet-Interfaces bridgen

Unterschied zum Routing: Es werden mehrere Ethernet-Segmente zusammengeschlossen. Daher existiert nur eine IP-Adresse und auch Broadcast- oder ARP-Nachrichten können die Bridge passieren. Auch LAN und WLAN lassen sich bridgen, sofern es der WiFi-Treiber unterstützt. Die meisten Access Points lehnen aber Frames von unbekannten MAC-Adressen ab. HIerfür müsste dann mit eptables ein "NAT auf Ethernet-Ebene" eingerichtet werden.

$ brctl addbr br0
$ brctl delbr br0

$ brctl show
bridge name    bridge id        STP enabled    interfaces
br-lan        8000.2eb05d93b617    no          eth0.1
                                               wlan0

$ brtctl adddif br0 eth0 eth1 eth2
$ brctl delif br0 eth2
$ brctl show br0

IP-Tunnel einrichten

TODO: http://www.linuxfoundation.org/collaborate/workgroups/networking/tunneling

xxx

Verschiedene Netzwerkinformationen

Auflistung aller Socketverbindungen (intern und extern):
$ netstat -a
$ netstat -an

Auflistung aller eingehenden Verbindungen:
$ netstat -al

Eingrezung auf TCP oder UDP:
$ netstat -alt
$ netstat -alu
$ netstat -atu
$ netstat -altu

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State     
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN    
tcp        0      0 localhost.local:privoxy 0.0.0.0:*               LISTEN    
tcp        0      0 localhost.localdoma:ipp 0.0.0.0:*               LISTEN    
tcp        0      0 metropolis.lan:33103    snt-re4-8c.sjc.dro:http ESTABLISHED
tcp        1      0 metropolis.lan:44927    6-55-236-85.rev.cu:http CLOSE_WAIT
tcp        0      0 metropolis.lan:39384    router-intern.lan:ssh   ESTABLISHED
tcp       32      0 metropolis.lan:37439    6-55-236-85.rev.c:https CLOSE_WAIT
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN    
tcp6       0      0 localhost6.localdom:ipp [::]:*                  LISTEN    

Netzwerkverbindungen mit lsof auflisten:
$ lsof -i TCP
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
dropbox 2278 dennis   18u  IPv4  95849      0t0  TCP metropolis.lan:33103->snt-re4-8c.sjc.dropbox.com:http (ESTABLISHED)
ssh     7204 dennis    3u  IPv4  63858      0t0  TCP metropolis.lan:39384->router-intern.lan:ssh (ESTABLISHED)

Informationen über ein Netzwerkinterface:
$ ifconfig l2tp-vpn1
l2tp-vpn1 Link encap:Point-to-Point Protocol 
          inet addr:188.246.6.99  P-t-P:188.246.4.1  Mask:255.255.255.255
          inet6 addr: fe80::449b:1a7b:df7c:8cb7/10 Scope:Link
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:24697 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:1557600 (1.4 MiB)  TX bytes:234 (234.0 B)

$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 2e:b0:5d:93:b6:17 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::2cb0:5dff:fe93:b617/64 scope link
       valid_lft forever preferred_lft forever

Auflistung des ARP-Caches:
$ arp -an
? (192.168.1.1) at 2e:b0:5d:93:b6:17 [ether] on p2p1
? (192.168.1.14) at ca:fe:ba:be:00:03 [ether] on p2p1
? (192.168.1.12) at ca:fe:ba:be:00:01 [ether] on p2p1

Pakete mitschneiden (Sniffing)

$ tcpdump -i l2tp-vpn1
$ tcpdump -Xvv -i l2tp-vpn1

Netzwerkadresse berechnen

$ ipcalc -n 10.24.1.5/20
NETWORK=10.24.0.0


attachments

imageappend Append an Image
>