Tipps & Tricks: Linux absichern mit den iptables

JackCarver

Junior Member
Aktuelle Version unter Qt5 und Qt4 ist die 1.0

Hallo,

hier möchte ich zeigen, wie man Linux mit Hilfe der iptables vor IP-Leaks absichert. Ich habe ein kleines Tool in Qt geschrieben, das mit Hilfe zweier Buttons die Firewall aktivieren und deaktivieren lässt. Ich stell das Tool hier zum Download mit ein, ich hab es unter Linux Debian Wheezy, Mint 16 sowie Ubuntu 13.10 getestet, sollte aber eigentlich auf allen aktuelleren Linux Varianten lauffähig sein, die Debian basiert sind. Zusätzlich stell ich hier auch die iptables Skripte mit ein, falls jemand das lieber selbst per Skript umsetzen möchte.

Hier n paar Screenshots:







Über den grünen Button "Activate Firewall" werden die Firewall Regeln aktiviert. Die Regeln sind dabei so aufgebaut, dass sämtliche Verbindungen nach Aussen und Innen nur noch via OpenVPN möglich sind.
Dazu werden auf wlan0 sowie eth0 alle Verbindungen ausser der OpenVPN Ports sowie des DNS Ports geblockt. Erst NACH Einwahl zu einem OpenVPN Server kann man das Internet wieder erreichen. Bricht die VPN Verbindung ab, so sind auch die Verbindungen ins Internet tot.
Die Verbindungen im LAN bleiben davon unberührt, dh Verbindungen zu und von LAN Rechnern bleiben erlaubt.

Möchte man die Regeln deaktivieren, so genügt ein Klick auf den roten Button.

Neu hinzugekommen ist das Statusfeld, das mit Text und Farbe anzeigt, ob die Firewall derzeit aktiv oder inaktiv ist, sowie ein Feld Portausnahmen, wo man die ssh sowie IPsec Ports vom Block ausnehmen kann. Dadurch ist es auch möglich trotz aktiver FW ohne OpenVPN eine ssh bzw IPsec Verbindung zu starten:







Für alle, die die FW Regeln auch über den Systemstart aktiv haben möchten ist das Dropdown Feld "Firewall Settings" gedacht.
Es gibt zur Auswahl entweder die aktiven Regeln fest zu speichern oder eben die im System gespeicherten Regeln auch wieder zu löschen, siehe Screen:







Dazu bitte Beachten:

Zum Abspeichern der Regeln über den Bootvorgang hinaus wird ein Paket namens iptables-persistent benötigt. Das Programm prüft dazu ob das Paket bereits installiert ist oder nicht, sollte es nicht installiert sein, so wird es automatisch installiert. Da dazu natürlich ne Internetverbindung nötig ist macht es nur Sinn den Button zu klicken, nachdem man mit VPN verbunden ist, die Firewall sperrt ja eine Verbindung ohne VPN und der Installationsvorgang würde nicht klappen.

Soabld das Paket einmal installiert ist, ist das natürlich nicht mehr nötig, dh es werden dann nur noch die aktiven Regeln gespeichert ohne Installation etc.

Möchte man die Regeln wieder loswerden, was dann ja nicht mehr durch nen Reboot möglich ist, so klickt man einfach die untere Auswahl an.

Ich hab das Hauptfenster nun auch etwas größer gemacht.

Hier im ersten Teil stell ich das Tool zum Download ein, im zweiten Teil kommen die iptables Regeln im Skript. Ich hab hier 2 Links angelegt, einmal das Tool entwickelt unter Qt Version 5 und einmal entwickelt unter Qt Version 4. Debian Wheezy hat Probleme das Qt5 Tool zu starten, mit der Version 4 klappt es dann.


Qt 5 und Qt 4 auf Version 1.0:
Link zum Tool (Qt Version 5, getestet unter Mint 16, Mint 17 (Test unter Live DVD positiv)):

https://www.dropbox.com/s/uzp5mz4vzu...herQt5_1.0.zip

Link zum Tool (Qt Version 4, getestet unter Debian Wheezy):

https://www.dropbox.com/s/1jcrl404gl...herQt4_1.0.zip


Ubuntu Version fertig (Ubuntu 13.10):






Die Menüpunkte befinden sich hier allerdings nicht im Hauptfenster des Programmes sondern oben in der Taskleiste.


Hier stell ich den Link mit ein:

Ubuntu 13.10:
https://www.dropbox.com/s/2kl9l0rx4o...buntu_v1.0.zip
 

JackCarver

Junior Member
Hier im zweiten Teil stell ich das Bash Skript mit ein, das die Firewall Regeln enthält:

#! /bin/bash

#Iptables Regeln für VPN:

iptables -t filter -A OUTPUT -o wlan0 -p udp -m multiport --dports 1149,1150,1151,53,149,150,151 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A OUTPUT -o wlan0 -p tcp -m multiport --dports 152,1152 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A OUTPUT -o eth0 -p udp -m multiport --dports 1149,1150,1151,53,149,150,151 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A OUTPUT -o eth0 -p tcp -m multiport --dports 152,1152 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A INPUT -i wlan0 -p udp -m multiport --sports 1149,1150,1151,53,149,150,151 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A INPUT -i wlan0 -p tcp -m multiport --sports 152,1152 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A INPUT -i eth0 -p udp -m multiport --sports 1149,1150,1151,53,149,150,151 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A INPUT -i eth0 -p tcp -m multiport --sports 152,1152 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A OUTPUT --dst 192.168.0.0/16 -j ACCEPT
iptables -t filter -A INPUT --src 192.168.0.0/16 -j ACCEPT
iptables -t filter -A OUTPUT --dst 10.0.0.0/8 -j ACCEPT
iptables -t filter -A INPUT --src 10.0.0.0/8 -j ACCEPT
iptables -t filter -A OUTPUT --dst 172.16.0.0/12 -j ACCEPT
iptables -t filter -A INPUT --src 172.16.0.0/12 -j ACCEPT

iptables -t filter -A OUTPUT -o wlan0 -j DROP
iptables -t filter -A INPUT -i wlan0 -j DROP
iptables -t filter -A OUTPUT -o eth0 -j DROP
iptables -t filter -A INPUT -i eth0 -j DROP
Erklärung zu dem Skript:

Die Firewall Regeln in diesem Bash Skript sind exakt dieselben, die auch das kleine Programm in Teil 1 startet. Die iptables Tabelle, die hier interessant ist ist die Tabelle filter, mit Option -t filter ersichtlich.
Diese Tabelle stellt die eigentliche Firewall Komponente der iptables dar. Sie enthält dazu die Ketten INPUT, OUTPUT und FORWARD. Für Einzelplatzrechner interessant sind nur INPUT und OUTPUT, FORWARD wäre interessant auf nem Linux Router.

Die OUTPUT Kette regelt alle ausgehenden Verbindungen und die ersten 4 Regeln des Skriptes erlauben für WLAN (wlan0) und Ethernet (eth0) die Ports um sich mit nem PP OpenVPN Server zu verbinden nämlich UDP 1149, 1150, 1151, 53, 149, 150, 151 sowie TCP Ports 152 und 1152. Der UDP Port 53 ist wichtig für die DNS Auflösung der PP Hostnamen.
Anhand der Option state legt man fest, dass rausgehend sowohl neue Pakete als auch Pakete, die zu bereits bestehenden Verbindungen gehören erlaubt sind, sofern sie die gennanten Ports als Zielport haben.

Die INPUT Kette regelt dann alle eingehenden Verbindungen. Die nächsten 4 Regeln sind also die zu den OUTPUT Regeln wieder zurückkehrenden Verbindungen, daher werden die Ports nun als Quellports (sports) gekennzeichnet und es ist auch nicht mehr nötig neue Verbindungen zuzulassen, da reingehend nur Antworten auf bereits nach aussen gestartete Verbindungen erlaubt sind.

Die nächsten 6 Regeln öffnen die Firewall für private Netze, dh man kann auch mit eingeschalteter FW ganz normal seine Heimrechner erreichen und auch von diesen aus den FW geschützten Rechner.

Die letzten 4 Regeln verbieten dann für WLAN und Ethernet alle übrigen Verbindungen, dh jeglicher Internetverkehr wird nur über OpenVPN erlaubt.

Das einzige was frei bleibt ist der tun Adapter über den dann ja OpenVPN läuft sowie localhost, den man nicht blocken sollte.

Um nun diese Regeln aus der Bash heraus zu starten, legt man zb in der Konsole über touch vpn.sh eine leere Datei an und kopiert die Regeln ab #! /bin/bash dort hinein. Anschließend macht man das Skript ausführbar und kann dann mit sudo vpn.sh das Skript starten.

Oder man verwendet eben ganz einfach das Tool unter Posting #1, das dasselbe auf Knopfdruck erledigt.

Falls es Fragen dazu gibt dann meldet euch einfach hier.
 

Ghost

Junior Member
SUPER, DANKE DIR

1 Frage:

Hat man Zugriff auf das lokale Netzwerk wenn die Firewall aktiviert ist? (NAS....)
 

JackCarver

Junior Member
Nein, in der jetzigen Fassung nicht, ist aber kein Problem, ich nehm die Regeln zur Ausnahme privater IPv4 Netze in das Tool und das Skript mit rein, dann klappt das.
 

JackCarver

Junior Member
Das Tool sowie Skript ist nun aktualisiert. Zugriffe im privaten Netz vom Firewall geschützten Rechner zu anderen Rechnern, sowie der umgekehrte Weg ist nun für alle Adapter frei.
 

Ghost

Junior Member
@JackCarver

Dir ist ein kleiner Fehler unterlaufen.
Linux verwendet andere Ports.

Code:
dev tun
remote amsterdam.perfect-privacy.com 1151
remote amsterdam.perfect-privacy.com 150
remote amsterdam.perfect-privacy.com 1150
remote amsterdam.perfect-privacy.com 151
remote amsterdam.perfect-privacy.com 149
remote amsterdam.perfect-privacy.com 1149
Ansonsten: ECHT COOOOOL :):):) DANKE

Eine Frage habe ich noch:

Gibt es eine Möglichkeit, dass man die iptables dauerhaft speichern kann?
Jetzt muss man die iptables Konfiguration nach jedem Neusart ausführen.


Bevor ich den Fehler mit den Ports gefunden habe, bekam ich oft diesen Fehler:

Code:
Operation not permitted (code=1)

PS: Wäre super wenn du das Tool anpassen könntest.
 

JackCarver

Junior Member
Ok, ich muss zugeben, dass ich derzeit nicht zahlender Kunde bei PP bin, Frank war so freundlich mir die im Tool genutzten Ports mitzuteilen. Bedeutet das, dass folgende Ports bzgl OpenVPN mit aufzunehmen sind:

UDP:
1149, 1150, 1151

TCP:
149, 150, 151

Das anpassen ist dann kein Problem
 

PP Frank

Staff member
Ist glaube ich mein Fehler. ich hatte Jack nur die Ports von der Website gegeben. Ich muss das dem Kollegen nochmal sagen, dass die Serverliste da aktualisiert wird. Da fehlen welche
 

Ghost

Junior Member
Ist nicht weiter schlimm :), kann passieren.

Welche Ports muß man im Bash Skript konfigurieren?

UDP: ???
TCP: ???
 

JackCarver

Junior Member
Das abspeichern der Regeln ist auch möglich, ich werd dahingehend was mit Aufnehmen, zuerst kommt mal die Port aktualisierte Fassung, dann ne weitere mit dem Speichern der Regeln.
 

Ghost

Junior Member
TCP Ports Linux:
Code:
remote amsterdam.perfect-privacy.com 1152
remote amsterdam.perfect-privacy.com 152
UDP Ports Linux:
Code:
remote amsterdam.perfect-privacy.com 1151
remote amsterdam.perfect-privacy.com 150
remote amsterdam.perfect-privacy.com 1150
remote amsterdam.perfect-privacy.com 151
remote amsterdam.perfect-privacy.com 149
remote amsterdam.perfect-privacy.com 1149
 

Ghost

Junior Member
UDP Linux

Code:
client
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
ns-cert-type server
redirect-gateway def1
dev tun
remote amsterdam.perfect-privacy.com 1151
remote amsterdam.perfect-privacy.com 150
remote amsterdam.perfect-privacy.com 1150
remote amsterdam.perfect-privacy.com 151
remote amsterdam.perfect-privacy.com 149
remote amsterdam.perfect-privacy.com 1149
# Fallbacks just in case..
remote amsterdam.perfect-privacy.info 1150
remote amsterdam.perfect-privacy.net 1149
remote amsterdam.perfect-privacy.asia 1151
remote amsterdam.perfect-privacy.net 149
remote amsterdam.perfect-privacy.org 150
remote amsterdam.perfect-privacy.org 151
remote-random
proto udp
tun-mtu 1500
fragment 1300
mssfix
float
reneg-sec 86400
resolv-retry 60
nobind
persist-key
persist-tun
persist-remote-ip
route-method exe
route-delay 2
ca ca.crt
cert Amsterdam_cl.crt
key Amsterdam_cl.key
tls-auth Amsterdam_ta.key 1
tls-timeout 5
hand-window 120
tls-cipher DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES256-SHA:DHE-RSA-CAMELLIA128-SHA:DHE-RSA-AES128-SHA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA
auth SHA512
cipher AES-256-CBC
comp-lzo
verb 4
auth-user-pass /etc/openvpn/userpass.txt
inactive 604800
ping 5
ping-restart 120
replay-window 512 60
mute-replay-warnings
 

Ghost

Junior Member
TCP Linux

Code:
client
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
ns-cert-type server
redirect-gateway def1
dev tun
remote amsterdam.perfect-privacy.com 1152
remote amsterdam.perfect-privacy.com 152
# Fallbacks just in case..
remote amsterdam.perfect-privacy.org 152
remote amsterdam.perfect-privacy.info 1152
remote-random
proto tcp
tun-mtu 1500

mssfix
float
reneg-sec 86400
resolv-retry 60
nobind
persist-key
persist-tun
persist-remote-ip
route-method exe
route-delay 2
ca ca.crt
cert Amsterdam_cl.crt
key Amsterdam_cl.key
tls-auth Amsterdam_ta.key 1
tls-timeout 5
hand-window 120
tls-cipher DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES256-SHA:DHE-RSA-CAMELLIA128-SHA:DHE-RSA-AES128-SHA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA
auth SHA512
cipher AES-256-CBC
comp-lzo
verb 4
auth-user-pass
inactive 604800
ping 5
ping-restart 120

mute-replay-warnings
 

JackCarver

Junior Member
So das um die Ports aktualisierte Tool steht zum DL bereit. Ich werd dann noch ne zweite Version verlinken, bei der man die Einstellungen fest im System speichern kann. Teste mal ob es nun von der Verbindung zu den Servern passt.
 

Ghost

Junior Member
@JackCarver

Ein Zahlendreher :)

Falsch:
Code:
--dports [B]1194[/B],1150,1151,53,149,150,151
Richtig:
Code:
--dports [B]1149[/B],1150,1151,53,149,150,151
Wenn der Zahlendreher behoben ist, funktioniert es.
 

JackCarver

Junior Member
Stimmt das sollte im Prog allerdings passen, der Zahlendreher sollte nur im Skript im Forum sein. Werd das hier noch ändern.
 
Top