Internet im Hotel nur über VPN
Fast jedes Hotel hat ein öffentliches W-Lan, welches jeder Gast meistens kostenlos benutzen darf. Das Problem ist dabei aber, genauso wie in W-Lans in einem Café etc., dass jeder, der sich im W-Lan befindet, alle unverschlüsselten Dateien mitlesen und analysieren/bearbeiten kann. Das ist besonders bei Passwörtern unpraktisch, welche je nach Protokoll und Verbindung komplett unverschlüsselt übertragen werden, beispielsweise bei FTP oder dem Mailabruf.
Die Lösung dieses Problemes ist folgendes Init-Script, welches beim Starten des Computers ausgeführt wird und mithilfe von iptables nur VPN-Verbindungen nach außen durch lässt.
Zuerst muss das Script erstellt werden, das geht mit sudo nano /etc/init.d/forcevpn
am schnellsten. Dort kopiert man dann folgenden Code hinein und ändert die IP des VPN-Servers in Zeile 17 in die des eigenen VPN-Servers.
/etc/init.d/forcevpn
#! /bin/sh
### BEGIN INIT INFO
# Provides: ForceVPN
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Force VPN connection
# Description: Internet only works over VPN-Connection
### END INIT INFO
# Author: Igor Scheller <igor.scheller@igorshp.de>
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Force the internet connection to route through a VPN"
IPT=/sbin/iptables
VPN=123.123.123.123
NAME=${0##*/}
is_root()
{
if [ "$(id -u)" != "0" ]; then
echo "This script must be run as root!" 1>&2
exit 1
fi
}
do_start()
{
is_root
echo "Enabling $NAME"
if [ ! -f /tmp/iptables.bak ];then
#Backup old
iptables-save > /tmp/iptables.bak
# Basic rules from http://www.linuxquestions.org/questions/linux-security-4/force-all-internet-traffic-through-tun0-vpn-interface-896458/
#Flush rules
$IPT -F
$IPT -X
#Default policies and define chains
$IPT -P OUTPUT DROP
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
#Allow input from tun0 and lo ONLY
$IPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A INPUT -i tun0 -m conntrack --ctstate NEW -j ACCEPT
$IPT -A INPUT -j DROP
#Allow output from lo and tun0 ONLY
$IPT -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
$IPT -A OUTPUT -o tun0 -m conntrack --ctstate NEW -j ACCEPT
$IPT -A OUTPUT -d $VPN -m conntrack --ctstate NEW -j ACCEPT
$IPT -A OUTPUT -j DROP
echo " Done"
else
echo " Already enabled"
fi
return 0
}
do_stop()
{
is_root
echo "Disabling $NAME"
if [ -f /tmp/iptables.bak ];then
cat /tmp/iptables.bak | iptables-restore
rm /tmp/iptables.bak
echo " Done"
else
echo " Already disabled"
fi
return 0
}
do_restart() {
do_stop
do_start
return 0
}
do_status() {
echo "Status of $NAME:"
if [ -f /tmp/iptables.bak ];then
echo " Active"
else
echo " Not active"
fi
return 0
}
case "$1" in
start)
do_start
;;
stop)
do_stop
;;
status)
do_status
;;
restart|force-restart)
do_restart
;;
*)
echo "Usage: $0 {start|stop|status|restart}" >&2
exit 3
;;
esac
exit 0
Gespeichert wird mit Strg+O, und zum Schließen benutzt man Strg+X.
Nun muss das Script nur noch ausführbar gemacht werden, das geht mit sudo chmod +x /etc/init.d/forcevpn
und der automatische Start beim Systemstart aktiviert werden sudo update-rc.d forcevpn defaults
. Um den automatischen Start wieder zu Deaktivieren, reicht ein sudo update-rc.d -f forcevpn remove
. Natürlich kann man das Script auch manuell mit sudo service forcevpn start
und sudo service forcevpn stop
starten und stoppen.
Wenn man in der Konfiguration des VPNs den server mit einer Domain eingetragen hat, muss man in die Datei /etc/hosts am Ende noch ein 198.51.100.157 myvpn.domain
hinzufügen.
Das war es auch schon, jetzt fehlt nur noch der (eigene) openVPN-Server ;)