Christoph Schnauß: Routing mit Gentoo einrichten

Beitrag lesen

(Fortsetzun)

Dann kann es jetzt an das eigentliche Problem mit "iptables" gehen. Voraussetzung, daß es funktionieren könnte, sind ein paar Einträge im Kernelscript. Der Auszug aus /usr/src/linux/.config wird jetzt leider eine etwas längere Liste:
  #
  # Networking options
  #
  CONFIG_PACKET=y
  CONFIG_PACKET_MMAP=y
  CONFIG_NETLINK_DEV=y
  CONFIG_UNIX=y
  CONFIG_INET=y
  CONFIG_IP_MULTICAST=y
  CONFIG_IP_ADVANCED_ROUTER=y
  CONFIG_IP_MULTIPLE_TABLES=y
  CONFIG_IP_ROUTE_FWMARK=y
  CONFIG_IP_PNP=y
  CONFIG_IP_PNP_DHCP=y
  CONFIG_NET_IPIP=m
  CONFIG_NET_IPGRE=m
  CONFIG_NET_IPGRE_BROADCAST=yiptables -t nat -nvL
  CONFIG_IP_MROUTE=y
  CONFIG_SYN_COOKIES=y
  CONFIG_INET_TUNNEL=m
  [...]
  #
  # IP: Netfilter Configuration
  #
  CONFIG_IP_NF_CONNTRACK=y
  CONFIG_IP_NF_CT_ACCT=y
  CONFIG_IP_NF_CT_PROTO_SCTP=m
  CONFIG_IP_NF_FTP=y
  CONFIG_IP_NF_TFTP=m
  CONFIG_IP_NF_QUEUE=m
  CONFIG_IP_NF_IPTABLES=y
  CONFIG_IP_NF_MATCH_LIMIT=y
  CONFIG_IP_NF_MATCH_IPRANGE=y
  CONFIG_IP_NF_MATCH_MAC=y
  CONFIG_IP_NF_MATCH_PKTTYPE=y
  CONFIG_IP_NF_MATCH_MARK=y
  CONFIG_IP_NF_MATCH_MULTIPORT=y
  CONFIG_IP_NF_MATCH_TOS=y
  CONFIG_IP_NF_MATCH_RECENT=y
  CONFIG_IP_NF_MATCH_ECN=y
  CONFIG_IP_NF_MATCH_DSCP=y
  CONFIG_IP_NF_MATCH_AH_ESP=y
  CONFIG_IP_NF_MATCH_LENGTH=y
  CONFIG_IP_NF_MATCH_TTL=y
  CONFIG_IP_NF_MATCH_TCPMSS=y
  CONFIG_IP_NF_MATCH_HELPER=y
  CONFIG_IP_NF_MATCH_STATE=y
  CONFIG_IP_NF_MATCH_CONNTRACK=y
  CONFIG_IP_NF_MATCH_OWNER=y
  CONFIG_IP_NF_MATCH_PHYSDEV=y
  CONFIG_IP_NF_MATCH_ADDRTYPE=y
  CONFIG_IP_NF_MATCH_REALM=y
  CONFIG_IP_NF_MATCH_SCTP=y
  CONFIG_IP_NF_MATCH_COMMENT=y
  CONFIG_IP_NF_FILTER=y
  CONFIG_IP_NF_TARGET_REJECT=y
  CONFIG_IP_NF_TARGET_LOG=y
  CONFIG_IP_NF_TARGET_ULOG=y
  CONFIG_IP_NF_TARGET_TCPMSS=y
  CONFIG_IP_NF_NAT=y
  CONFIG_IP_NF_NAT_NEEDED=y
  CONFIG_IP_NF_TARGET_MASQUERADE=y
  CONFIG_IP_NF_TARGET_REDIRECT=y
  CONFIG_IP_NF_TARGET_NETMAP=y
  CONFIG_IP_NF_TARGET_SAME=y
  CONFIG_IP_NF_NAT_LOCAL=y
  CONFIG_IP_NF_NAT_SNMP_BASIC=m
  CONFIG_IP_NF_NAT_FTP=y
  CONFIG_IP_NF_NAT_TFTP=m
  CONFIG_IP_NF_MANGLE=y
  CONFIG_IP_NF_TARGET_TOS=y
  CONFIG_IP_NF_TARGET_ECN=y
  CONFIG_IP_NF_TARGET_DSCP=y
  CONFIG_IP_NF_TARGET_MARK=y
  CONFIG_IP_NF_TARGET_CLASSIFY=y
  CONFIG_IP_NF_RAW=y
  CONFIG_IP_NF_TARGET_NOTRACK=m
  CONFIG_IP_NF_ARPTABLES=y
  CONFIG_IP_NF_ARPFILTER=m
  CONFIG_IP_NF_ARP_MANGLE=m

Es ist zu sehen, daß ich alles, was mir irgendwie wichtig erschien, vorsichtshalbe fest in den Kernel gepackt und nur ganz wenige Module gebaut habe. Mein Kernel (ich habe es sowohl mit 2.6.9 wie auch mit dem neuen 2.6.10 probiert) _sollte_ also eigentlich alles Wichtige enthalten, oder siehst du das anders?

Selbstverständlich ist ein "emerge iptables" auch gelaufen, das heißt, die iptables-Software (1.2.11) ist vorhanden und korrekt installiert. Und da ich ein "rc-update add iptables default" getippt habe, wird es mir mit "rc-update -s" auch als aktiver Dienst gelistet:
  bash-2.05b# rc-update -s
           [...]
             hotplug |      default
           ip6tables |
            iptables |      default
             keymaps | boot
           [...]

Wenn ich nach dem Kernelbacken und der Software-Installation noch gar nix weiter mache, sondern nur mal den Rechner neu starte, sehe ich unter den Bootmeldungen mit zwei roten Ausrufezeichen als Warnung markiert den Hinweis:
  pc1 rc-scripts: Not starting iptables. First create some
  rules then run
  pc1 rc-scripts: /etc/init.d/iptables save
Das ist prima, weil es zeigt, daß meine iptables-Software zwar loasarbeiten möchte, bisher aber noch gar keine Regeln definiert sind. Wenn ich jetzt wie verlangt einfach nur
  /etc/init.d/iptables save
vorgebe, ohne irgendeine "rule" festzulegen, wird ein gewissermaßen "leeres" Script in /var/lib/iptables/routes-save erzeugt, das allerdings bewirkt, daß ich bei einem unmittelbar folgenden reboot keine solche Fehlermeldungen mehr in den Startanzeigen sehe, sondern stattdessen dort steht:
* Loading iptables state and starting firewall ...
* Restoring iptables ruleset
* Mounting network filesystems ...

Wenn ich jetzt dein gewünschtes "iptables -t nat -vnL" eingebe, bekomme ich selbstverständlich nichts angezeigt, es existieren noch keine Regeln. Ich gebe also einfach mal deinen Vorschlag aus https://forum.selfhtml.org/?t=97300&m=592421 ein:
  iptables -A FORWARD -i ppp0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
  iptables -A FORWARD -i eth0 -o ppp0 -j ACCEPT
  iptables -A FORWARD -j REJECT --reject-with icmp-net-prohibited
  iptables -P FORWARD DROP
  iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
Den Effekt kan ich mit "iptables -t nat -vnL" abfragen:
  bash-2.05b# iptables -t nat -vnL
  Chain PREROUTING (policy ACCEPT 251K packets, 13M bytes)
   pkts bytes target     prot opt in     out     source               destination
  Chain POSTROUTING (policy ACCEPT 131K packets, 7298K bytes)
   pkts bytes target     prot opt in     out     source               destination
      0     0 MASQUERADE  all  --  *      ppp0    0.0.0.0/0            0.0.0.0/0
  Chain OUTPUT (policy ACCEPT 241K packets, 14M bytes)
   pkts bytes target     prot opt in     out     source               destination
  bash-2.05b#
Meine SuSE-Kiste sagt mir bei einem schlichten ping aber:
  pc2:~ # ping www.google.de
  pc2:~ # unknown host www.google.de
Und das wars. Er geht nicht online.

Du hast noch auf die mir bereits bekannte Adresse http://www.gentoo.org/doc/en/home-router-howto.xml verwiesen. Wenn ich das, was dort als funktionierende Lösung vorgeschlagen wird, etwas modifiziere, gebe ich ein:
  iptables -I INPUT 1 -i eth0 -j ACCEPT
  iptables -I INPUT 1 -i lo -j ACCEPT
  iptables -A INPUT -p UDP --dport bootps -i ! eth0 -j REJECT
  iptables -A INPUT -p UDP --dport domain -i ! eth1 -j REJECT
  iptables -I FORWARD -i eth0 -d 192.168.0.0/255.255.255.0 -j ACCEPT
  iptables -A FORWARD -i eth0 -s 192.168.0.0/255.255.255.0 -j ACCEPT
  iptables -A FORWARD -i eth1 -d 192.168.0.0/255.255.255.0 -j ACCEPT
  iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
  iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
  iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
Den Effekt kan ich wieder mit "iptables -t nat -vnL" abfragen:
  bash-2.05b# iptables -t nat -vnL
  Chain PREROUTING (policy ACCEPT 251K packets, 13M bytes)
   pkts bytes target     prot opt in     out     source               destination
  Chain POSTROUTING (policy ACCEPT 131K packets, 7299K bytes)
   pkts bytes target     prot opt in     out     source               destination
      0     0 MASQUERADE  all  --  *      eth0    0.0.0.0/0            0.0.0.0/0
      0     0 MASQUERADE  all  --  *      eth1    0.0.0.0/0            0.0.0.0/0
      0     0 MASQUERADE  all  --  *      ppp0    0.0.0.0/0            0.0.0.0/0
  Chain OUTPUT (policy ACCEPT 241K packets, 14M bytes)
   pkts bytes target     prot opt in     out     source               destination
So weit ich das beurteilen kann, sieht das korrekt aus.
Meine SuSE-Kiste sagt mir bei einem schlichten ping aber wiederum:
  pc2:~ # ping www.google.de
  pc2:~ # unknown host www.google.de
Und das wars dann.

Ich habe mich gewiß an vielen Stellen zu belesen versucht. Aber es steckt irgendwo noch ein Fehler drin, auf den ich nicht komme. Selbstverständlich habe ich auch eine Menge weiterer iptables-Befehlszeilen ausprobiert, alles bisher ohne Erfolg.

Grüße
Christoph S.