1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

NAT und IPFW auf ARMv6 (RaspberryPI) als simpler Router

Dieses Thema im Forum "FreeBSD - Netzwerk" wurde erstellt von Wasp, 3 Dezember 2017.

  1. Wasp

    Wasp Insektenspray-Gegner

    Registriert seit:
    15 Dezember 2003
    Beiträge:
    416
    Ort:
    Berlin (Deutschland)
    Hallo,

    leider komme ich parout nicht weiter und ohne etwas Vorweg nehmen zu wollen, kann ich mich dem Gefühl nicht erwehren, daß es an ARM liegt. Aber lasse mich da *sehr* gerne eines besseren von euch belehren.

    Standard Grundidee: {internet} <- (router::192.168.2.1) <- (RaspberryPi::10.42.0.1) <-> {clients in 10.42.0.0}

    Hierzu konfiguriert: dnsmasq(8) als DHCP und DNS-Server welcher einwandfrei funktioniert. Leider scheint es jedoch an natd(8) und/oder ipfw(8) zu scheitern (s. weiter unten an ping).

    Code:
    # /boot/loader.conf 
    #
    legal.realtek.license_ack=1
    if_urtwn_load="YES"
    # Doesn't load automatically
    ipfw_nat_load="YES"
    ipdivert_load="YES" # loads auto but just to get sure
    # Tuneables (.. are only setable in sysctl.conf file)
    # XXX: immediate effect!
    net.inet.ip.fw.default_to_accept="1"
    
    Code:
    # /etc/rc.conf
    #
    ifconfig_ue0="inet 10.42.0.1 netmask 0xffffff00"
    ifconfig_wlan0="WPA DHCP"
    gateway_enable="YES"  # Auf YES setzen, wenn der Rechner als Gateway arbeiten soll
    natd_enable="YES"  # Enable natd (if firewall_enable == YES).
    natd_interface="wlan0"  # specfiy interface name of NIC attached to internet
    natd_flags="-dynamic -m"  # -m = preserve port numbers; addtional optioins are lsited in natd(8)
    firewall_enable="YES"
    firewall_type="open"  # open = allow all traffic
    firewall_logging="YES"  # For limit set in sysctl
    firewall_nat_enable="YES"  # Enable kernel NAT (if firewall_enable == YES)
    firewall_nat_interface="wlan0"  # Public interface or IPaddress to use
    dnsmasq_enable="YES"
    
    Code:
    # /etc/sysctl.conf
    #
    net.inet.ip.forwarding=1
    net.inet.ip.fastforwarding=0
    net.inet.ip.fw.one_pass=0
    net.inet.ip.fw.verbose_limit=5
    
    Die resultierenden automatische IPFW-Regeln sehen dann wie folgt aus
    Code:
    # ipfw -at list
    00050 403 30602 Sun Dec  3 23:26:21 2017 divert 8668 ip4 from any to any via wlan0
    00050  0  0  nat 123 ip4 from any to any via wlan0
    00100  0  0  allow ip from any to any via lo0
    00200  0  0  deny ip from any to 127.0.0.0/8
    00300  0  0  deny ip from 127.0.0.0/8 to any
    00400  0  0  deny ip from any to ::1
    00500  0  0  deny ip from ::1 to any
    00600  0  0  allow ipv6-icmp from :: to ff02::/16
    00700  0  0  allow ipv6-icmp from fe80::/10 to fe80::/10
    00800  0  0  allow ipv6-icmp from fe80::/10 to ff02::/16
    00900  0  0  allow ipv6-icmp from any to any ip6 icmp6types 1
    01000  0  0  allow ipv6-icmp from any to any ip6 icmp6types 2,135,136
    65535 1477 146245 Sun Dec  3 21:25:19 2017 allow ip from any to any
    
    Dies führt, trotz any to any Regel, als erstes dazu, daß ich nicht mehr raus pingen kann aber auch, daß SSH-Verindungen von außen nicht mehr funktionieren. Als zweites fällt die doppelte #50 Regel auf. Muß das so?

    Gerade erst beim Schreiben aufgefallen: SSH auf den Raspberry geht sogar, ist nur super langsam -- so daß ich zuvor annahm, daß es nicht funktionierte und vor vermutetem timeout abbrach -- aber das nur als Randnotiz.

    Versuch n+1:
    Code:
    ipfw -q -f flush
    
    ipfw -q add 00020 allow all from any to any via lo0
    ipfw -q add 00024 allow all from any to any via ue0
    
    # NAT any inbound packets on WAN
    ipfw -q add 30 divert natd ip from any to any in via wlan0
    ipfw -q 00050 check-state
    ipfw -q 00100 allow tcp from any to any established
    ipfw -q 00110 allow udp from any to any established
    
    ipfw -q add 00150 skipto 10000 ip from any to any out via wlan0 keep-state
    ipfw -q add 00151 skipto 10001 ip6 from any to any out via wlan0 keep-state
    ipfw -q add 00152 skipto 10002 ipv6-icmp from any to any out via wlan0 keep-state
    
    # Now NAT rule for outgoing traffic from tapX LAN
    ipfw -q add 10000 divert natd ip from any to any out via wlan0
    ipfw -q add 10001 divert natd ip6 from any to any out via wlan0
    ipfw -q add 10002 divert natd ipv6-icmp from any to any out via wlan0
    ipfw -q add 10010 allow ip from any to any
    ipfw -q add 10011 allow ip6 from any to any
    ipfw -q add 10012 allow ipv6-icmp from any to any
    
    .. aus dem PC-BSD Forum aus https://forums.pcbsd.org/thread-19955.html erarbeitet tuts leider auch nicht.

    Versuch n+2:
    Code:
    ipfw -q -f flush
    ipfw -q add 10000 divert natd all from any to any via ed0
    ipfw -q add 10010 pass all from any to any
    
    .. tuts auch nicht, genauso wie zig andere Kombinationen/Vesuche.

    Bin etwas Ratlos.. :(
     
  2. KobRheTilla

    KobRheTilla used register

    Registriert seit:
    20 Januar 2011
    Beiträge:
    1.184
    Welche Verbindung in deiner Skizze läuft über WLAN und welche über Kabel?

    Rob
     
  3. Wasp

    Wasp Insektenspray-Gegner

    Registriert seit:
    15 Dezember 2003
    Beiträge:
    416
    Ort:
    Berlin (Deutschland)
    Vielen Dank für Dein Interesse Rob. Die gezeigten Konfigurationsdateien beziehen sich alle auf den Raspberry. Somit verbindet dieser via WLAN (wlan0) zum Router Richtung Internet, wärend LAN (ue0) an die dahinter liegenden Clents (10.42.0.0/24) geht.

    {internet} <-- (router::192.168.2.1) <--WLAN-- (RaspberryPi::10.42.0.1) <--LAN--> {clients in 10.42.0.0}

    PS: Es wäre echt super, wenn man seine Beiträge auch noch später korrigieren könnte -- schon alleine auf Grund der vielen Typos. :(
     
  4. KobRheTilla

    KobRheTilla used register

    Registriert seit:
    20 Januar 2011
    Beiträge:
    1.184
  5. Wasp

    Wasp Insektenspray-Gegner

    Registriert seit:
    15 Dezember 2003
    Beiträge:
    416
    Ort:
    Berlin (Deutschland)
    Da das ja drei verschiedene Konfigurationen waren, hatte ich das für den Thread noch einmal extra aus den entsprechenden Anleitungen zusammen kopiert. Ich bin mir 99% sicher, daß ich das auf der Maschine wärend der Versuche richtig gesetzt habe. In Versuch "n+1" ist auch ein syntaktischer Fehler und würde so gar nicht laufen. (Leider kann ich das aber nachträglich im Thread nicht mehr korrigieren. *hint-an-admins*)
     
  6. Yamagi

    Yamagi Possessed With Psi Powers Mitarbeiter

    Registriert seit:
    14 April 2004
    Beiträge:
    8.886
    Ort:
    Schleswig-Holstein
    Das ist so oft missbraucht worden, dass wir da nun recht enge Limits haben. Sorry. :(

    Noch mal generell: Wenn natd nicht funktioniert, ist das ein Bug. Aber trotzdem wäre In-Kernel-NAT einen Versuch wert, weil es deutlich performanter ist und sich besser in ipfw integriert. Schaue mal unter https://www.bsdforen.de/threads/ipfw-nat-und-jails.25394/#post-217253