NAT und IPFW auf ARMv6 (RaspberryPI) als simpler Router

Wasp

Insektenspray-Gegner
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.. :(
 
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. :(
 
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*)
 
(Leider kann ich das aber nachträglich im Thread nicht mehr korrigieren. *hint-an-admins*)
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
 
Zurück
Oben