Openvpn Zugriff im Netzwerk mit IPtables beschränken

Gemeinsam ins Internet mit Firewall und Proxy.
Antworten
ddtobi
Beiträge: 19
Registriert: 17.02.2012 07:16:20
Lizenz eigener Beiträge: GNU General Public License

Openvpn Zugriff im Netzwerk mit IPtables beschränken

Beitrag von ddtobi » 27.10.2016 09:16:48

Hallo liebe Gemeinde.

Ich habe hier einen Openvpn Server aufgesetzte an dem sich mehrere Clients anmelden.
So weit so gut, das klappt auch alles super.
Der gesamte Traffic der Clients im VPN Netzwerk soll über den VPN Server geleitet werden, auch das funktioniert.
Nun ist es so, das nur ein bestimmter Client (Berlin) aus dem VPN Netzwerk auf alle anderen Clients im VPN Netzwerk via SSH Zugriff haben darf.
Aber alle andren VPN Clients dürfen sich nicht untereinander erreichen/sehen.
Weiterhin müssen aber alle Clients aus dem VPN Netzwerk ins Internet gelangen um via apt-get auf dem aktuellen Stand gehalten werden zu können.

Jetzt zu meiner Frage.
Wie kann ich das mit IPtables abbilden?
Leider habe ich mit IPtables noch nicht so viel Erfahrung.
Könnt ihr mir eventuell mit IPtables ein wenig weiterhelfen?
Da ich nur Remote (via SSH) an dem Server Arbeite, traue ich mich nicht alleine.

auf dem Server (Debian 8.6 Jessie) wurde folgendes eingestellt.

Code: Alles auswählen

echo "1" > /proc/sys/net/ipv4/ip_forward
und hier noch die Konfigdateien:

server.conf

Code: Alles auswählen

port 1194

proto tcp-server
mode server
tls-server
dev tun

tun-mtu 1492
mssfix

ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/xxxxx.crt
key /etc/openvpn/easy-rsa/keys/xxxxx.key

dh /etc/openvpn/easy-rsa/keys/dh2048.pem

server 10.8.0.0 255.255.255.0

# Clients bekommen immer die selbe IP-Adresse
ifconfig-pool-persist ipp.txt

#Damit gelöschte Clients nicht mehr zugreifen können
#Diese Datei wird aber erst nach einem revoke-full <Zertifikatsname> angelegt
crl-verify /etc/openvpn/easy-rsa/keys/crl.pem

push "route 192.168.111.0 255.255.255.0"

push "dhcp-option DNS 192.168.111.1"
push "dhcp-option DNS 10.8.0.1"

#push "redirect-gateway def1 bypass-dhcpbypass-dhcp"
push "redirect-gateway"

push "topology subnet"
topology subnet

route 10.8.0.0 255.255.255.0

client-to-client
#duplicate-cn

keepalive 10 120

comp-lzo

user nobody
group nogroup

persist-key
persist-tun

management 127.0.0.1 5555

status /var/log/openvpn-status.log 30
log-append    /var/log/openvpn.log
verb 4

client.conf

Code: Alles auswählen

client
#Zertifikate
ca /home/xxxx/Schreibtisch/vpn_keys/ca.crt
cert /home/xxxx/Schreibtisch/vpn_keys/linux1.crt
key /home/xxxx/Schreibtisch/vpn_keys/linux1.key                                                                                                                                                                                              

float
dev tun
proto tcp

tun-mtu 1492
mssfix

remote xxxx.de 1194
redirect-gateway
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
log /var/log/openvpn.log
verb 4

Schemazeichnung
448

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Openvpn Zugriff im Netzwerk mit IPtables beschränken

Beitrag von rendegast » 27.10.2016 10:54:12

Vielleicht eher
- 'client-to-client' NICHT benutzen
- 'topology p2p'
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

ddtobi
Beiträge: 19
Registriert: 17.02.2012 07:16:20
Lizenz eigener Beiträge: GNU General Public License

Re: Openvpn Zugriff im Netzwerk mit IPtables beschränken

Beitrag von ddtobi » 27.10.2016 13:12:28

Danke für deine Antwort.
topology p2p kann ich leider nicht verwenden, das es auch Windows Clients im VPN Netzwerk geben wird.

Wenn ich client-to-client ausschalte, kann ja auch der Rechner, der der die anderen via ssh erreichen soll, nichts mehr machen, oder sehe ich das falsch?

Gruß Tobi

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: Openvpn Zugriff im Netzwerk mit IPtables beschränken

Beitrag von MSfree » 27.10.2016 13:29:48

ddtobi hat geschrieben:Wenn ich client-to-client ausschalte, kann ja auch der Rechner, der der die anderen via ssh erreichen soll, nichts mehr machen, oder sehe ich das falsch?
Jein.

Derjenige, der die anderen per SSH erreichen soll, könnte über Bande spielen. Er müßte sich per SSH beim VPN-Server anmelden und könnte von dort eine zweite SSH-Verbindung zum entpsrechenden Client öffnen.

ddtobi
Beiträge: 19
Registriert: 17.02.2012 07:16:20
Lizenz eigener Beiträge: GNU General Public License

Re: Openvpn Zugriff im Netzwerk mit IPtables beschränken

Beitrag von ddtobi » 27.10.2016 13:57:53

Ok, das wäre eine Lösung, aber unschön, da die Clients eigentlich keinen Zugriff auf den Server bekommen sollen.

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: Openvpn Zugriff im Netzwerk mit IPtables beschränken

Beitrag von MSfree » 27.10.2016 14:06:42

ddtobi hat geschrieben:Ok, das wäre eine Lösung, aber unschön, da die Clients eigentlich keinen Zugriff auf den Server bekommen sollen.
Naja, es ist ja nur ein Client, der Zugriff bräuchte. Dem könntest du über die OpenVPN-Konfiguration eine konstante IP-Adresse zuweisen, so daß du per iptables den SSH-Zugang auf genau diese eine IP begrenzen könntest.

ddtobi
Beiträge: 19
Registriert: 17.02.2012 07:16:20
Lizenz eigener Beiträge: GNU General Public License

Re: Openvpn Zugriff im Netzwerk mit IPtables beschränken

Beitrag von ddtobi » 27.10.2016 16:20:38

Das ist genau das was ich will, aber wie sähe das dann in IPtables Schreibweise aus?

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: Openvpn Zugriff im Netzwerk mit IPtables beschränken

Beitrag von MSfree » 27.10.2016 16:32:00

ddtobi hat geschrieben:Das ist genau das was ich will, aber wie sähe das dann in IPtables Schreibweise aus?

Code: Alles auswählen

# default policy ist DROP
iptables -P OUTPUT  DROP
iptables -P INPUT   DROP
iptables -P FORWARD DROP

#  erlaube ESTABLISHED,RELATED
iptables -A INPUT   -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# weitere Regeln
...
# erlaubte SSH-Verbindung für eine bestimmte IP aus dem VPN-Tunnel:
iptables -A INPUT -i "tun0" -s VPN_IP_DES_ERLAUBTEN_CLIENTS -p tcp --dport 22 -m state --state NEW -j ACCEPT
...etc

ddtobi
Beiträge: 19
Registriert: 17.02.2012 07:16:20
Lizenz eigener Beiträge: GNU General Public License

Re: Openvpn Zugriff im Netzwerk mit IPtables beschränken

Beitrag von ddtobi » 27.10.2016 16:56:47

Danke für die Regel, leider geht es nicht, es haben weiterhin alle anderen im Netzwerk Zugriff über SSH.

Code: Alles auswählen

iptables -L -n -v -x
Chain INPUT (policy ACCEPT 11349 packets, 2274929 bytes)
    pkts      bytes target     prot opt in     out     source               destination
       0        0 ACCEPT     tcp  --  tun0   *       10.8.0.3             0.0.0.0/0            tcp dpt:22 state NEW

Chain FORWARD (policy ACCEPT 43 packets, 5889 bytes)
    pkts      bytes target     prot opt in     out     source               destination
    9729   651780 ACCEPT     all  --  tun0   eth0    10.8.0.0/24          192.168.111.0/24     ctstate NEW

Chain OUTPUT (policy ACCEPT 10636 packets, 3971184 bytes)
    pkts      bytes target     prot opt in     out     source               destination


Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: Openvpn Zugriff im Netzwerk mit IPtables beschränken

Beitrag von MSfree » 27.10.2016 19:41:03

ddtobi hat geschrieben:Danke für die Regel, leider geht es nicht

Code: Alles auswählen

iptables -L -n -v -x
Chain INPUT (policy ACCEPT 11349 packets, 2274929 bytes)
...
Solange deine default Policy "ACCEPT" ist, darf sich halt jeder auch mit Port 22 verbinden. :wink:

Deshalb habe ich auch die default Policy auf "DROP" gesetzt, siehe oben.

ddtobi
Beiträge: 19
Registriert: 17.02.2012 07:16:20
Lizenz eigener Beiträge: GNU General Public License

Re: Openvpn Zugriff im Netzwerk mit IPtables beschränken

Beitrag von ddtobi » 27.10.2016 21:16:27

OK, das macht Sin. ABER was ist dann mit allen anderen Diensten auf dem Server (WWW, SFTP u.s.w.) sind die danach noch alle erreichbar?

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: Openvpn Zugriff im Netzwerk mit IPtables beschränken

Beitrag von MSfree » 27.10.2016 21:53:20

ddtobi hat geschrieben:OK, das macht Sin. ABER was ist dann mit allen anderen Diensten auf dem Server (WWW, SFTP u.s.w.) sind die danach noch alle erreichbar?
Nein, dafür mußt du ebenfalls Regeln erstellen. Meine Vorgehensweise mit iptables ist, erstmal alles zuzusperren und dann selektiv einzelne Verbindungen zu öffnen, auch OpenVPN braucht dann eine Regel, um die VPN-Pakete in den Server zu lassen. Das ganze birgt allerdings das Risiko, daß man sich aussperrt, was bei einem Remotesystem "etwas" unangenehm ist, weil man keine Konsole hat. Also solltest du auf jeden Fall die oben genannten ESTABLISHED,RELATED-Regeln in deinem Firewallskript haben.

Der Trick dabei ist, daß man sich erstmal auf der Kiste einlogt, z.B. direkt über SSH, dann die iptables-Regeln etabliert. Durch die ESTABLISHED,RELATED-Regeln bleibt deine SSH-Verbindung auf jeden Fall offen. Wenn du nun eine weitere SSH-Verbindung aufbaust und das fehlschlagen sollte, hast du die erste Verbindung noch als Notanker (oder dein Anbieter hat ein Rettungssystem, das aus der Ferne aufrufbar ist).

ddtobi
Beiträge: 19
Registriert: 17.02.2012 07:16:20
Lizenz eigener Beiträge: GNU General Public License

Re: Openvpn Zugriff im Netzwerk mit IPtables beschränken

Beitrag von ddtobi » 27.10.2016 22:38:45

OK verstanden.

Ich habe mir jetzt mit hilfe eines IPtable Konfigurators ein script gebaut.

Code: Alles auswählen

#!/bin/sh

#####################################################
# IPTables Firewall-Skript                          #
#                                                   #
# erzeugt mit dem IPTables-Skript-Generator auf     #
#      tobias-bauer.de - Version 0.4                #
# URL: http://www.tobias-bauer.de/iptables.html     #
#                                                   #
# Autor: Tobias Bauer                               #
# E-Mail: scripts@tobias-bauer.de                   #
#                                                   #
# Das erzeugte Skript steht unter der GNU GPL!      #
#                                                   #
# ACHTUNG! Die Benutzung des Skriptes erfolgt auf   #
# eigene Gefahr! Ich übernehme keinerlei Haftung    #
# für Schäden die durch dieses Skript entstehen!    #
#                                                   #
#####################################################

# iptables suchen
iptables=`which iptables`

# wenn iptables nicht installiert abbrechen
test -f $iptables || exit 0

case "$1" in
   start)
      echo "Starte Firewall..."
      # alle Regeln löschen
      $iptables -t nat -F
      $iptables -t filter -F
      $iptables -X

      # neue Regeln erzeugen
      #$iptables -N garbage
      #$iptables -I garbage -p TCP -j LOG --log-prefix='[Drop-TCP]' --log-level 4
      #$iptables -I garbage -p UDP -j LOG --log-prefix='[Drop-UDP]' --log-level 4
      #$iptables -I garbage -p ICMP -j LOG --log-prefix='[Drop-ICMP]' --log-level 4
      #$iptables -A INPUT -s 192.168.111.0/24 -j LOG --log-prefix='[netfilter] ' --log-level 4
      $iptables -A INPUT -s 10.8.0.0/24 -j LOG --log-prefix='[netfiltervpn] ' --log-level 4
      # Default Policy
      $iptables -P INPUT DROP
      $iptables -P OUTPUT DROP
      $iptables -P FORWARD DROP

      # über Loopback alles erlauben
      $iptables -I INPUT -i lo -j ACCEPT
      $iptables -I OUTPUT -o lo -j ACCEPT

      #####################################################
      # ausgehende Verbindungen
      # Port 21
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 21 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 21 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o eth0 -p TCP --sport 49152:65535 --dport 20 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 20 --dport 49152:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 22
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 22 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o tun0 -p TCP --sport 1024:65535 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i tun0 -p TCP --sport 22 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 25
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 25 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 25 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 53
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 53 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o eth0 -p UDP --sport 1024:65535 --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p UDP --sport 53 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 80
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 80 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o tun0 -p TCP --sport 1024:65535 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i tun0 -p TCP --sport 80 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 110
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 110 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 110 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 123
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 123 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 123 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o eth0 -p UDP --sport 1024:65535 --dport 123 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p UDP --sport 123 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 143
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 143 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 143 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 443
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 443 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 443 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 465
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 465 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 465 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 993
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 993 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 993 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 995
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 995 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 995 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 1863
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 1863 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 1863 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 3306
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 3306 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 3306 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 5190
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 5190 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 5190 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 5050
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 5050 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 5050 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 5222
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 5222 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 5222 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 6667
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 6667 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 6667 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 9898
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 9898 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 9898 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # ICMP
      $iptables -I OUTPUT -o eth0 -p ICMP --icmp-type echo-request -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p ICMP --icmp-type echo-reply -m state --state ESTABLISHED,RELATED -j ACCEPT

      #####################################################
      # eingehende Verbindungen
      # Port 21
      $iptables -I INPUT -i eth0 -p TCP --sport 1024:65535 --dport 21 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o eth0 -p TCP --sport 21 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 1024:65535 --dport 1024:65535 -m state --state NEW -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 1024:65535 --dport 20 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o eth0 -p TCP --sport 49152:65535 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o eth0 -p TCP --sport 20 --dport 1024:65535 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      # Port 22
      $iptables -I INPUT -i eth0 -p TCP --sport 1024:65535 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o eth0 -p TCP --sport 22 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 22 aus VPN Netz erlauben
      $iptables -A INPUT -i tun0 -s 10.8.0.3 -p tcp --dport 22 -m state --state NEW -j ACCEPT
      # Port 80
      $iptables -I INPUT -i eth0 -p TCP --sport 1024:65535 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o eth0 -p TCP --sport 80 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i tun0 -p TCP --sport 1024:65535 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o tun0 -p TCP --sport 80 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 443
      $iptables -I INPUT -i eth0 -p TCP --sport 1024:65535 --dport 443 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o eth0 -p TCP --sport 443 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # ICMP
      $iptables -I INPUT -i eth0 -p ICMP --icmp-type echo-request -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o eth0 -p ICMP --icmp-type echo-request -m state --state ESTABLISHED,RELATED -j ACCEPT
      #####################################################
      # Erweiterte Sicherheitsfunktionen
      # SynFlood
      $iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
      # PortScan
      $iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
      # Ping-of-Death
      $iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

      #####################################################
      # VPN Netz routen
      $iptables -D FORWARD -i tun0 -o eth0 -s 10.8.0.0/24 -d 192.168.111.0/24 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT

      #####################################################
      # bestehende Verbindungen akzeptieren
      $iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
      $iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

      #####################################################
      # Garbage übergeben wenn nicht erlaubt
      #$iptables -A INPUT -m state --state NEW,INVALID -j garbage

      #####################################################
      # alles verbieten was bisher erlaubt war
      #$iptables -A INPUT -j garbage
      #$iptables -A OUTPUT -j garbage
      #$iptables -A FORWARD -j garbage
      ;;
   stop)
      echo "Stoppe Firewall..."
      $iptables -t nat -F
      $iptables -t filter -F
      $iptables -X
      $iptables -P INPUT ACCEPT
      $iptables -P OUTPUT ACCEPT
      $iptables -P FORWARD ACCEPT
      ;;
   restart|reload|force-reload)
   $0 stop
   $0 start
      ;;
   *)
      echo "Usage: $0 (start|stop)"
      exit 1
      ;;
esac
exit 0
fehlt mir da jetzt noch was?

was momentan noch nicht geht, ich erreiche die Clients im VPN Netzt weder mit ping noch mit ssh aus dem normalen 192er netzt nicht.
wo liegt hier der fehler?

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: Openvpn Zugriff im Netzwerk mit IPtables beschränken

Beitrag von MSfree » 28.10.2016 12:21:08

ddtobi hat geschrieben:Ich habe mir jetzt mit hilfe eines IPtable Konfigurators ein script gebaut.
Man sieht's :facepalm:

Das liest sich ja grauenvoll und sieht auch nur ansatzweise nach dem aus, was du eigentlich willst.
fehlt mir da jetzt noch was?
Öhm, wo soll ich da jetzt anfangen?

Willst du wirklich, daß der Server von aussen mit FTP, SSH, HTTP und HTTPS erreichbar ist?
Vor allem die Erreichbarkeit über SSH finde ich eigenartig, denn du wolltest doch gerade das einschränken.
Den OpenVPN-Port hast du vergessen.

Die OUTPUT-Regeln finde ich ebenfalls fragwürdig:
Wofür brauchst du ausgehend
# Port 21 FTP
# Port 22 SSH
# Port 25 SMTP
# Port 53 DNS
# Port 80 HTTP
# Port 110 POP3
# Port 123 NTP
# Port 143 IMAP
# Port 443 HTTPS
# Port 465 SMTPS
# Port 993 IMAPS
# Port 995 POP3S
# Port 1863 Microsoft Notification Protocol
# Port 3306 MySQL
# Port 5190 ICQ
# Port 5050 Yahoo messanger
# Port 5222 XMPP
# Port 6667 IRC
# Port 9898 ?

Forward Regeln hast du (fast) komplett vergessen.

ddtobi
Beiträge: 19
Registriert: 17.02.2012 07:16:20
Lizenz eigener Beiträge: GNU General Public License

Re: Openvpn Zugriff im Netzwerk mit IPtables beschränken

Beitrag von ddtobi » 28.10.2016 12:38:19

ok.

Ich habe ja noch eine Firewall die das gesamte Netzt nach ausen schützt, da ist natürlich nur www zum Webserver und vpn zugelassen.
Aber ich möchte natürlich im INTERNEN Netzt diverse Dienste auf dem Server erreichen, deshalb habe ich das da in die IPtables mit rein genommen.

Welche Forward regeln fehlen deiner Meinung nach noch?

Gruß Tobi

PS: hier die angepasste IPtables

Code: Alles auswählen

# iptables suchen
iptables=`which iptables`

# wenn iptables nicht installiert abbrechen
test -f $iptables || exit 0

case "$1" in
   start)
      echo "Starte Firewall..."
      # alle Regeln löschen
      $iptables -t nat -F
      $iptables -t filter -F
      $iptables -X

      # neue Regeln erzeugen
      $iptables -N garbage
      $iptables -A garbage -p TCP -j LOG --log-prefix='[Drop-TCP]' --log-level 4
      $iptables -A garbage -p UDP -j LOG --log-prefix='[Drop-UDP]' --log-level 4
      $iptables -A garbage -p ICMP -j LOG --log-prefix='[Drop-ICMP]' --log-level 4

      # VPN Logging
      $iptables -A INPUT -s 10.8.0.0/24 -j LOG --log-prefix='[netfiltervpn] ' --log-level 4

      # Default Policy
      $iptables -P INPUT DROP
      $iptables -P OUTPUT DROP
      $iptables -P FORWARD DROP

      # über Loopback alles erlauben
      $iptables -I INPUT -i lo -j ACCEPT
      $iptables -I OUTPUT -o lo -j ACCEPT

      #####################################################
      # ausgehende Verbindungen
      # Port 22
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 22 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 25
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 25 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 25 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 53
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 53 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o eth0 -p UDP --sport 1024:65535 --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p UDP --sport 53 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 80
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 80 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o tun0 -p TCP --sport 1024:65535 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i tun0 -p TCP --sport 80 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 443
      $iptables -I OUTPUT -o eth0 -p TCP --sport 1024:65535 --dport 443 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 443 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # ICMP
      $iptables -I OUTPUT -o eth0 -p ICMP --icmp-type echo-request -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p ICMP --icmp-type echo-reply -m state --state ESTABLISHED,RELATED -j ACCEPT

      #####################################################
      # eingehende Verbindungen
      # Port 21
      $iptables -I INPUT -i eth0 -p TCP --sport 1024:65535 --dport 21 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o eth0 -p TCP --sport 21 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 1024:65535 --dport 1024:65535 -m state --state NEW -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 1024:65535 --dport 1024:65535 -m state --state NEW -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 1024:65535 --dport 20 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o eth0 -p TCP --sport 49152:65535 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o eth0 -p TCP --sport 20 --dport 1024:65535 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      # Port 22
      $iptables -I INPUT -i eth0 -p TCP --sport 1024:65535 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o eth0 -p TCP --sport 22 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 22 aus VPN Netz erlauben
      $iptables -A INPUT -i tun0 -s 10.8.0.3 -p tcp --dport 22 -m state --state NEW -j ACCEPT
      # Port 80
      $iptables -I INPUT -i eth0 -p TCP --sport 1024:65535 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o eth0 -p TCP --sport 80 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i tun0 -p TCP --sport 1024:65535 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o tun0 -p TCP --sport 80 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Port 443
      $iptables -I INPUT -i eth0 -p TCP --sport 1024:65535 --dport 443 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o eth0 -p TCP --sport 443 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
      # ICMP
      $iptables -I INPUT -i eth0 -p ICMP --icmp-type echo-request -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I OUTPUT -o eth0 -p ICMP --icmp-type echo-request -m state --state ESTABLISHED,RELATED -j ACCEPT

      ###############################################################################
      #
      # VPN Konfiguration
      #
      ###############################################################################
      #OpenVPN Verbindungen zum Server zulassen
      $iptables -A INPUT -i eth0 -m state --state NEW -p tcp --dport 1194 -j ACCEPT
      $iptables -A FORWARD -i tun+ -j ACCEPT
      $iptables -A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
      $iptables -A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
      $iptables -A OUTPUT -o tun+ -j ACCEPT

      #####################################################
      # VPN Netz routen
      $iptables -A FORWARD -i tun0 -o eth0 -s 10.8.0.0/24 -d 192.168.111.0/24 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT


      #####################################################
      # Erweiterte Sicherheitsfunktionen
      # SynFlood
      $iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
      # PortScan
      $iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
      # Ping-of-Death
      $iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

      #####################################################
      # bestehende Verbindungen akzeptieren
      $iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
      $iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

      #####################################################
      # Garbage übergeben wenn nicht erlaubt
      $iptables -A INPUT -m state --state NEW,INVALID -j garbage

      #####################################################
      # alles verbieten was bisher erlaubt war
      $iptables -A INPUT -j garbage
      $iptables -A OUTPUT -j garbage
      $iptables -A FORWARD -j garbage
      ;;
   stop)
      echo "Stoppe Firewall..."
      $iptables -t nat -F
      $iptables -t filter -F
      $iptables -X
      $iptables -P INPUT ACCEPT
      $iptables -P OUTPUT ACCEPT
      $iptables -P FORWARD ACCEPT
;;
   restart|reload|force-reload)
   $0 stop
   $0 start
      ;;
   *)
      echo "Usage: $0 (start|stop)"
      exit 1
      ;;
esac
exit 0


ddtobi
Beiträge: 19
Registriert: 17.02.2012 07:16:20
Lizenz eigener Beiträge: GNU General Public License

Re: Openvpn Zugriff im Netzwerk mit IPtables beschränken

Beitrag von ddtobi » 28.10.2016 12:46:11

eigentlich will ich ja auch nur das interface tun0 limitieren, alles andere was vom internen netz auf den Server zugreifen möchte, das wollte ich ja gar nicht mit iptables begrenzen.
Kann man das irgendwie so einstellen, das die Iptableregeln nur das Interface tun0 betreffen?
Und das alles was über eth0 rein und raus geht, das soll nicht geblockt werden.

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: Openvpn Zugriff im Netzwerk mit IPtables beschränken

Beitrag von MSfree » 28.10.2016 13:47:22

ddtobi hat geschrieben:Ich habe ja noch eine Firewall die das gesamte Netzt nach ausen schützt, da ist natürlich nur www zum Webserver und vpn zugelassen.
Das könnte man alles mit einem Regelsatz erschlagen.
Aber ich möchte natürlich im INTERNEN Netzt diverse Dienste auf dem Server erreichen, deshalb habe ich das da in die IPtables mit rein genommen.
Dafür sind aber nicht die OUTPUT-Regeln da sondern die INPUT-Regeln und/oder die FORWARD-Regeln.
Welche Forward regeln fehlen deiner Meinung nach noch?
Wenn die Clients, die sich per VPN mit dem Server verbinden, dann weiter ins Internet wollen, also z.B. http://www.google.com via VPN durch deinen Server aufrufen wollen, muß man eine entsprechende Regel dafür definieren.
Kann man das irgendwie so einstellen, das die Iptableregeln nur das Interface tun0 betreffen?
Und das alles was über eth0 rein und raus geht, das soll nicht geblockt werden.
Man kann, besonders sinnvoll wäre das aber nicht. Eine Firewall sollte nach dem Whitelisting-Prinzip funktionieren, also alles verbieten ausser das, was wiklich nötig ist. Und nicht nach dem Blacklisting-Prinzip, bei dem alles erlaubt ist ausser das, was man explizit verbietet. Blacklisting bedeutet immer, daß wenn es links nicht geht, macht man einen Umweg rechts um den Häuserblock und kommt dann trotzdem dahin, wo man eigentlich nicht hin dürfte.

Ganz konkret wäre es unsinig, SSH via tun0 (also OpenVPN) zwar nur für eine IP-Adresse zuzulassen, wenn man mit SSH ohne VPN via eth0 auf die Kiste käme.

Es wäre (für mich) leichter, wenn du aufzählen würdest, welche Dienste über welche Schnittstelle erreichbar sein sollen, dann kann man dazu auch ein deutlich lesbareres Regelskript verfassen.

ddtobi
Beiträge: 19
Registriert: 17.02.2012 07:16:20
Lizenz eigener Beiträge: GNU General Public License

Re: Openvpn Zugriff im Netzwerk mit IPtables beschränken

Beitrag von ddtobi » 28.10.2016 19:07:17

Danke für deine Denkanstöse.

Prinzipiell hast du ja recht mit dem Whitelistingprinzip aber das mache ich ja schon an meiner Äusseren Firewall. Die Firewall auf dem Server brauche ich ja nur, damit die VPN Nutzer nicht in mein Internes Netzwerk kommen aber denn noch ins Internet können. Und weiterhin nur ein festgelegter Rechner IM VPN Netz SSH auf ALLE VPN Clients machen kann.

Der Server an sich, auf dem der OpenVpn Server läuft, bietet im Internen Netzwerk (eth0: 192.168.111.0/24) folgende Dienste an:
- Webserver (80,8080,443)
- SSH (22)
- Icinga2 (5665)
- Samba
- Logserver

hilft das weiter?

Gruß Tobi

TomL

Re: Openvpn Zugriff im Netzwerk mit IPtables beschränken

Beitrag von TomL » 28.10.2016 22:20:13

Moin

Weil ich mich auch gerade erstmalig mit den Iptables beschäftige habe ich mir mal Dein Monsterscript angesehen und mich gefragt, welcher Nicht-Fachmann kann da noch den Überblick behalten? Müsste das nicht viel einfacher gehen..... mit wenigen kurzen Regeln...

- Regel 1 erlaubt den Clients aus dem VPN-Netz/24 den FORWARD auf den LAN-Router(-IP) für den Internetzugang
- Regel 2 erlaubt den Clients aus dem -s VPN/24 den FORWARD auf den -d Server(-IP)
- Regel 3 erlaubt der MAC aus Berlin den FORWARD auf alle Clients des -d VPN-Netzes/24
- Regel 4 erlaubt der MAC aus Berlin den Zugriff auf alle Clients des -d LAN/24
- Regel 5 DROP't -s VPN/24 -d LAN/24
- Regel 6 DROP't -s VPN/24 -d VPN/24

Dazu noch MASQUERADE für NAT und eigentlich müsste das dann doch wie gewollt funktionieren :roll: Im Moment, bei dem was ich bisher (glaub ich) verstanden habe, braucht es doch für diesen speziellen Zweck gar keine INPUT- oder OUTPUT-Regeln, da es sich hier doch immer um geroutete Pakete handelt, also alles, was mit der FORWARD-Chain gehandelt wird.

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: Openvpn Zugriff im Netzwerk mit IPtables beschränken

Beitrag von MSfree » 30.10.2016 13:15:59

Ich habe mir dein Problem noch einmal von einer anderen Seite überlegt.

Wenn ich das richtig verstehe, willst du ja eigentlich nur, daß deine Benutzer keine interaktive Loginshell bekommen. Das kann man sehr einfach erreichen, in dem du deinen Nutzern keine Loginshell wie bash gibts sondern sie in der /etc/passwd aud /bin/false setzt. Für Dienste wie FTP oder .htaccess können sich deine Benutzer dann immer noch autentifizieren, bekommen aber kein Login mehr. Ein SSH-Login wird dann automatisch auch unmöglich. Ein paar Benutzer, du und deine Admins, darfst du natütlich nich aussperren, die brauchen weiterhin eine Loginshell (/bin/bash).

Eine weitere Sicherheitsmaßname kann eine Beschränkung des SSH-Dienstes sein. Du könntest z.B. das Paßwort-Login verbieten und nur Login über Schlüssel zulassen. Der entsprechende Eintrag in der /etc/ssh/ssd_config lautet:

Code: Alles auswählen

PasswordAuthentication no
Auch Root-Login läßt sich sperren:

Code: Alles auswählen

PermitRootLogin no
Der SSH-Dienst läßt sich auch auf bestimmte Benutzer beschränken:

Code: Alles auswählen

AllowUser user1 user2
oder auch noch restrictiver, nur User von einer bestimmten IP-Adresse:

Code: Alles auswählen

AllowUsers = User@192.168.123.45
Natürlich könnte man mit iptables auch einiges ausrichten. Da du aber eine "äußere" Firewall hast, über die ich kein Urteil abgeben kann, müßten oben genannte Maßnahmen reichen, deinen VPN-Server ausreichend abzusichern.

Antworten