$ host www.wikiberd.de
$ host -A www.wikiberd.de
$ host 188.246.6.99
$ nslookup www.wikiberd.de
$ nslookup 188.246.6.99
$ 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
-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
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!
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:
unicast | Beschreibt 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
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):
route cache | RPDB | route table |
---|---|---|
destination | source | destination |
source | destination | ToS |
ToS | ToS | scope |
fwmark | fwmark | out interface |
in interface | in 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 route flush table VPN1
$ ip route add table VPN1 default dev vpn1 via 192.168.99.99
Anlage einer Regel zur Auswahl der Routing-Tabelle:
$ ip rule dell from all fwmark 1 2> /dev/null
$ ip rule add fwmark 1 table VPN1
$ ip 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
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
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
TODO: http://www.linuxfoundation.org/collaborate/workgroups/networking/tunneling
xxx
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
$ tcpdump -i l2tp-vpn1
$ tcpdump -Xvv -i l2tp-vpn1
$ ipcalc -n 10.24.1.5/20
NETWORK=10.24.0.0