Skip to content

RockPro64 - Firewall mit zwei LAN Schnittstellen!

Verschoben ROCKPro64
  • Ich benutze ja schon länger für verschiedene Einsatzzwecke USB3-to-LAN-Schnittstellen. Einen dieser Adapter, habe ich schon jahrelang an meiner IPFire (IntelNUC).

    Nun wollte ich mal versuchen, wie das so aussieht am ROCKPro64. Wird sie erkannt, läuft sie, was für Probleme tauchen auf usw. Ich habe mich so ziemlich an folgenden Beitrag gehalten https://forum.frank-mankel.org/topic/120/ubuntu-bionic-ip-adresse-ändern

    Also, was haben wir vor? Zwei Schnittstellen, eth0 holt sich per DHCP die Informationen aus meinem LAN. Die Schnittstelle enx000acd26e2c8 bildet ein LAN, das ganze soll durch iptables geschützt sein. Kein Zugriff von außen!

    Hardware

    • ROCKPro64 v2.1 2GB RAM
    • USB-to-LAN DeLock 62121

    Software

    rock64@rockpro64v2_1:/etc$ uname -a
    Linux rockpro64v2_1 4.4.132-1077-rockchip-ayufan-gbaf35a9343cb #1 SMP Mon Jul 30 14:06:57 UTC 2018 aarch64 aarch64 aarch64 GNU/Linux
    

    Schnittstellen

    eth0

    • DHCP
    • 192.168.3.x

    enx000acd26e2c8

    • 192.168.0.0/24

    Ähm, kleine Anmerkung: Geht das nicht einheitlich, also eth0,eth1 usw. Ich glaube das ist veraltet, das neue ist dann dieses enx000acd26e2c8. Also, einheitlich wäre mir lieber!?!

    Hier die Lösung.

    Konfiguration netplan

    /etc/netplan/eth0.yaml

    network:
      version: 2
      renderer: networkd
      ethernets:
        eth0:
          dhcp4: true
        enx000acd26e2c8:
          dhcp4: no
          addresses: [192.168.0.1/24]
    

    Netzwerk neustarten

    Direkt mit

    netplan apply      
    

    oder mit

    netplan try
    

    netplan try ermöglicht, das man eine falsche Konfiguration automatisch wieder zurücksetzen lassen kann.

    Nach dem Neustart sieht das dann so aus.

    rock64@rockpro64v2_1:~$ ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
        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 fq_codel state UNKNOWN group default qlen 1000
        link/ether 1e:0e:99:52:8e:40 brd ff:ff:ff:ff:ff:ff
        inet 192.168.3.17/24 brd 192.168.3.255 scope global dynamic eth0
           valid_lft 2224sec preferred_lft 2224sec
        inet6 fe80::1c0e:99ff:fe52:8e40/64 scope link 
           valid_lft forever preferred_lft forever
    3: enx000acd26e2c8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 00:0a:cd:26:e2:c8 brd ff:ff:ff:ff:ff:ff
        inet 192.168.0.1/24 brd 192.168.0.255 scope global enx000acd26e2c8
           valid_lft forever preferred_lft forever
        inet6 fe80::20a:cdff:fe26:e2c8/64 scope link 
           valid_lft forever preferred_lft forever
    

    Konfiguration iptables

    Dazu erstellen wir ein Script /etc/firewall.sh

    #!/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'
    
    ## 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 enx000acd26e2c8 -s 192.168.0.0/24 \
    -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 192.168.0.0/24 -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 eth0 -d 192.16.3.0/0 -j ACCEPT
       
    # Enable access traffic, from the firewall to the LAN network
    iptables -A OUTPUT -o enx000acd26e2c8 -d 192.168.0.0/24 -j ACCEPT
    
    ## FORWARD
          
    # We have dynamic IP (DHCP), so we've to masquerade
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    iptables -A FORWARD -o eth0 -i enx000acd26e2c8 -s 192.168.0.0/24 \
    -m conntrack --ctstate NEW -j ACCEPT
          
    # Redirect HTTP (tcp/80) to the web server (192.168.0.2)
    #iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \
    # -j DNAT --to-destination 192.168.0.2:80
    #
    #iptables -A FORWARD -i eth0 -p tcp --dport 80 \
    # -o eth1 -d 192.168.0.2 \
    # -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 starten wir nun mal zum Testen.

    sudo chmod +x firewall.sh
    sudo ./firewall.sh
    

    Achtung! Die offene Konsole bleibt bestehen, aber einmal den ROCKPro64 neustarten und die Konsole ist weg. Dann hilft nur noch die serielle Schnittstelle, oder ein angeschlossenes Notebook am LAN. Wenn denn alles funktioniert 😉 Also Konsole nicht zumachen!!

    Nun kann man testen ob alles so funktioniert, wie es soll. Sollte dies nun alles problemlos funktionieren schreiben wir ein Script, so das das Firewall-Script automatisch beim Starten des ROCKPro64 ausgeführt wird.

    Unter /etc/rc.local folgendes Script erstellen.

    #!/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/firewall.sh' ]
    then
    /bin/sh '/etc/firewall.sh'
    fi
    
    exit 0
    

    Rechte entsprechend anpassen.

    sudo chmod +x rc.local
    

    Danach den Rechner neu starten. Macht dies bitte ganz zum Schluss, wenn alles klappt.


    Sollen die Rechner im LAN (enx000acd26e2c8) automatisch eine IP-Adresse bekommen, so brauchen wir einen DHCP-Server, der diese an die entsprechenden Teilnehmer verteilt.

    DHCP-Server

    Nach einer kurzen Testphase, habe ich begriffen, das man DNSMASQ nur mit tiefgreifenden Änderungen am Grundsystem von Ubuntu 18.04.1 benutzen kann. Da scheint es doch viele Änderungen gegeben zu haben. Da ich zu viele Änderungen am Grundsystem nicht mag, muss ich mich wohl oder übel mit den neuen Sachen vertraut machen.

    Nach Recherche im Netz habe ich den hoffentlich richtigen DHCP-Server gefunden.

    Installation

    sudo apt-get install isc-dhcp-server

    Konfiguration /etc/dhcp/dhcpd.conf

    Der DHCP-Server stellt auf der enx000acd26e2c8-Schnittstelle IP-Adressen zur Verfügung. Die 3.1 ist mein DNS-Server im lokalen Netz.(eth0)

    # 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="enx000acd26e2c8";
    INTERFACESv6="";
    
    #authoritative;
        
    # Sample /etc/dhcpd.conf
    # (add your comments here) 
    default-lease-time 600;
    max-lease-time 7200;
    option subnet-mask 255.255.255.0;
    option broadcast-address 192.168.0.255;
    option routers 192.168.0.1;
    option domain-name-servers 192.168.3.1, 1.1.1.1;
    option domain-name "mydomain.example";
    
    subnet 192.168.0.0 netmask 255.255.255.0 {
    range 192.168.0.10 192.168.0.100;
    #range 192.168.1.10 192.168.1.20;
    }
    

    Ich hatte ein paar Probleme mit der Konfig, weil da ; fehlten. Mit folgendem Befehl kann man die Konfig testen.

    dhcpd -t -cf /etc/dhcp/dhcpd.conf   
    

    Starten

    sudo service isc-dhcp-server start
    

    Status

    sudo service isc-dhcp-server status
    

    Am Ende klappt alles so, wie ich es mir vorgestellt habe.

    Speedtest

    Konsole

    rock64@rockpro64v2_1:~$ iperf3 -c 192.168.3.213
    Connecting to host 192.168.3.213, port 5201
    [  4] local 192.168.3.17 port 45344 connected to 192.168.3.213 port 5201
    [ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
    [  4]   0.00-1.01   sec   108 MBytes   890 Mbits/sec    0   5.65 MBytes       
    [  4]   1.01-2.00   sec   114 MBytes   964 Mbits/sec    0   5.65 MBytes       
    [  4]   2.00-3.00   sec   112 MBytes   942 Mbits/sec    0   5.65 MBytes       
    [  4]   3.00-4.00   sec   112 MBytes   940 Mbits/sec   11   2.82 MBytes       
    [  4]   4.00-5.01   sec   112 MBytes   943 Mbits/sec    0   2.82 MBytes       
    [  4]   5.01-6.00   sec   111 MBytes   937 Mbits/sec   11   1.41 MBytes       
    [  4]   6.00-7.00   sec   112 MBytes   941 Mbits/sec   11    723 KBytes       
    [  4]   7.00-8.00   sec   112 MBytes   943 Mbits/sec   11    363 KBytes       
    [  4]   8.00-9.01   sec   112 MBytes   943 Mbits/sec    0    416 KBytes       
    [  4]   9.01-10.00  sec   111 MBytes   936 Mbits/sec   11    300 KBytes       
    - - - - - - - - - - - - - - - - - - - - - - - - -
    [ ID] Interval           Transfer     Bandwidth       Retr
    [  4]   0.00-10.00  sec  1.09 GBytes   938 Mbits/sec   55             sender
    [  4]   0.00-10.00  sec  1.09 GBytes   935 Mbits/sec                  receiver
    
    iperf Done.
    rock64@rockpro64v2_1:~$ iperf3 -c 192.168.3.213 -R
    Connecting to host 192.168.3.213, port 5201
    Reverse mode, remote host 192.168.3.213 is sending
    [  4] local 192.168.3.17 port 45348 connected to 192.168.3.213 port 5201
    [ ID] Interval           Transfer     Bandwidth
    [  4]   0.00-1.00   sec   110 MBytes   922 Mbits/sec                  
    [  4]   1.00-2.00   sec   112 MBytes   941 Mbits/sec                  
    [  4]   2.00-3.00   sec   112 MBytes   939 Mbits/sec                  
    [  4]   3.00-4.00   sec   111 MBytes   932 Mbits/sec                  
    [  4]   4.00-5.00   sec   112 MBytes   941 Mbits/sec                  
    [  4]   5.00-6.00   sec   112 MBytes   941 Mbits/sec                  
    [  4]   6.00-7.00   sec   112 MBytes   941 Mbits/sec                  
    [  4]   7.00-8.00   sec   112 MBytes   941 Mbits/sec                  
    [  4]   8.00-9.00   sec   112 MBytes   942 Mbits/sec                  
    [  4]   9.00-10.00  sec   112 MBytes   941 Mbits/sec                  
    - - - - - - - - - - - - - - - - - - - - - - - - -
    [ ID] Interval           Transfer     Bandwidth       Retr
    [  4]   0.00-10.00  sec  1.09 GBytes   939 Mbits/sec    0             sender
    [  4]   0.00-10.00  sec  1.09 GBytes   938 Mbits/sec                  receiver
    
    iperf Done.
    

    LAN Notebook

    frank@thinkpad:~$ iperf3 -c 192.168.3.213
    Connecting to host 192.168.3.213, port 5201
    [  4] local 192.168.0.10 port 38566 connected to 192.168.3.213 port 5201
    [ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
    [  4]   0.00-1.00   sec  58.5 MBytes   491 Mbits/sec   91   1.19 MBytes       
    [  4]   1.00-2.00   sec  57.9 MBytes   485 Mbits/sec    0   1.32 MBytes       
    [  4]   2.00-3.00   sec  57.7 MBytes   484 Mbits/sec    0   1.42 MBytes       
    [  4]   3.00-4.00   sec  57.8 MBytes   485 Mbits/sec    1   1.05 MBytes       
    [  4]   4.00-5.00   sec  58.0 MBytes   487 Mbits/sec    0   1.13 MBytes       
    [  4]   5.00-6.00   sec  57.9 MBytes   485 Mbits/sec    0   1.18 MBytes       
    [  4]   6.00-7.00   sec  58.0 MBytes   486 Mbits/sec    0   1.22 MBytes       
    [  4]   7.00-8.00   sec  58.0 MBytes   486 Mbits/sec    0   1.24 MBytes       
    [  4]   8.00-9.00   sec  57.9 MBytes   485 Mbits/sec    0   1.25 MBytes       
    [  4]   9.00-10.00  sec  57.8 MBytes   485 Mbits/sec    0   1.26 MBytes       
    - - - - - - - - - - - - - - - - - - - - - - - - -
    [ ID] Interval           Transfer     Bandwidth       Retr
    [  4]   0.00-10.00  sec   579 MBytes   486 Mbits/sec   92             sender
    [  4]   0.00-10.00  sec   577 MBytes   484 Mbits/sec                  receiver
    
    iperf Done.
    frank@thinkpad:~$ iperf3 -c 192.168.3.213 -R
    Connecting to host 192.168.3.213, port 5201
    Reverse mode, remote host 192.168.3.213 is sending
    [  4] local 192.168.0.10 port 38570 connected to 192.168.3.213 port 5201
    [ ID] Interval           Transfer     Bandwidth
    [  4]   0.00-1.00   sec  73.4 MBytes   615 Mbits/sec                  
    [  4]   1.00-2.00   sec  91.9 MBytes   771 Mbits/sec                  
    [  4]   2.00-3.00   sec  90.6 MBytes   760 Mbits/sec                  
    [  4]   3.00-4.00   sec  91.5 MBytes   767 Mbits/sec                  
    [  4]   4.00-5.00   sec  90.6 MBytes   760 Mbits/sec                  
    [  4]   5.00-6.00   sec  91.5 MBytes   767 Mbits/sec                  
    [  4]   6.00-7.00   sec  90.5 MBytes   759 Mbits/sec                  
    [  4]   7.00-8.00   sec  91.7 MBytes   769 Mbits/sec                  
    [  4]   8.00-9.00   sec  91.7 MBytes   769 Mbits/sec                  
    [  4]   9.00-10.00  sec  91.2 MBytes   765 Mbits/sec                  
    - - - - - - - - - - - - - - - - - - - - - - - - -
    [ ID] Interval           Transfer     Bandwidth       Retr
    [  4]   0.00-10.00  sec   896 MBytes   752 Mbits/sec    0             sender
    [  4]   0.00-10.00  sec   895 MBytes   751 Mbits/sec                  receiver
    
    iperf Done.
    

    Fazit

    War mal wieder ein hartes Stück Arbeit. Und an alle Experten, die das hier lesen, wenn was falsch ist freue ich mich über konstruktive Kritik.

    Und für Einsteiger, bitte nutzt das so nicht an einer Internetleitung. Damit der Server sicher ist benötigt es noch viel mehr Arbeit. Dazu gibt es viele Hilfeseiten im Netz.

    Links

    https://linoxide.com/linux-how-to/install-configure-dhcp-ubuntu/