Raspberry Pi als OpenVPN Gateway und Privoxy

Projekt >uboot<

Ich möchte euch zeigen wie Ihr euer Heimnetz schützen (OpenVPN) und gleichzeitig Werbefrei (Privoxy) im Netz surfen könnt.

uboot

Warum? Wieso? Wozu?

Wenn Ihr euch diese Fragen stellt, dann ist das Internet für euch Neuland.

Fangen wir an.

Hardware:

Bei der Hardware habe ich mich für einen Raspberry Pi Model B entschieden. Diese kann per USB an die FritzBox/Router angeschlossen werden und läuft und läuft …

Es kann genauso gut eine Virtuelle Maschine sein, diese sollte aber dann im dauer betrieb laufen 😉

blogger-image--1381855968

Software:

Ich möchte das Rad nicht neu erfinden und durch etwas googlen bin ich auf folgenden Blog aufmerksam geworden.

Bitte schaut euch die Seite genau an. Dort steht (fast) alles was Ihr braucht.

Falls doch ein fertiges IMAGE gewüscht wird, dann werde ich eins hochladen.

Ich werde lediglich auf meine Änderung / Erweiterung eingehen.

Das Image auf die SD schreiben.

Meinen Patch runterladen und entpacken -> config_v08.zip.

Den Ordner „config“ auf die FAT32 Partition der SD-Karte kopieren.

Der Ordner „config“ wird später unter „/boot/config“ gemountet.

Konfiguration:

Unter „/boot/config/config.txt“ folgende Einstellungen festgelegt werden.

  • Autoupdate beim Start
  • Den Namen deines Raspberry Pi’s (Hostname)
  • DHCP oder Statische IP

Nach dem Booten starten wir das Script zum Patchen:

bash /boot/config/bin/patch.sh

Das Script wird anschließend neustarten und dein >uboot< ist bereit.

Wurde der Patch bereits ausgeführt und man möchte einfach die Einstellungen (OpenVPN und Netzwerk) neu konfigurieren, dann das Script „/boot/config/bin/firstrun_done.sh“ in „/boot/config/bin/firstrun.sh“ umbenennen und neustarten.

Bei jedem starten wird das Script „/boot/config/bin/autorun.sh“ ausgeführt.

  • Alte Logdateien löschen
  • Prüfen ob die Datei „/boot/config/bin/firstrun.sh“ existiert und ausführen.
  • Iptables Regeln laden
  • Gateway Routen konfigurieren
  • Nach Updates prüfen

#!/bin/bash


__SCRIPT_VERSION=14.057

LOGFILE=/boot/config/log/autorun.log

while (( „$#“ )); do

if [[ „$1“ == „KEEPLOG“ ]]; then 

__KEEPLOG=1

fi

shift

done

echo „**********************************************************************“ | tee -a $LOGFILE

echo „autorun v.${__SCRIPT_VERSION}“ | tee -a $LOGFILE

echo „**********************************************************************“ | tee -a $LOGFILE

echo „date                         : $(date)“ | tee -a $LOGFILE


if [ -e /boot/config/bin/clearlog.sh ]; then

if [ ${__KEEPLOG} -ne 1 ]; then

bash /boot/config/bin/clearlog.sh

else

echo „clearlog                     : skip“ | tee -a $LOGFILE

fi

fi


firstboot=0

if [ -e /boot/config/bin/firstrun.sh ]; then

firstboot=1

echo „starting                     : firstboot“ | tee -a $LOGFILE

bash /boot/config/bin/firstrun.sh

fi


if [ -e /boot/config/bin/rulesiptables.sh ]; then

echo „restore iptables rules“ | tee -a $LOGFILE

bash /boot/config/bin/rulesiptables.sh

fi


if [ -e /boot/config/config.txt ]; then

. /boot/config/config.txt

fi


if [ „x“$GATEWAY == „x“ ]; then

GATEWAY=`ip route show | awk ‚$1 == „default“ {print $3}’`

fi


if [ „x“$IPADDRESS == „x“ ]; then

IPADDRESS=`ifconfig eth0 | grep ‚inet addr\|inet Adresse:‘ | awk -F: ‚{print $2}‘ | awk ‚{print $1}’`

fi


if ! grep -q ‚[ ]*novpn‘ /etc/iproute2/rt_tables ; then

echo „echo \“201 novpn\“ >> /etc/iproute2/rt_tables“ | tee -a $LOGFILE

echo „201 novpn“ >> /etc/iproute2/rt_tables

fi


NOVPN_LIST=`ip route show table novpn`

for line in $NOVPN_LIST

do

echo „ip route del $line table novpn“ | tee -a $LOGFILE

ip route del $line table novpn > /dev/null 2>&1

done


NOVPN_NETWORK=`ip route show | grep „$IPADDRESS“`

echo „ip route add default via $GATEWAY dev eth0 table novpn“ | tee -a $LOGFILE

ip route add default via $GATEWAY dev eth0 table novpn > /dev/null 2>&1

echo „ip route add $NOVPN_NETWORK table novpn“ | tee -a $LOGFILE

ip route add $NOVPN_NETWORK table novpn > /dev/null 2>&1


NOVPN_LIST=`ip rule show | awk ‚$7 == „novpn“ && $5 == „0x41“ {print $5}’`

for line in $NOVPN_LIST

do

echo „ip rule del fwmark $line table novpn“ | tee -a $LOGFILE

ip rule del fwmark $line table novpn > /dev/null 2>&1

done


echo „ip rule add fwmark 65 table novpn“ | tee -a $LOGFILE

ip rule add fwmark 65 table novpn > /dev/null 2>&1


echo „ip route flush cache“ | tee -a $LOGFILE

ip route flush cache


if [ „x“$AUTOUPDATE == „xY“ ]; then

echo „updating system“ | tee -a $LOGFILE

apt-get update

apt-get -o Dpkg::Options::=“–force-confnew“ -qq –force-yes upgrade

apt-get clean

fi


echo -en „\033[1;34m“ > /etc/motd

echo „“ >> /etc/motd

echo „“ >> /etc/motd

echo „Welcome to >uboot< on Raspberry Pi“ >> /etc/motd

echo „“ >> /etc/motd

echo -en „\033[0m“ >> /etc/motd


echo „autorun                      : done“ | tee -a $LOGFILE


if [ $firstboot -eq 1 ]; then

init 6

fi


exit 0

IPTABLES

Iptables Anpassungen können über das Script „/boot/config/bin/rulesiptables.sh“ gemacht werden. Es sind ein paar Beispiel Einträge vorhanden.

  • Markierte Pakete werden an das Gateway „novpn“ (Puclic IP) geleitet.
  • Eingehende (Public IP) RDP-Verbindung an einen Windows-Rechner leiten und als „novpn“ markieren damit die Rückanwort nicht in den VPN-Tunnel verschwindet.
  • HTTP traffic (Port 80/443) wird an Privoxy geleitet

#!/bin/bash


#Alle Regeln löschen

iptables -X

iptables -F INPUT

iptables -F OUTPUT

iptables -F FORWARD

iptables -F -t mangle

iptables -X -t mangle

iptables -F -t nat

iptables -X -t nat


#Policies setzen

iptables -P INPUT ACCEPT

iptables -P OUTPUT ACCEPT

iptables -P FORWARD ACCEPT


###

# Gateway’s splitten

###

# Pakete markieren damit eth0 > novpn


#[MARK]

iptables -t mangle -A PREROUTING -m connmark –mark 65 -j MARK –set-mark 65

iptables -t mangle -A OUTPUT -m connmark –mark 65 -j MARK –set-mark 65


#[MARK:RDP-WIN]

iptables -t mangle -A PREROUTING -i eth0 -m state –state NEW -p tcp –dport 50001 -j CONNMARK –set-mark 65

#[MARK:SSH-WIN]

iptables -t mangle -A PREROUTING -i eth0 -m state –state NEW -p tcp –dport 50002 -j CONNMARK –set-mark 65

#[MARK:SSH-LOCAL]

iptables -t mangle -A PREROUTING -i eth0 -m state –state NEW -p tcp –dport 50003 -j CONNMARK –set-mark 65



###

# Weiterleitung an andere Server

###

# Leitet alle Pakete von Port nach Ziel weiter


#[RDP-WIN]

# Router:50001 -> eth0:50001 -> RDP-Win:3389 -> eth0:50001 > novpn

iptables -t nat -A PREROUTING -p tcp –dport 50001 -j DNAT –to-destination 192.168.159.3:3389

# Maskiere den Absender

#iptables -t nat -A POSTROUTING -p tcp –dport 3389 -j SNAT –to-source 192.168.159.2


#[SSH-WIN]

# Router:50002 -> eth0:50002 -> SSH-Win:22 -> eth0:50002 > novpn

iptables -t nat -A PREROUTING -p tcp –dport 50002 -j DNAT –to-destination 192.168.159.3:22

# Maskiere den Absender

#iptables -t nat -A POSTROUTING -p tcp –dport 22 -j SNAT –to-source 192.168.159.2


#[SSH-LOCAL]

iptables -t nat -A PREROUTING -p tcp –dport 50003 -j REDIRECT –to-ports 22


#[PRIVOXY-LOCAL]

iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 80 -j REDIRECT –to-ports 8118

iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 443 -j REDIRECT –to-ports 8118



###

# OpenVPN maskieren

###

# Masquerade: ‚maskiert‘ (Absender ist das Gerät) alle Pakete die über tun0 gesendet werden

iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE



###

# Regeln speichern

###

iptables-save > /boot/config/rulesiptables-save


exit 0

PRIVOXY

Privoxy ist so eingestellt, dass im Browser keine Einstellungen vorgenommen werden müssen. Das bedeutet Privoxy läuft transparent im Hintergrund und es werden automatisch Werbung, Popups usw. entfernt.

Änderungen können über den Browser URL: http://config.privoxy.org/ oder über die „/etc/privoxy/config“ gemacht werden.

Allgemeines

Folgende Befehle können nützlich sein:

System Neustarten : init 6

System Ausschalten : init 0

Privoxy Anhalten: /etc/init.d/privoxy stop

Privoxy Starten: /etc/init.d/privoxy start

Privoxy Neustarten: /etc/init.d/privoxy restart

OpenVPN Anhalten: /etc/init.d/openvpn stop

OpenVPN Starten: /etc/init.d/openvpn start

OpenVPN Neustarten: /etc/init.d/openvpn restart

Iptables neu laden : bash /boot/config/bin/rulesiptables.sh

Netzwekänderungen neu laden : bash /boot/config/bin/resetnetwork.sh

Datum setzen : /boot/config/bin/ntpdate -b tick.fh-augsburg.de

Quellen: