Frage an Experten: Opennvpn mit iptables/fail2ban absichern

  • Ich habe auf einem vServer openvpn und fail2ban installiert. Ich habe mir folgende iptables zusammenprobiert. Die Frage ist, ob ihr das für sicher haltet, oder ob da Schnitzer darin sind?

    Der SSH-Zugriff soll nur von der IP 77.22.xx.xx erlaubt sein, openvpn soll für Roadwarrior als Internet-Relais zur Verfügung stehen, wobei hier die Source-IP natürlich wechselt.

    Vielleicht kann mir ja jemand erklären, was die drei folgenden Regel bedeuten:

    Code
    1. iptables -I INPUT -i lo -j ACCEPT
    2. iptables -I INPUT ! -i lo -s 127.0.0.0/8 -j DROP
    3. iptables -I OUTPUT -o lo -j ACCEPT

    Diese erstellen in der INPUT chain die Einträge #2 und #3 und in der OUTPUT chain den Eintrag #2.

    Das hat wohl was mit dem Loopback zu tun, aber mir ist nicht zu 100% klar, was genau.


    Danke für eure Antworten.

  • ich hab bei mir nur die beiden folgenden Regeln im Zshg. mit dem loopback-Device

    Code
    1. -A INPUT -i lo -j ACCEPT -A OUTPUT -o lo -j ACCEPT

    und das sowohl f. iptables (IPv4) als auch f. ip6tables (IPv6)


    ohne dieser Regeln wirds etwas schwierig mit z.B. ping6 ::1 od. ping 127.0.0.1

    Grüße / Greetings

    Walter H.


    RS 1000 SAS G8 xRAM; RS 500 SSD G8; S 1000 G7; VPS 200 G8 Akt.; Webhost. 1000 m. 75%

  • Hi,


    Ich selber bin kein Freund von iptables direkt und benutze daher immer "ufw". Vielleicht möchtest du dir das auch mal anschauen, weil es viel simpler zu konfigurieren und einfacher zu verstehen ist.

    Ich kann dir nicht viel zu deinen Chains sagen, aber beispielsweise der dritte Eintag der Input Chain macht doch den Rest obsolet, oder nicht?

    Code
    1. 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0

    Man möge mich bitte korrigieren, aber dadurch darf sich doch jeder verbinden?



    Mit ufw würde ich das so machen:

    Code
    1. ufw default deny incoming     # alles verbieten was nicht explizit erlaubt wird
    2. ufw default allow outgoing    # raus darf dein Server überall hin (kannst du natürlich noch anpassen)
    3. ufw allow from 77.22.xx.xx to any port 22    # das verbinden zum SSH Port nur für deine IP erlauben
    4. ufw allow 1194                # verbinden zum OpenVPN Port erlauben, erlaubt von überall


    Wenn ich mich nicht verlesen habe, sollte das schon für dich genügen. Danach dann einfach die ufw starten, aber denk dran dich nicht auszusperren:

    Code
    1. ufw enable
  • ...

    Ich kann dir nicht viel zu deinen Chains sagen, aber beispielsweise der dritte Eintag der Input Chain macht doch den Rest obsolet, oder nicht?

    ...


    Das ist mir ach suspekt. Aber ich habe das irgentdwo gelesen:

    Code
    1. # Allow all loopback (lo) traffic and reject traffic
    2. # to localhost that does not originate from lo.
    3. iptables -A INPUT -i lo -j ACCEPT
    4. iptables -A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT
    5. iptables -A OUTPUT -o lo -j ACCEPT

    daraus resultiert der Eintrag:

    Code
    1. 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0

    wenn das nicht drin ist, habe ich immer Einträge im Log das output vom 127.0.0.1 zu 127.0.0.1 denied werden.


    Code
    1. iptables_OUTPUT_denied:"IN= OUT=lo SRC=127.0.0.1 DST=127.0.0.1


    ufw, ja, bin aber eher old fashioned.

  • Ahh sorry, lesen müsste man können :pinch: Hab voll übersehen, dass das vom Loopback Interface kommt. (Kann man das nicht in der Chain Übersicht selbst irgendwie sehen?)


    Generell würde ich dazu sagen, dass du über die Loopback Adresse eben noch mit dir selbst kommunizieren darfst, weil beispielsweise eine Anwendung auf localhost lauscht. Der zweite Befehl davon

    Code
    1. iptables -I INPUT ! -i lo -s 127.0.0.0/8 -j DROP

    verbietet nur explizit nochmal, dass nichts außer 127.0.0.0/8 mit deinem Loopback Interface kommunizieren darf (also nur du selbst).


    Das ist jetzt aber sehr gefährliches Halbwissen, ich lass lieber die anderen übernehmen. Bitte korrigiert mich, falls ich Schwachsinn laber!

  • Kann man in der chain nicht sehen. Auf Jeden Fall ist es so, dass ich nicht mit einer andern ip als 77.22.xx.xx auf irgenetwas außer udp 1194 zugreifen kann.


    ein list ohne line-numbers und ohne -n sieht so aus(da sieht man auch nicht, das das sich wohl auf loopback bezieht)

  • Habe hier noch einmal die iptables Befehle mit Kommentar zusammengefasst. Dort sind mehr Infos drin.

    Ich hoffe, dass ich mit eurer Hilfe die Kommentare #unsicher warum auflösen kann.

  • die Regeln sind irgendwie etwas konfus und inkonsistent ...

    - 2mal ESTABLISHED, RELATED mit INPUT, aber keine mit FORWARD,

    und vor allem bei FORWARD, welcher Source und welcher Destination Port?

    - default Policy jeweils ACCEPT, und dann die OUTPUT Regeln auf die DNS-Server?

    und die noch dazu unvollständig ...

    - der Kommentar '#Policy ACCEPT weil ich loggen will' ist auch falsch

    Grüße / Greetings

    Walter H.


    RS 1000 SAS G8 xRAM; RS 500 SSD G8; S 1000 G7; VPS 200 G8 Akt.; Webhost. 1000 m. 75%

  • Ok, hier überarbeitet.

    die Regeln sind irgendwie etwas konfus und inkonsistent ...

    ja, stimmt, liegt daran, dass ein Script die Regeln erstellt und ich die da falsch heraus-kopiert habe.


    ...

    - 2mal ESTABLISHED, RELATED mit INPUT, aber keine mit FORWARD,

    ...

    auch ein Kopierfehler.


    ...

    und vor allem bei FORWARD, welcher Source und welcher Destination Port?

    ...

    alle, weil die openvpn Client über die vServer public IP weiter in's Internet sollen.


    - default Policy jeweils ACCEPT, und dann die OUTPUT Regeln auf die DNS-Server?

    Konzept soll sein, Regel trifft zu und wird angewendet,kein Logeintrag, wenn keine Regel zutrfft, dann wird geloggt und anschließend gedroppt.

    Die OUTPUT Regeln waren Quatsch, danke für den Tipp.


    Hier die Befehle und darunter der Qutput von iptables -L --line-numbers -n -v

    Ich hoffe, dass das schon besser, zumindest aber übersichtlicher ist.

  • Warum müllst du dir den syslog damit zu?

    Weil ich überrascht war, was da los ist. Ist nur temporär um zu sehen, ob meine Regeln funktionieren. Ich habe auf meiner Vodafone IP eine Firewall, wo praktisch nie jemand versucht, einzudringen. Aber bei einem Server in einer Serverfarm scheint das für die Bösen lohnenswerter zu sein.

    Wenn ich sicher bin, das meine iptables-rules greifen, fliegt das natürlich 'raus und die default policy wird auf DROP gesetzt.


    Hier mal ein Auszug einer Auswertung der denied per Script (Doppelungen schon gefiltert):

    DATE/TIME Chain IP-ADDRESS

    21.02.2020 20:58:30 INPUT 111.200.54.170

    21.02.2020 20:58:57 INPUT 170.106.36.97

    21.02.2020 20:59:02 INPUT 185.39.10.63

    21.02.2020 20:59:16 INPUT 185.137.233.164

    21.02.2020 20:59:21 INPUT 93.174.95.73

    21.02.2020 20:59:22 INPUT 92.118.37.53

    21.02.2020 20:59:24 INPUT 185.53.88.130

    21.02.2020 20:59:38 INPUT 185.176.27.18

    21.02.2020 20:59:54 INPUT 80.82.78.192

    21.02.2020 20:59:56 INPUT 84.168.35.77

    21.02.2020 21:00:12 INPUT 92.118.37.55

    21.02.2020 21:00:40 INPUT 176.113.115.252

    21.02.2020 21:00:41 INPUT 31.184.215.50

    21.02.2020 21:00:51 INPUT 185.176.27.170

    21.02.2020 21:00:52 INPUT 80.82.65.62

    21.02.2020 21:00:54 INPUT 220.191.249.130

    21.02.2020 21:01:36 INPUT 91.206.15.191

    21.02.2020 21:01:48 INPUT 185.143.223.81

    21.02.2020 21:01:58 INPUT 159.89.181.213

    21.02.2020 21:02:06 INPUT 13.233.149.135

    21.02.2020 21:02:16 INPUT 182.61.163.32

    21.02.2020 21:02:24 INPUT 52.66.239.225

    21.02.2020 21:02:47 INPUT 15.206.172.234

    21.02.2020 21:02:49 INPUT 13.126.190.209

    21.02.2020 21:02:50 INPUT 80.82.70.118

    21.02.2020 21:03:27 INPUT 190.131.151.154

    21.02.2020 21:03:39 INPUT 80.82.70.239

    21.02.2020 21:04:15 INPUT 42.179.227.246

    21.02.2020 21:04:19 INPUT 45.136.109.251

    21.02.2020 21:05:03 INPUT 185.156.73.49

    21.02.2020 21:05:11 INPUT 192.241.224.91

    21.02.2020 21:05:32 INPUT 185.176.27.178

    21.02.2020 21:05:37 INPUT 185.151.242.216

    21.02.2020 21:05:54 INPUT 83.97.20.49

    21.02.2020 21:06:32 INPUT 194.26.29.129

    21.02.2020 21:07:06 INPUT 13.233.113.113

    21.02.2020 21:07:17 INPUT 178.218.200.161

    21.02.2020 21:07:24 INPUT 13.233.112.72

    21.02.2020 21:07:29 INPUT 89.248.168.202

    21.02.2020 21:07:33 INPUT 203.186.48.186

    21.02.2020 21:07:52 INPUT 35.154.80.175

    21.02.2020 21:08:16 INPUT 42.119.216.237

    21.02.2020 21:09:07 INPUT 167.71.202.235

    21.02.2020 21:09:13 INPUT 92.119.160.52

    21.02.2020 21:09:56 INPUT 194.26.29.121

    21.02.2020 21:10:19 INPUT 185.112.249.168

    21.02.2020 21:11:04 INPUT 188.246.224.219

    21.02.2020 21:11:56 INPUT 193.32.161.12

    21.02.2020 21:11:57 INPUT 51.75.52.127

    21.02.2020 21:12:01 INPUT 194.61.27.240

    21.02.2020 21:12:02 INPUT 94.102.56.215

    21.02.2020 21:12:06 INPUT 13.232.182.172

    21.02.2020 21:12:17 INPUT 192.64.112.32

    21.02.2020 21:12:18 INPUT 192.241.223.18

    21.02.2020 21:12:23 INPUT 13.127.15.212

    21.02.2020 21:12:45 INPUT 45.143.221.46

    21.02.2020 21:12:48 INPUT 13.127.158.98

    21.02.2020 21:13:02 INPUT 185.209.0.91

    21.02.2020 21:13:26 INPUT 185.176.27.6

    21.02.2020 21:14:01 INPUT 92.118.37.86

    21.02.2020 21:14:42 INPUT 190.60.213.172

    21.02.2020 21:14:54 INPUT 210.44.14.54

    21.02.2020 21:15:40 INPUT 27.76.81.242

    21.02.2020 21:15:56 INPUT 5.188.210.158

    21.02.2020 21:16:44 INPUT 112.35.76.1

    21.02.2020 21:17:32 INPUT 92.63.196.3

    21.02.2020 21:18:05 INPUT 206.189.177.133

  • alle, weil die openvpn Client über die vServer public IP weiter in's Internet sollen.

    klar, ist aber dennoch Unsinn;


    du erlaubst, dass auch 10.x.x.x Adressen nach innen kommen ...


    Code
    1. # Allow forwarding to internet
    2. -A FORWARD -i tun0 -o eth0 -j ACCEPT
    3. # Allow established, related packets back through
    4. -A FORWARD -i eth0 -o tun0 -m state --state ESTABLISHED,RELATED -j ACCEPT

    das ist ausreichend f. die Geschichte mit den VPN clients, die kommen am Port tun0 rein, und werden auf eth0 nach draußen weitergeleitet


    f. die VPN Infrastruktur als solches noch

    Code
    1. # Enable DHCP for VPNs
    2. -A INPUT -i tun0 -m udp -p udp --sport 67:68 --dport 67:68 -j ACCEPT
    3. # Enable DNS for VPN
    4. -A INPUT -i tun0 -m tcp -p tcp --dport 53 -m state --state NEW -j ACCEPT
    5. -A INPUT -i tun0 -m udp -p udp --dport 53 -j ACCEPT

    und

    Code
    1. # Enable TRACEroute to me from VPN
    2. -A INPUT -i tun0 -p udp --sport 32769:65535 --dport 33434:33523 -j ACCEPT
    3. # Pings to me with no restriction are allowed from VPN
    4. -A INPUT -i tun0 -p icmp -j ACCEPT


    den Sinn von der Regel

    1. #ssh output nach 77.22.xx.xx
    2. iptables -A OUTPUT -p tcp -d 77.22.xx.xx --sport 22 -j ACCEPT

    musst mir erklären, vor allem wenn man diese Regel hier schon hat:

    1. #ssh nur von 77.22.xx.xx zulassen
    2. iptables -A INPUT -p tcp --src 77.22.xx.xx --dport 22 -j ACCEPT

    Grüße / Greetings

    Walter H.


    RS 1000 SAS G8 xRAM; RS 500 SSD G8; S 1000 G7; VPS 200 G8 Akt.; Webhost. 1000 m. 75%

  • @mainziman

    Wow, tausend Dank für deine Mühe und deine zielführenden Hinweise. Ich glaube ich hab's jetzt hinbekommen.

    DHCP und DNS konnte ich weglassen, habe ich über ccd in openvpn geregelt. Aber guter Hinweis.

    Ping und traceroute habe ich weggelassen, aber wenn ich es mal brauche, weiß ich, dank deiner Hilfe, wie es geht.

    Der entscheidende Hinweis war der für das Forwarding.

    Der vServer ist auch noch VPN-Client bei Perfect-Privacy (anonymes VPN). Einige openvpn-Clients werden dahin weiter geroutet.

    Auch das habe ich dank deiner Hilfe (ich hoffe) sauber gelöst. Die Policies sind jetzt auf DROP und das Logging ist raus, weil jetzt alles funktioniert.

    Nochmal vielen vielen Dank für deine Hilfe!!!

    Jetzt ist das alles viel Übersichtlicher und sieht auch logisch aus. Ich glaube ich hab's jetzt kapiert:)

    Ich hoffe, das passt jetzt so.


    Hier das Ergebnis:

  • da fehlt noch was bzw. ist falsch;

    vor allem durch die Trennung INPUT, OUTPUT, FORWARD wirds unübersichtlich;


    wo ist das OUTPUT Gegenstück zu Zeile 17?

    wo ist das INPUT Gegenstück zu Zeile 40? bzw. ist Zeile 40 ohnehin Fehl am Platz


    ebenfalls bei den INPUT und OUTPUT Regeln gehören die entsprechenden Ports dazu

    z.B. bei INPUT -i eth0

    bzw. bei OUTPUT -o eth0

    Grüße / Greetings

    Walter H.


    RS 1000 SAS G8 xRAM; RS 500 SSD G8; S 1000 G7; VPS 200 G8 Akt.; Webhost. 1000 m. 75%

  • So, jetzt aber:


    Das PREROUTIG und POSTROUTING wird durch ein Python Skript erledigt(sieht kompliziert aus ist es aber nicht. Das Skript von dem VPN-Client ausgeführt, der sich mit Perfect Privacy verbindet. Hier zur Info der Output.