Skip to content

NanoPi R2S - Firewall mit VLan und DHCP-Server

Verschoben NanoPi R2S
  • Wofür kann man dieses kleine niedliche Gerät denn sonst benutzen? 🙂

    IMG_20200921_160513_ergebnis.jpg

    System

    Ich nutze hier drauf ein Armbian. Danke für die Arbeit!

    root@nanopi-r2s:/etc/init.d# uname -a
    Linux nanopi-r2s 5.8.11-rockchip64 #20.08.4 SMP PREEMPT Wed Sep 23 17:51:13 CEST 2020 aarch64 GNU/Linux
    

    Hardware

    • NanoPI R2S
    • Netgear GS108E
    • paar Netzwerkkabel 😉

    Ich habe das schon mal auf einem ROCKPro64 gemacht -> https://forum.frank-mankel.org/topic/740/rockpro64-zwei-lan-schnittstellen-vlan-einrichten

    Schnittstellen

    • eth0 (holt sich per DHCP die IP-Adresse aus meinem Netzwerk
    • lan0 (ist die Schnittstelle, die das VLan baut)

    Software

    Was brauchen wir?

    • iptables
    • isc-dhcp-server

    Konfiguration

    Schnittstellen

    /etc/network/interfaces

    source /etc/network/interfaces.d/*
    # Network is managed by Network manager
    auto lo
    iface lo inet loopback
    
    auto eth0
            iface eth0 inet dhcp
    
    
    auto lan0.100
            iface lan0.100 inet static
            address 192.168.1.1
            netmask 255.255.255.0
            #gateway 192.168.0.1
            #dns-nameservers 8.8.8.8
        vlan-raw-device lan0
    
    auto lan0.200
        iface lan0.200 inet static
        address 192.168.2.1
        netmask 255.255.255.0
        #gateway 192.168.0.1
        #dns-nameservers 8.8.8.8
        vlan-raw-device lan0
    

    Wir bauen auf der lan0 zwei VLans. Im Switch ist das so konfiguriert.

    Bildschirmfoto vom 2020-01-26 11-35-59.png

    • Port 1 Uplink (kommt an lan0 vom R2S)
    • Port 2 bildet das lan0.100
    • Port 3 bildet das lan0.200

    Danach brauchen wir iptables

    iptables

    Wir erzeugen in /etc/init.d eine Datei mit Namen firewall

    #!/bin/sh
    # This is a more complex setup, for a home firewall:
    # * One interface plug to the ISP conection (eth0). Using DHCP.
    # * One interface plug to the local LAN switch (eth1). Using 192.168.0.0/24.
    # * Traffic open from the LAN to the SSH in the firewall.
    # * Traffic open and translated, from the local LAN to internet.
    # * Traffic open from internet, to a local web server.
    # * Logging of dropped traffic, using a specific ''log level'' to configure a separate file in syslog/rsyslog.
    
    PATH='/sbin'
    
    ## Network
    INNET="192.168.1.0/24"
    IN_NET2="192.168.2.0/24"
    
    OUTNET="192.168.3.0/24"
    
    INIF="lan0.100"
    IN_IF2="lan0.200"
    
    OUTIF="eth0"
    
    
    ## INIT
    
    # Flush previous rules, delete chains and reset counters
    iptables -F
    iptables -X
    iptables -Z
    iptables -t nat -F
    
    # Default policies
    iptables -P INPUT DROP
    iptables -P OUTPUT DROP
    iptables -P FORWARD DROP
    
    echo -n '1' > /proc/sys/net/ipv4/ip_forward
    echo -n '0' > /proc/sys/net/ipv4/conf/all/accept_source_route
    echo -n '0' > /proc/sys/net/ipv4/conf/all/accept_redirects
    echo -n '1' > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
    echo -n '1' > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
    
    # Enable loopback traffic
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A OUTPUT -o lo -j ACCEPT
    
    # Enable statefull rules (after that, only need to allow NEW conections)
    iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    
    
    # Drop invalid state packets
    iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
    iptables -A OUTPUT -m conntrack --ctstate INVALID -j DROP
    iptables -A FORWARD -m conntrack --ctstate INVALID -j DROP
        
    ## INPUT
        
    # Incoming ssh from the LAN
    iptables -A INPUT -i $INIF -s ${INNET} -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
       
    # TEST Please remove!!
    iptables -A INPUT -i $OUTIF -s ${OUTNET} -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
        
    # Allow any connection from this host.
    iptables -A INPUT -i lo -j ACCEPT
    
    # Allow any connection from the local network.
    iptables -A INPUT -s ${INNET} -j ACCEPT
    iptables -A INPUT -s ${IN_NET2} -j ACCEPT
    
    # Allow all broadcast traffic.
    iptables -A INPUT -m pkttype --pkt-type broadcast -j ACCEPT
    
    
    ## OUTPUT
    
    # Enable al outgoing traffic to internet
    iptables -A OUTPUT -o $OUTIF -d ${OUTNET} -j ACCEPT
    
    # Enable access traffic, from the firewall to the LAN network
    iptables -A OUTPUT -o $INIF -d ${INNET} -j ACCEPT
    iptables -A OUTPUT -o $IN_IF2 -d ${IN_NET2} -j ACCEPT
    
    ## FORWARD
    
    # We have dynamic IP (DHCP), so we've to masquerade
    iptables -t nat -A POSTROUTING -o $OUTIF -j MASQUERADE
    iptables -A FORWARD -o $OUTIF -i $INIF -s ${INNET} -m conntrack --ctstate NEW -j ACCEPT
    iptables -A FORWARD -o $OUTIF -i $IN_IF2 -s ${IN_NET2} -m conntrack --ctstate NEW -j ACCEPT
    
    ## LOGGING
    
    iptables -A INPUT -j LOG --log-level 4 --log-prefix '[FW INPUT]: '
    iptables -A OUTPUT -j LOG --log-level 4 --log-prefix '[FW OUTPUT]: '
    iptables -A FORWARD -j LOG --log-level 4 --log-prefix '[FW FORWARD ]: '
    

    Das führen wir nun aus und sollten in der Lage sein, wenn man sich ein passende IP gibt, am Port 2 oder Port 3 eine Verbindung ins Netz zu bekommen.

    Jetzt etwas praktischer gestalten mit DHCP

    DHCP-Server

    Installation mit

    apt install isc-dhcp-server
    

    Danach gibt es zwei Dateien, die interessant sind.

    • /etc/default/isc-dhcp-server
    • /etc/dhcp/dhcpd.conf

    /etc/default/isc-dhcp-server

    # Defaults for isc-dhcp-server (sourced by /etc/init.d/isc-dhcp-server)
    
    # Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf).
    #DHCPDv4_CONF=/etc/dhcp/dhcpd.conf
    #DHCPDv6_CONF=/etc/dhcp/dhcpd6.conf
    
    # Path to dhcpd's PID file (default: /var/run/dhcpd.pid).
    #DHCPDv4_PID=/var/run/dhcpd.pid
    #DHCPDv6_PID=/var/run/dhcpd6.pid
    
    # Additional options to start dhcpd with.
    #       Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead
    #OPTIONS=""
    
    # On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
    #       Separate multiple interfaces with spaces, e.g. "eth0 eth1".
    INTERFACESv4="lan0.100 lan0.200"
    #INTERFACESv6=""
    

    Hier geben wir unsere beiden VLans an, auf diesen werden dann IP-Adressen mittels DHCP verteilt.

    /etc/dhcp/dhcpd.conf

    subnet 192.168.1.0 netmask 255.255.255.0 {
     option subnet-mask 255.255.255.0;
     option broadcast-address 192.168.1.255;
     option routers 192.168.1.1;
     option domain-name-servers 192.168.3.1, 1.1.1.1;
     range 192.168.1.10 192.168.1.100;
     }
            
     subnet 192.168.2.0 netmask 255.255.255.0 {
     option subnet-mask 255.255.255.0;
     option broadcast-address 192.168.2.255;
     option routers 192.168.2.1;
     option domain-name-servers 192.168.3.1, 1.1.1.1;
     range 192.168.2.10 192.168.2.100;
     }
    

    Hier stellen wir ein, welche IP-Adressen verteilt werden sollen. Die Router-Adresse, der DNS-Server usw. Sollte selbsterklärend sein. Danach sollte unsere kleine Firewall fertig sein 🙂

    Der DHCP-Server ist immer eine kleine Zicke. Schaut nach ob er läuft.

    service isc-dhcp-server status
    

    Ab und zu, war es bei mir auch nötig, das PID-File zu löschen.

    rm /var/run/dhcpd.pid
    

    Aber wenn alles passt, sollte er auch problemlos starten.

    Firewall Autostart

    Erst wenn alles funktioniert, starten wir iptables automatisch! In

    /etc/rc.local

    kommt folgendes rein

    #!/bin/sh
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.
    
    set -e
    
    # Launch my netfilter rules
    if [ -e '/etc/init.d/firewall' ]
    then
    /bin/sh '/etc/init.d/firewall'
    fi
    
    exit 0
    

    Danach sollte der R2S nach einem Restart alles von alleine starten!

  • Nachdem ich die Tage feststellen musste, das irgendwas mit dem Gerät nicht stimmte, bekam keine DNS Auflösung über die Konsole, habe ich das heute mal eben neuinstalliert.

    Armbian ist ja immer was spezielles 🙂 Hat sich bis heute nix dran geändert.....

    Ok, dann heute mal eben ein neues Image erstellt. Download Gewählt habe ich das Armbian Buster.

    Image auf die SD-Karte, eingeloggt. Alles wie oben erstellt und abgespeichert. Neustart, geht wieder alles. 😍

    root@192.168.3.15's password: 
     _   _                         _   ____  ____  ____  
    | \ | | __ _ _ __   ___  _ __ (_) |  _ \|___ \/ ___| 
    |  \| |/ _` | '_ \ / _ \| '_ \| | | |_) | __) \___ \ 
    | |\  | (_| | | | | (_) | |_) | | |  _ < / __/ ___) |
    |_| \_|\__,_|_| |_|\___/| .__/|_| |_| \_\_____|____/ 
                            |_|                          
    Welcome to Debian GNU/Linux 10 (buster) with Linux 5.9.11-rockchip64
    
    System load:   2%           	Up time:       11 min		
    Memory usage:  10% of 978M   	IP:            192.168.3.15 192.168.1.1 192.168.2.1
    CPU temp:      61°C           	Usage of /:    5% of 29G    	
    
    Last login: Sun Dec  6 12:28:10 2020 from 192.168.3.213
    

    Kernelversion

    root@nanopi-r2s:~# uname -a
     Linux nanopi-r2s 5.9.11-rockchip64 #20.11.1 SMP PREEMPT Fri Nov 27 21:59:08 CET 2020 aarch64 GNU/Linux
    

    ip a

    oot@nanopi-r2s:~# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
        link/ether b2:b5:10:38:9e:76 brd ff:ff:ff:ff:ff:ff
        inet 192.168.3.15/24 brd 192.168.3.255 scope global dynamic eth0
           valid_lft 6360sec preferred_lft 6360sec
        inet6 2a02:908:xxxxxx/64 scope global dynamic mngtmpaddr 
           valid_lft 7196sec preferred_lft 596sec
        inet6 fe80::b0b5:10ff:fe38:9e76/64 scope link 
           valid_lft forever preferred_lft forever
    3: lan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether b2:b5:10:38:9e:96 brd ff:ff:ff:ff:ff:ff
    4: lan0.100@lan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether b2:b5:10:38:9e:96 brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.1/24 brd 192.168.1.255 scope global lan0.100
           valid_lft forever preferred_lft forever
        inet6 fe80::b0b5:10ff:fe38:9e96/64 scope link 
           valid_lft forever preferred_lft forever
    5: lan0.200@lan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether b2:b5:10:38:9e:96 brd ff:ff:ff:ff:ff:ff
        inet 192.168.2.1/24 brd 192.168.2.255 scope global lan0.200
           valid_lft forever preferred_lft forever
        inet6 fe80::b0b5:10ff:fe38:9e96/64 scope link 
           valid_lft forever preferred_lft forever
    

    Vom Notebook aus funktioniert auch alles. So weit bin ich zufrieden. Jetzt mal langsam anfangen, der Kiste IPv6 beizubringen. Oje, nicht gerade mein Lieblingsthema...

    Bis der NanoPi R4S hier ankommt und ein vernünftiges Image hat, vergeht ja noch was Zeit...

  • Update 1.32.3 released

    Vaultwarden
    1
    0 Stimmen
    1 Beiträge
    94 Aufrufe
    Niemand hat geantwortet
  • Vaultwarden bekommt Aufmerksamkeit vom BSI

    Vaultwarden
    1
    0 Stimmen
    1 Beiträge
    151 Aufrufe
    Niemand hat geantwortet
  • Proxmox - Video Tipp

    Proxmox
    1
    0 Stimmen
    1 Beiträge
    124 Aufrufe
    Niemand hat geantwortet
  • Crowdsec - Ein fail2ban Ersatz?

    Linux
    2
    0 Stimmen
    2 Beiträge
    756 Aufrufe
    FrankMF

    Ich kann jetzt hier von meiner ersten Erfahrung berichten und wie CrowdSec mich gebannt hat 🙂

    Was war passiert? Ich war gestern sehr intensiv mit der Konfiguration von Nextcloud <-> Collabora Online beschäftigt. Nachdem ich irgendwie nicht weiterkam habe ich mich der Erstellung eines Dokumentes gewidmet. Nach einiger Zeit war die Nextcloud nicht mehr erreichbar.

    Ok, hatte ich bei der Konfiguration auch schon mal, den Server einmal neugestartet und fertig. Doch jetzt kam es, Server neugestartet - hilft nicht. Gut, schauen wir mal nach, Der SSH Login ging auch nicht 😞

    Jetzt war guter Rat gefragt. Zu diesem Zeitpunkt ging ich noch davon aus, das auf diesem Server kein CrowdSec installiert war, sondern fail2ban. Und fail2ban hatte eine sehr kurze Bantime vom 10M.

    Also blieb wohl nur noch das Rescue System von Hetzner.

    488866bc-3dcf-4abc-9e98-6107d65aa4c7-grafik.png

    Da hatte ich ja so gut wie gar keine Erfahrung mit. Also mal kurz den Nico angetriggert und es kam folgender Link.

    Link Preview Image Hetzner Rescue-System - Hetzner Docs

    favicon

    (docs.hetzner.com)

    Das Laufwerk war schnell bestimmt und schnell nach /tmp gemountet. Danach musste man sich noch mit chroot in diese Umgebung anmelden.

    chroot-prepare /mnt chroot /mnt

    Nachdem das klappte, habe ich eben fail2ban disabled.

    sysmctl disable fail2ban

    Danach das Rescue beendet. Der Server startete wieder und ich kam wieder per SSH drauf. Puuh.
    Bei meiner ersten Kontrolle fiel mir was auf

    root@:~# pstree systemd─┬─2*[agetty] ├─atd ├─cron ├─crowdsec─┬─journalctl │ └─8*[{crowdsec}] ├─crowdsec-firewa───9*[{crowdsec-firewa}]

    Wie? Da läuft CrowdSec? Da ich dabei bin die Server auf CrowdSec umzustellen, war das wohl hier schon gemacht, aber leider nicht vernünftig. fail2ban hätte mindestens disabled werden müssen und in meiner Dokumentation war das auch nicht enthalten. 6 setzen!

    CrowdSec besteht ja aus zwei Diensten, CrowdSec und dem Firewall-Bouncer. Der CrowdSec Dienst lief aber nicht, der war irgendwie failed. Ok, starten wir ihn und schauen was passiert. Nachdem er gestarte war mal die Banliste angeschaut.

    cscli decisions list

    ergab diesen Eintrag.

    2551501 │ crowdsec │ Ip:5.146.xxx.xxx │ crowdsecurity/http-crawl-non_statics │ ban │ │ │ 53 │ 1h5m55.391864693s │ 1671

    Meine IP war gebannt. Dann wissen wir ja , woher die Probleme kamen.

    cscli decisions delete --id 2551501

    Nach Eingabe war der Ban entfernt. Na gut, aber da ich aktuell immer noch an der richtigen Konfiguration von NC <-> CODE bastel, könnte das ja wieder passieren. Was machen? Kurz gegoogelt. Es gibt eine Whitelist. Aha!

    /etc/crowdsec/parsers/s02-enrich/whitelists.yaml

    name: crowdsecurity/whitelists description: "Whitelist events from private ipv4 addresses" whitelist: reason: "private ipv4/ipv6 ip/ranges" ip: - "127.0.0.1" - "::1" - "5.146.XXX.XXX" cidr: - "192.168.0.0/16" - "10.0.0.0/8" - "172.16.0.0/12" # expression: # - "'foo.com' in evt.Meta.source_ip.reverse"

    Danach den Dienst neustarten. Jetzt hoffen wir mal, das es hilft.

    Zum Schluss noch was, was mir aufgefallen war und was mich auch sehr verwirrt hatte. CrowdSec hatte wegen einem crowdsecurity/http-crawl-non_statics gebannt. Dadurch konnte ich meine
    subdomain.<DOMAIN> nicht erreichen. Ok, logisch, wenn der Ban von da ausgeht. Ich konnte aber gleichzeitig eine andere subdomain mit derselben <DOMAIN> auch nicht erreichen. Komplett verwirrte es mich dann, als ich eine andere <DOMAIN> auf dem selben Server erreichen konnte. Und zum Schluss ging auch der SSH nicht.

    Also, wieder viel gelernt.. 🤓

  • Star64 - Warnung

    Angeheftet Star64
    1
    0 Stimmen
    1 Beiträge
    72 Aufrufe
    Niemand hat geantwortet
  • Redis - Datenbanken löschen

    Redis
    1
    0 Stimmen
    1 Beiträge
    221 Aufrufe
    Niemand hat geantwortet
  • IPTables Logging

    Linux
    1
    0 Stimmen
    1 Beiträge
    287 Aufrufe
    Niemand hat geantwortet
  • Installation von Grav & NGinx & PHP7.2

    Angeheftet Verschoben Grav
    2
    0 Stimmen
    2 Beiträge
    1k Aufrufe
    FrankMF

    Nachdem ich den ROCKPro64 jetzt auf den Mainline umgestellt habe, lief meine Testinstallation von Grav nicht mehr.

    Hilfreiche Sache um das Problem zu lösen -> https://gist.github.com/GhazanfarMir/03bd1f1f770a3834d47274586d46ea62

    Ich bekam immer 502 Bad Gateway, Grund war ein nicht korrekt gestarteter php-pfm Service.

    rock64@rockpro64v2_0:/usr/local/bin$ sudo service php7.2-fpm start rock64@rockpro64v2_0:/usr/local/bin$ sudo service php7.2-fpm status ● php7.2-fpm.service - The PHP 7.2 FastCGI Process Manager Loaded: loaded (/lib/systemd/system/php7.2-fpm.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2018-08-16 20:15:20 CEST; 21s ago Docs: man:php-fpm7.2(8) Main PID: 3206 (php-fpm7.2) Status: "Processes active: 0, idle: 2, Requests: 3, slow: 0, Traffic: 0.2req/sec" Tasks: 3 (limit: 4622) CGroup: /system.slice/php7.2-fpm.service ├─3206 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf) ├─3207 php-fpm: pool www └─3208 php-fpm: pool www Aug 16 20:15:19 rockpro64v2_0 systemd[1]: Starting The PHP 7.2 FastCGI Process Manager... Aug 16 20:15:20 rockpro64v2_0 systemd[1]: Started The PHP 7.2 FastCGI Process Manager.