Openvpn: Unterschied zwischen den Versionen
HK (Diskussion | Beiträge) (→Server) |
F (Diskussion | Beiträge) |
||
(33 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
+ | [[Openwrt#openvpn]] | ||
+ | |||
+ | = setup unter lxc debian buser = | ||
+ | [[debian_buster_lxc_vpn]] | ||
+ | |||
+ | |||
+ | = setup unter lxc debian jessie = | ||
+ | [[debian_jessie_lxc_vpn]] | ||
= Einfaches Setup für zwei Maschinen = | = Einfaches Setup für zwei Maschinen = | ||
Zeile 52: | Zeile 60: | ||
yum makecache | yum makecache | ||
− | yum install openvpn -y | + | yum install openvpn easy-rsa -y |
+ | Ifconfig wird benötigt, es ist per default nicht installiert. | ||
+ | yum install net-tools -y | ||
+ | |||
+ | === Zertifikate erstellen === | ||
+ | Wir bauen uns unsere eigene Certification Authority.<br> | ||
+ | Wichtiger Hinweiß: Aus Sicherheitsgründen sollten der '''ca.key''' niemals auf dem Server verbleiben! | ||
+ | |||
+ | Easy-rsa findet sich bei CentOS 7 in | ||
+ | /usr/share/easy-rsa/2.0 | ||
+ | Das verzeichniss '''2.0''' kopieren wir an einen Platz unserer Wahl, der Ordner kann jeden Namen haben.<br> | ||
+ | Empfehlenswert ist ein Verzeichnissname, der den Namen des VPN widerspiegelt. | ||
+ | |||
+ | In '''vars''' folgende Positionen ändern | ||
+ | vim vars | ||
+ | |||
+ | export KEY_COUNTRY="<Dein Länderkürzel>" | ||
+ | export KEY_PROVINCE="<Dein Bundesland>" | ||
+ | export KEY_CITY="<Deine Stadt>" | ||
+ | export KEY_ORG="<Deine Organisation/Firma>" | ||
+ | export KEY_EMAIL="<Deine E-Mail-Adresse>" | ||
+ | export KEY_OU="<Abteilung>" | ||
+ | |||
+ | export KEY_NAME="<irgendwas sinnvollen, VPN-Name mit Name>" | ||
+ | |||
+ | Danach folgende Schritte ausführen. | ||
+ | . ./vars | ||
+ | ./clean-all | ||
+ | ./build-ca | ||
+ | ''' ./build-ca''' wird die Frage nach dem '''Common Name''' aufwerfen.<br> | ||
+ | Irgendwas sinnvolles, vielleicht VPN-Name.<br> | ||
+ | |||
+ | ==== Server Key und Zertifikat ==== | ||
+ | <Servername> sollte der gleiche String wie '''Common Name''', der bei der Erstellung abgefragt wird, sein.<br> | ||
+ | Die anfallenden Files weirden den Prefix <Servername> haben. | ||
+ | ./build-key-server <Servername> | ||
+ | ==== Client Key und Zertifikat ==== | ||
+ | <Clientname> sollte der gleiche String wie '''Common Name''', der bei der Erstellung abgefragt wird, sein.<br> | ||
+ | Die anfallenden Files weirden den Prefix <Clientname> haben. | ||
+ | ./build-key <Clientname> | ||
+ | |||
+ | Sollen später weitere Clienten in das VPN aufgenommen werden, müssen vorher wieder die Variablen aus vars exportiert werden. | ||
+ | . ./vars | ||
+ | Danach können neue Keys und Zertifikate erstellt werden. | ||
+ | ./build-key <neuer Cient> | ||
+ | |||
+ | ==== Diffie Hellman Parameter erstellen ==== | ||
+ | ./build-dh | ||
+ | |||
+ | ==== Verteilung und Zugriffsrechte der Dateien ==== | ||
+ | Bei Erstellung der Schlüssel und Zertifikate für den Server und die Clienten wurden folgende Namen verwendet.<br> | ||
+ | ./build-key-server server | ||
+ | ./build-key client1 | ||
+ | ./build-key client2 | ||
+ | |||
+ | {| class="wikitable" border=1 | ||
+ | ! Dateiname | ||
+ | ! Benötigt von | ||
+ | ! Zweck | ||
+ | ! Geheim | ||
+ | |- | ||
+ | |ca.crt | ||
+ | |Server + alle Clienten | ||
+ | |Root CA Zertifikat | ||
+ | |Nein | ||
+ | |- | ||
+ | |ca.key | ||
+ | |Zertifikat signierende Maschine | ||
+ | |Root CA Schlüssel | ||
+ | |Ja | ||
+ | |- | ||
+ | |dh{n}.pem | ||
+ | |Nur Server | ||
+ | |Diffie Hellman parameter | ||
+ | |Nein | ||
+ | |- | ||
+ | |server.crt | ||
+ | |Nur Server | ||
+ | |Server Zertifikat | ||
+ | |Nein | ||
+ | |- | ||
+ | |server.key | ||
+ | |Nur Server | ||
+ | |Server Schlüssel | ||
+ | |Ja | ||
+ | |- | ||
+ | |client1.crt | ||
+ | |Client1 | ||
+ | |Client1 Zertifikat | ||
+ | |Nein | ||
+ | |- | ||
+ | |client1.key | ||
+ | |Client1 | ||
+ | |Client1 Schlüssel | ||
+ | |Ja | ||
+ | |- | ||
+ | |client2.crt | ||
+ | |Client2 | ||
+ | |Client2 Zertifikat | ||
+ | |Nein | ||
+ | |- | ||
+ | |client2.key | ||
+ | |Client2 | ||
+ | |Client2 Schlüssel | ||
+ | |Ja | ||
+ | |} | ||
+ | |||
=== Config === | === Config === | ||
− | ==== Server ==== | + | ==== Server Config ==== |
− | # Port, default ist 1124 | + | # |
− | port | + | # /etc/openvpn/newvpn.conf |
+ | # Files liegen in /etc/openvpn/newvpn | ||
+ | # und /etc/openvpn/newvpn/ccd-dir | ||
+ | |||
+ | |||
+ | # Port, default ist 1124, alles ist besser als 1124. Minimiert Script-Angriffe. | ||
+ | port <Port des VPN-Servers> | ||
#Protokoll-Typ | #Protokoll-Typ | ||
proto udp | proto udp | ||
Zeile 112: | Zeile 232: | ||
# Verbosity Level | # Verbosity Level | ||
verb 3 | verb 3 | ||
+ | |||
+ | # Achtung: funktionier so nicht. Vielleicht ist der Eintrag eines Gateways notwendig! | ||
+ | # Route for all Clients to this network | ||
+ | push "route 10.8.88.0 255.255.255.0" | ||
+ | route 10.8.88.0 255.255.255.0 | ||
+ | |||
+ | Workaround. Wird auf allen Maschinen ausgeführt, die das Netzwerk erreichen sollen. | ||
+ | route add -net 10.8.88.0/24 gw 10.8.100.200 newvpn | ||
+ | |||
+ | ===== IP Zuweisung an Client ===== | ||
+ | Im Verzeichniss newvpn/ccd-dir liegen die Dateien, die den Clienten feste IPs zuweisen können.<br> | ||
+ | Die Datei hat den selben Namen wie der Common Name im Key des Clienten | ||
+ | |||
+ | Ist der Client-PC der Router eines Netzerkes, auf dass durch andere Client-PCs zugegriffen werden soll, ist der '''iroute''' Eintrag notwendig. | ||
+ | Dadurch weiß der VPN Server, über welche Maschine er ein Netzwerk erreichen kann. | ||
+ | |||
+ | vim <Common Name> | ||
+ | Inhalt der Datei | ||
+ | ifconfig-push 10.8.100.201 255.255.255.0 | ||
+ | iroute 10.8.88.0 255.255.255.0 | ||
+ | |||
+ | ===== Files in newvpn ===== | ||
+ | ca.crt | ||
+ | dh2048.pem | ||
+ | server.crt | ||
+ | server.key | ||
+ | |||
+ | ===== Service starten ===== | ||
+ | Startet automatisch bei Systemstart.<br> | ||
+ | String zwischen '''@''' und '''.service''' ergibt sich aus dem Confignamen | ||
+ | systemctl enable openvpn@server.service | ||
+ | |||
+ | Händischer Start | ||
+ | systemctl start openvpn@server.service | ||
+ | |||
+ | ==== Client Config ==== | ||
+ | |||
+ | # | ||
+ | # /etc/openvpn/newvpn.conf | ||
+ | # Files liegen in /etc/openvpn/newvpn | ||
+ | |||
+ | tls-client | ||
+ | |||
+ | remote <IP oder FQDN des VPN-Servers> <Port des VPN-Servers> | ||
+ | proto udp | ||
+ | |||
+ | dev-type tun | ||
+ | dev newvpn | ||
+ | |||
+ | ca newvpn/ca.crt | ||
+ | cert newvpn/client1.crt | ||
+ | key newvpn/client1.key | ||
+ | |||
+ | # Holt Config vom Server, z.B. IP-Adresse | ||
+ | pull | ||
+ | |||
+ | keepalive 10 120 | ||
+ | |||
+ | comp-lzo | ||
+ | |||
+ | persist-key | ||
+ | persist-tun | ||
+ | |||
+ | verb 3 | ||
+ | |||
+ | ===== Files in newvpn ===== | ||
+ | ca.crt | ||
+ | client1.crt | ||
+ | client1.key | ||
+ | |||
+ | === Remote Network === | ||
+ | Ein Client-PC soll Zugriff auf das Netzwerk eines anderen Clienten bekommen.<br> | ||
+ | * <Service-PC>: Der PC, der auf das Remote Network zugreifen soll. | ||
+ | * <Remote Network Router>: Der Router des Remote Networks. | ||
+ | |||
+ | ==== Zusätzlicher Eintrag in das CCD-File des zugreifenden Clienten ==== | ||
+ | Damit der Client-PC, über den der Fernzugriff auf das Remote Network erfolgen soll, weiß, wie er das Remote Network erreichen kann, enötigt er eine zusätzliche Route.<br> | ||
+ | Dies geschieht per '''push "route <Network> <Netmask> <Gateway>"'''<br> | ||
+ | Der Eintrag sollte im CCD-File gemacht werde und nicht im globalen Config-File, damit nicht unerwünschte Routen zwischen den Netzwerken entstehen.<br> | ||
+ | Ein '''push''' Eintrag in der globalen Config gilt für alle Clienten. | ||
+ | Eine erweiterte Firewall-Regel kann nicht schaden, am besten whitelisting. | ||
+ | |||
+ | vim <Service-PC> | ||
+ | Inhalt der Datei | ||
+ | ifconfig-push 10.8.100.231 255.255.255.0 | ||
+ | push "route 10.8.88.0 255.255.255.0 10.8.100.200" | ||
+ | |||
+ | |||
+ | ==== Zusätzlicher Eintrag in das CCD-File des Routers des zu erreichenden Netzwerkes ==== | ||
+ | |||
+ | |||
+ | Der Client-PC ist der Router eines Netzerkes, auf dass durch andere Client-PCs zugegriffen werden soll | ||
+ | Dazu ist der '''iroute''' Eintrag notwendig. | ||
+ | Dadurch weiß der VPN Server, über welche Maschine er das Netzwerk erreichen kann. | ||
+ | |||
+ | vim <Remote Network Router> | ||
+ | Inhalt der Datei | ||
+ | ifconfig-push 10.8.100.200 255.255.255.0 | ||
+ | iroute 10.8.88.0 255.255.255.0 | ||
+ | |||
+ | == Links == | ||
+ | * https://openvpn.net/index.php/open-source/documentation/howto.html#pki | ||
+ | * https://www.digitalocean.com/community/tutorials/how-to-setup-and-configure-an-openvpn-server-on-centos-7 | ||
+ | * http://backreference.org/2009/11/15/openvpn-and-iroute/ |
Aktuelle Version vom 2. Mai 2020, 11:25 Uhr
Inhaltsverzeichnis
setup unter lxc debian buser
setup unter lxc debian jessie
Einfaches Setup für zwei Maschinen
Auf beiden Maschinen
apt-get install openvpn
Server side
openvpn --genkey --secret secret.key
scp secret.key root@<remote host>
vim /etc/openvpn/simple.conf
dev tun
ifconfig 10.8.0.1 10.8.0.2
secret secret.key
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
user nobody
group nogroup
daemon
Client side
Der <remote.host> muss durch den Clienten aufgelöst werden können.
Entweder per /etc/hosts oder DNS
vim /etc/openvpn/simple.conf
remote <remote.host>
dev tun
ifconfig 10.8.0.2 10.8.0.1
secret secret.key
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
user nobody
group nogroup
daemon
Sternförmiges Setup mit zentralem Server
OpenVPN-Server mit CentOS 7
Installation
OpenVPN befindet sich nicht in den Repos des CentOS-Projektes.
Deshalb müssen Fedora EPEL repos eingebunden werden.
yum install epel-release yum makecache
yum install openvpn easy-rsa -y
Ifconfig wird benötigt, es ist per default nicht installiert.
yum install net-tools -y
Zertifikate erstellen
Wir bauen uns unsere eigene Certification Authority.
Wichtiger Hinweiß: Aus Sicherheitsgründen sollten der ca.key niemals auf dem Server verbleiben!
Easy-rsa findet sich bei CentOS 7 in
/usr/share/easy-rsa/2.0
Das verzeichniss 2.0 kopieren wir an einen Platz unserer Wahl, der Ordner kann jeden Namen haben.
Empfehlenswert ist ein Verzeichnissname, der den Namen des VPN widerspiegelt.
In vars folgende Positionen ändern
vim vars
export KEY_COUNTRY="<Dein Länderkürzel>" export KEY_PROVINCE="<Dein Bundesland>" export KEY_CITY="<Deine Stadt>" export KEY_ORG="<Deine Organisation/Firma>" export KEY_EMAIL="<Deine E-Mail-Adresse>" export KEY_OU="<Abteilung>" export KEY_NAME="<irgendwas sinnvollen, VPN-Name mit Name>"
Danach folgende Schritte ausführen.
. ./vars ./clean-all ./build-ca
./build-ca wird die Frage nach dem Common Name aufwerfen.
Irgendwas sinnvolles, vielleicht VPN-Name.
Server Key und Zertifikat
<Servername> sollte der gleiche String wie Common Name, der bei der Erstellung abgefragt wird, sein.
Die anfallenden Files weirden den Prefix <Servername> haben.
./build-key-server <Servername>
Client Key und Zertifikat
<Clientname> sollte der gleiche String wie Common Name, der bei der Erstellung abgefragt wird, sein.
Die anfallenden Files weirden den Prefix <Clientname> haben.
./build-key <Clientname>
Sollen später weitere Clienten in das VPN aufgenommen werden, müssen vorher wieder die Variablen aus vars exportiert werden.
. ./vars
Danach können neue Keys und Zertifikate erstellt werden.
./build-key <neuer Cient>
Diffie Hellman Parameter erstellen
./build-dh
Verteilung und Zugriffsrechte der Dateien
Bei Erstellung der Schlüssel und Zertifikate für den Server und die Clienten wurden folgende Namen verwendet.
./build-key-server server ./build-key client1 ./build-key client2
Dateiname | Benötigt von | Zweck | Geheim |
---|---|---|---|
ca.crt | Server + alle Clienten | Root CA Zertifikat | Nein |
ca.key | Zertifikat signierende Maschine | Root CA Schlüssel | Ja |
dh{n}.pem | Nur Server | Diffie Hellman parameter | Nein |
server.crt | Nur Server | Server Zertifikat | Nein |
server.key | Nur Server | Server Schlüssel | Ja |
client1.crt | Client1 | Client1 Zertifikat | Nein |
client1.key | Client1 | Client1 Schlüssel | Ja |
client2.crt | Client2 | Client2 Zertifikat | Nein |
client2.key | Client2 | Client2 Schlüssel | Ja |
Config
Server Config
# # /etc/openvpn/newvpn.conf # Files liegen in /etc/openvpn/newvpn # und /etc/openvpn/newvpn/ccd-dir # Port, default ist 1124, alles ist besser als 1124. Minimiert Script-Angriffe. port <Port des VPN-Servers> #Protokoll-Typ proto udp # Device Typ, möglich sind tun und tap dev-type tun # Devicename dev newvpn # Speicherort der Zertifikate, Schlüssel usw. Pfade sind relativ zum Configfile ca newvpn/ca.crt cert newvpn/server.crt key newvpn/server.key dh newvpn/dh2048.pem mode server tls-server # Topologie des Netzwerkes topology subnet # mit push wird die Topologie dem Clienten mitgeteilt push "topology subnet" # IP des Servers und Netzmaske, ergibt zugleich das Netzwerk ifconfig 10.8.100.10 255.255.255.0 # Range der frei vergebbaren IPs, vergleichbar mit Range aus DHCP ifconfig-pool 10.8.0.11 10.8.0.199 255.255.255.0 # Hier werden die IPs der Clienten hinterlegt, vergleichbar mit # host win01 { hardware ethernet 00:00:00:00:00:00; fixed-address 192.168.0.5; } # Zuweisung erfolgt über den Dateinamen, der der selbe sein muss wie Common Name im Schlüssel des Clienten #Pfade sind relativ zum Configfile client-config-dir newvpn/ccd-dir ifconfig-pool-persist ipp.txt # Dadurch können sich Clienten untereinander verbinden client-to-client keepalive 10 120 # Kommpression der Verbindung comp-lzo # openvpns user-ID user nobody # openvpns group-ID group nobody # Schlüssel wird bei Erhalt von SIGUSR1 nicht neu geladen persist-key # Tun-Device wird bei Erhalt von SIGUSR1 nicht neu geladen persist-tun # Pfad ist relativ zum Configfile status openvpn-status.log # Verbosity Level verb 3 # Achtung: funktionier so nicht. Vielleicht ist der Eintrag eines Gateways notwendig! # Route for all Clients to this network push "route 10.8.88.0 255.255.255.0" route 10.8.88.0 255.255.255.0
Workaround. Wird auf allen Maschinen ausgeführt, die das Netzwerk erreichen sollen.
route add -net 10.8.88.0/24 gw 10.8.100.200 newvpn
IP Zuweisung an Client
Im Verzeichniss newvpn/ccd-dir liegen die Dateien, die den Clienten feste IPs zuweisen können.
Die Datei hat den selben Namen wie der Common Name im Key des Clienten
Ist der Client-PC der Router eines Netzerkes, auf dass durch andere Client-PCs zugegriffen werden soll, ist der iroute Eintrag notwendig. Dadurch weiß der VPN Server, über welche Maschine er ein Netzwerk erreichen kann.
vim <Common Name>
Inhalt der Datei
ifconfig-push 10.8.100.201 255.255.255.0 iroute 10.8.88.0 255.255.255.0
Files in newvpn
ca.crt dh2048.pem server.crt server.key
Service starten
Startet automatisch bei Systemstart.
String zwischen @ und .service ergibt sich aus dem Confignamen
systemctl enable openvpn@server.service
Händischer Start
systemctl start openvpn@server.service
Client Config
# # /etc/openvpn/newvpn.conf # Files liegen in /etc/openvpn/newvpn tls-client remote <IP oder FQDN des VPN-Servers> <Port des VPN-Servers> proto udp dev-type tun dev newvpn ca newvpn/ca.crt cert newvpn/client1.crt key newvpn/client1.key # Holt Config vom Server, z.B. IP-Adresse pull keepalive 10 120 comp-lzo persist-key persist-tun verb 3
Files in newvpn
ca.crt client1.crt client1.key
Remote Network
Ein Client-PC soll Zugriff auf das Netzwerk eines anderen Clienten bekommen.
- <Service-PC>: Der PC, der auf das Remote Network zugreifen soll.
- <Remote Network Router>: Der Router des Remote Networks.
Zusätzlicher Eintrag in das CCD-File des zugreifenden Clienten
Damit der Client-PC, über den der Fernzugriff auf das Remote Network erfolgen soll, weiß, wie er das Remote Network erreichen kann, enötigt er eine zusätzliche Route.
Dies geschieht per push "route <Network> <Netmask> <Gateway>"
Der Eintrag sollte im CCD-File gemacht werde und nicht im globalen Config-File, damit nicht unerwünschte Routen zwischen den Netzwerken entstehen.
Ein push Eintrag in der globalen Config gilt für alle Clienten.
Eine erweiterte Firewall-Regel kann nicht schaden, am besten whitelisting.
vim <Service-PC>
Inhalt der Datei
ifconfig-push 10.8.100.231 255.255.255.0 push "route 10.8.88.0 255.255.255.0 10.8.100.200"
Zusätzlicher Eintrag in das CCD-File des Routers des zu erreichenden Netzwerkes
Der Client-PC ist der Router eines Netzerkes, auf dass durch andere Client-PCs zugegriffen werden soll Dazu ist der iroute Eintrag notwendig. Dadurch weiß der VPN Server, über welche Maschine er das Netzwerk erreichen kann.
vim <Remote Network Router>
Inhalt der Datei
ifconfig-push 10.8.100.200 255.255.255.0 iroute 10.8.88.0 255.255.255.0