WireGuard-DynDNS-Proxy

Wer kennt das Problem nicht? 😀

Privat hat man nur eine dynamisch wechselnde IP-Addresse, will aber ein VPN darauf aufbauen. Wireguard verlangt z.B. eine statische IP. Die Scripts, die diesen Umstand umgehen zu versuchen funktionieren unter Android nicht wirklich.

Allerdings sind vServer mittlerweile schon sehr günstig geworden (z.B. Strato ab 1€/Mon). Mit denen kann man super einen „Zwischenserver“ aufbauen. Braucht ja auch kaum Ressourcen. Allerdings erhöht sich natürlich der Ping.

Unter Linux kann man solche Forwardings relativ einfach mit iptables lösen (net.ipv4.ip_forward muss 1 sein). Allerdings kann iptables nicht mit Namen umgehen.

Daher habe ich ein Script geschrieben, das die iptables steuert und regelmäßig die Domain neu auflöst und ggf. iptables anpasst. Es basiert auf der python-iptables-Bibliothek, welche man über PIP installieren kann. Als Domain wird die DynDns (die z.B. in der FritzBox hinterlegt ist) eingetragen.

import time
import os
import socket
import iptc

remote_host_last = ''
while True:
    try:
        remote_host = socket.gethostbyname("domain")
        #print(remote_host)
        if remote_host != remote_host_last:
            chain1 = iptc.Chain(iptc.Table(iptc.Table.NAT), 'PREROUTING')
            chain2 = iptc.Chain(iptc.Table(iptc.Table.NAT), "POSTROUTING")

            for rule in chain1.rules:
                if rule.matches[0].dport=='51820':
                    chain1.delete_rule(rule)
            for rule in chain2.rules:
                if rule.protocol=='udp':
                    chain2.delete_rule(rule)

            rule = iptc.Rule()
            rule.protocol = 'udp'
            match = rule.create_match('udp')
            match.dport= '51820'
            target = rule.create_target('DNAT')
            target.to_destination = remote_host + ':51820'
            chain1.insert_rule(rule)

            rule = iptc.Rule()
            rule.protocol = "udp"
            target = iptc.Target(rule, "MASQUERADE")
            rule.target = target
            chain2.insert_rule(rule)

            remote_host_last = remote_host
    except:
        pass
    time.sleep(60 * 3)

Anschließend in den Autostart damit. Beispielsweise mit einem Cronjob:

crontab -e

Diese Zeile einfügen:

@reboot python3 /root/iptables.py


Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information