{"id":688,"date":"2015-10-23T18:49:45","date_gmt":"2015-10-23T17:49:45","guid":{"rendered":"http:\/\/www.walterschlag.net\/?p=688"},"modified":"2015-11-22T10:04:13","modified_gmt":"2015-11-22T09:04:13","slug":"openvpn-server-mit-wechselnder-ip-adresse","status":"publish","type":"post","link":"https:\/\/inator.at\/?p=688","title":{"rendered":"OpenVPN Server mit wechselnder IP Adresse"},"content":{"rendered":"<p>Hab vor kurzem eine OpenVPN Verbindung zu einem Server mit wechselnder IP Adresse eingerichtet.<br \/>\n&#8222;Eh alles ganz einfach&#8220; m\u00f6chte man vielleicht meinen.<br \/>\n&#8222;Wozu gibt es Services wie DynDNS, NoIP u.\u00e4.&#8220;.<\/p>\n<p>Tja.<\/p>\n<p>Geben tuts die schon. Allerdings sind die &#8222;free&#8220; Zug\u00e4nge alles andere als zuverl\u00e4ssig.<br \/>\nUnd noch dazu wird man mit unn\u00f6tigen &#8222;Login Notifications&#8220; bel\u00e4stigt.<br \/>\n(Meisst muss man sich mindestens 1x pro Monat einloggen, sonst wird der Hostname gel\u00f6scht)<\/p>\n<p>Die Bezahl-Zug\u00e4nge sind vermutlich zuverl\u00e4ssiger, allerdings :<br \/>\nWer will schon ein paar Euro\/Monat nur daf\u00fcr zahlen, damit zwischen 2 Standorten eine Verbindung aufgebaut werden kann ?!?<br \/>\n(Wenn es ein TopLevelDomain-DynDNS ist, auf welchem man Websites hostet, dann siehts nat. anders aus&#8230;)<\/p>\n<p>Drum hab ich mir gedacht, da muss man ja auch selber was stricken k\u00f6nnen. Kann man&#8230;<\/p>\n<p>Als erstes ben\u00f6tigt man daf\u00fcr nat\u00fcrlich einen Webspace, der sehr zuverl\u00e4ssig funktioniert.<br \/>\nDa drauf kommen 2 php Scripts :<br \/>\neintragen.php<\/p>\n<pre>&lt;?php\n $ip=$_SERVER['REMOTE_ADDR'];\n $f=fopen(\"\/tmp\/ipvonwoswoasiwem.txt\",\"w\") or die(\"Unable to open file!\");\n fwrite($f,$ip.\"\\n\");\n fclose($f);\n?&gt;<\/pre>\n<p>auslesen.php<\/p>\n<pre>&lt;?php\n $f=fopen(\"\/tmp\/ipvonwoswoasiwem.txt\",\"r\") or die(\"Unable to open file!\");\n $ip=fread($f,50);\n echo $ip;\n fclose($f);\n?&gt;<\/pre>\n<p>Damit ist schon mal die M\u00f6glichkeit geschaffen, dass der VPN-Server seine IP &#8222;bekannt&#8220; machen kann, und der Client kann sie abholen.<\/p>\n<p>Der Server muss, sobald er feststellt, dass sich seine IP ge\u00e4ndert hat nur noch z.B. ein wget machen, das k\u00f6nnte etwa so aussehen :<\/p>\n<pre>wget -O- http:\/\/example.com\/optionalesverzeichnisdamitsniemandsoleichtmanipulierenkann\/eintragen.php<\/pre>\n<p>Damit der Server nicht unn\u00f6tigerweise z.B. jede Minute bei einem exterenen Dienstleister (z.B. whatsmyip.com) nachfragen muss, kann man dazu auch ganz einfach abfragen, ob noch irgendein VPN Client eingew\u00e4hlt ist. (geht viel schneller, und verursacht keinen extra Internet-Traffic).<\/p>\n<p>Soweit die Server-Seite. (der OpenVPN Server muss halt dort noch eingerichtet werden&#8230;)<\/p>\n<p>Jetzt gehts weiter mit der Client Seite. Da wirds richtig &#8222;tricky&#8220;.<\/p>\n<p>Das Problematische daran ist, dass es die OpenVPN Binary IMMER als &#8222;Service&#8220; l\u00e4uft. D.h. egal, ob Server oder Client, einmal gestartet, verbindet er sich mit der angegebenen Adresse (IP oder Hostname). Bricht die Verbindung ab, versucht er die gleiche Verbindung wieder aufzubauen. \u00c4ndert sich die \u00f6ffentliche IP auf der Client-Seite, ist das \u00fcberhaupt kein Problem; die Verbindung steht ca. 1-2 Sekunden nach der Internet Verbindung wieder. \u00c4ndert sich allerdings die IP auf der Server-Seite, dann wirds problematisch. Wie soll man das feststellen, ohne DynDNS zu verwenden ? Es gibt zwar &#8222;Hooks&#8220;, die etwas triggern k\u00f6nnen, allerdings einen &#8222;Error-Hook&#8220; hab ich bisher noch nicht gefunden.<\/p>\n<p>Also doch wieder DynDNS. Aber anders. Bei mir ist der OpenVPN Client ein Raspberry PI, der Internet-Router l\u00e4uft auf OpenWRT. Damit kann man schon was anstellen. Aber es gibt &#8211; wie immer &#8211; mehrere M\u00f6glichkeiten :<\/p>\n<p>*) die \/etc\/hosts Datei \u00e4ndern<\/p>\n<p>Das ist unpraktisch, kompliziert, und (weil man die Datei nicht so einfach auf die RAMDisk bekommt) f\u00fchrt m\u00f6glicherweise auch zu Problemen beim Booten. Da sind Eintr\u00e4ge drin, die u.U. f\u00fcr einen erfolgreichen Boot vermutlich notwendig sind (sowohl beim PI, als auch beim Router)<\/p>\n<p>*) die \/etc\/dnsmasq.conf \u00e4ndern<\/p>\n<p>Das ist auch nicht viel besser. u.U. hat man da drin z.B. Werbeblocker u.a. drinnen.<\/p>\n<p>*) DAS IST ES :<\/p>\n<p>Es gibt in der \/etc\/dnsmasq.conf einmal die M\u00f6glichkeit, zus\u00e4tzliche Config-Dateien einzubinden (mit conf-file=&#8230;) und dann aber noch die Option eine &#8222;k\u00fcnstliche&#8220; hosts Datei zu verwenden. Der Eintrag dazu lautet :<\/p>\n<pre>addn-hosts=\/tmp\/dynhosts<\/pre>\n<p>Den einfach ganz am Ende einf\u00fcgen; dann erh\u00e4lt man das gew\u00fcnschte Ergebnis; dnsmasq kann AUCH OHNE diese Datei (z.B. beim Booten) hochfahren; die Datei kann man nach belieben unendlich oft wiederbeschreiben (weil sie in der RamDisk liegt).<\/p>\n<p>Ein &#8222;Problemchen&#8220; bleibt noch : im Gegensatz zur &#8222;echten&#8220; hosts Datei werden die \u00c4nderungen nicht &#8222;on-the-fly&#8220; \u00fcbernommen. Aber auch daf\u00fcr gibt es eine ganz simple L\u00f6sung : man sendet ein &#8222;kill -1&#8220; (=sighup), dann l\u00e4dt dnsmasq seine Config neu, ohne irgendeine sonstige Unterbrechung. Das Kommando dazu lautet :<\/p>\n<pre>kill -1 $(cat \/var\/run\/dnsmasq\/dnsmasq.pid)<\/pre>\n<p>Bzw. das komplette Script namens dyndns.sh :<\/p>\n<pre>#!\/bin\/sh\ndyn=\/tmp\/dynhosts\nsoll=$(wget -O- -T 5 http:\/\/example.com\/\/optionalesverzeichnisdamitsniemandsoleichtmanipulierenkann\/auslesen.php 2&gt;\/dev\/null)\nif test \"$soll\" == \"\"\nthen\n soll=$(wget -O- -T 5 http:\/\/example_redundant.com\/\/optionalesverzeichnisdamitsniemandsoleichtmanipulierenkann\/auslesen.php 2&gt;\/dev\/null)\nfi\nif test \"$soll\" != \"\"\nthen\n ist=$(cat $dyn 2&gt;\/dev\/null | cut -d\" \" -f1)\n if test \"$soll\" != \"$ist\"\n then\n  echo \"Ziel IP alt = $ist, update auf $soll\" &gt;&gt; \/tmp\/meineigenesdyndns.log\n  echo \"$soll zielserver\" &gt; $dyn\n  kill -1 $(cat \/var\/run\/dnsmasq\/dnsmasq.pid)\n fi\nfi<\/pre>\n<p>Ich hab auch gleich noch einen 2. Webspace (der die gleiche Information bereith\u00e4lt) eingebaut, somit ergibt sich sogar eine gewisse Redundanz, falls mal was nicht geht.<\/p>\n<p>Wenn man das script (auf seinem Hauptrouter) aufruft, und dann z.B. ein &#8222;ping zielserver&#8220; eingibt, dann sollte (zumindest versucht) werden, die entsprechende Gegenstelle anzupingen.<\/p>\n<p>Aufgerufen wird das Script (bei mir) 1x pro Stunde, und, sobald mein &#8222;dauerping&#8220; Script feststellt, dass zwar das Internet geht, aber die VPN Verbindung nicht.<\/p>\n<p>Somit gibt es kaum extra Internetverkehr, aber die Verbindung sollte trotzdem in &lt;1min wieder da sein, falls sich die Server-IP ge\u00e4ndert hat.<\/p>\n<p>Damit kann die &#8222;Domain&#8220; auch problemlos in einer OpenVPN Konfigurationsdatei verwendet werden&#8230;. (Sogar auf einem Raspberry PI &#8222;hinter&#8220; dem Router)<\/p>\n<p>Update :<br \/>\nWas mir noch so aufgefallen ist : wenn statt zielserver ein Name mit Punkt verwendet werden soll, dann gibts zumindest mit .local Probleme.<br \/>\nD.h. zielserver.local -> geht nicht<br \/>\nzielserver.lo -> geht<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hab vor kurzem eine OpenVPN Verbindung zu einem Server mit wechselnder IP Adresse eingerichtet. &#8222;Eh alles ganz einfach&#8220; m\u00f6chte man vielleicht meinen. &#8222;Wozu gibt es Services wie DynDNS, NoIP u.\u00e4.&#8220;. Tja. Geben tuts die schon. Allerdings sind die &#8222;free&#8220; Zug\u00e4nge alles andere als zuverl\u00e4ssig. Und noch dazu wird man mit unn\u00f6tigen &#8222;Login Notifications&#8220; bel\u00e4stigt. (Meisst &hellip; <a href=\"https:\/\/inator.at\/?p=688\" class=\"more-link\"><span class=\"screen-reader-text\">OpenVPN Server mit wechselnder IP Adresse<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-688","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"_links":{"self":[{"href":"https:\/\/inator.at\/index.php?rest_route=\/wp\/v2\/posts\/688","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/inator.at\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/inator.at\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/inator.at\/index.php?rest_route=\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/inator.at\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=688"}],"version-history":[{"count":28,"href":"https:\/\/inator.at\/index.php?rest_route=\/wp\/v2\/posts\/688\/revisions"}],"predecessor-version":[{"id":717,"href":"https:\/\/inator.at\/index.php?rest_route=\/wp\/v2\/posts\/688\/revisions\/717"}],"wp:attachment":[{"href":"https:\/\/inator.at\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=688"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/inator.at\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=688"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/inator.at\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=688"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}