IT-Dienstleistungen & smartes Equipment
  • IT-Infrastruktur

    Server, Netzwerktechnik, Beratung
  • Smart|Stuff

    clevere Items Haus, Tier & Alltag
By - admin

Ubuntu als DSL-Router / Mini-Iptables-Howto / Kleine feine Firewall / …

Die Konfiguration der DSL-Leitung ist mit pppoeconf leicht. Wenn der Rechner selbst darüber ins Netz kommt und Domainnamen auflöst (pppoeconf richtet das automatisch mit ein), sind die Iptables anzupassen. Es gibt Pakete ipmasq oder ufw (uncomplicated firewall – die aber gar nicht so uncomplicated ist), mit denen man direkt nach der Installation schon ein Masquerading hinbekommt, aber wofür 5 Tonnen Script-Salat für ein paar einfach Rules.

Hier ein Dump meiner Konfiguration – transparent und simpel integriert. Der Router hat die IP 10.0.0.1 an eth0, DSL hängt am Interface ppp0.

Skript /etc/iptables.sh

#! /bin/sh

echo “1” > /proc/sys/net/ipv4/ip_forward # Initialisierung des Forwardings
##################################
# Flushen, Loeschen,
##################################
iptables -F
iptables -F -t nat
iptables -F -t mangle

iptables -X
iptables -t mangle -X
iptables -t nat -X

################
# INPUT Firewall
#################

iptables -A INPUT -i lo -j ACCEPT
#Loopback immer akzeptieren

iptables -A INPUT -i eth0 -s ! 10.0.0.0/255.255.255.0 -j DROP
# Alles aus dem lan ohne passende IP wegwerfen

iptables -A INPUT -i eth0 -j ACCEPT
# Sonst alles von eth0 erlauben

iptables -A INPUT -i ppp0 -s 10.0.0.0/255.255.255.0 -j DROP
# Alles aus dem Inet mit meinen IPs werwerfen

# Antworten zulassen
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

# Alles andere abweisen
iptables -P INPUT DROP

#####################
# Forward-Chain
#####################

iptables -A FORWARD -i lo -j ACCEPT
# Loopback wieder erlauben

iptables -A FORWARD -s 10.0.0.0/24 -i eth0 -j ACCEPT
# Traffic aus dem lokalen Netz ist ok

iptables -A FORWARD -d 10.0.0.0/24 -m state –state RELATED,ESTABLISHED -o eth0 -j ACCEPT
# Traffic in das lokale Netz ist bei bekannten Verbindungen ok

iptables -P FORWARD DROP
# Der Rest ist boese

###################
# Output-Chain
###################

iptables -P OUTPUT ACCEPT # output immer annehmen
iptables -P OUTPUT ACCEPT -t nat

######
# NAT
#######
iptables -A POSTROUTING -t nat -s 10.0.0.0/24 -j MASQUERADE # was rausgeht wird maskiert
##################
# User Config
#################
# Folgende Ports sollen nach ppp0 offen sein
iptables -A INPUT -p tcp –dport 22 -j ACCEPT # ssh erlauben
iptables -A INPUT -p tcp –dport 443 -j ACCEPT # https erlauben
iptables -A INPUT -p tcp –dport 3389 -j ACCEPT # RDP erlauben
################
# Portforwarding
###############

# Auch unbekannte Verbindungen muessen weitergeleitet werden
iptables -A FORWARD -p tcp -d 10.0.0.10 –dport 443 -j ACCEPT
iptables -A FORWARD -p tcp -d 10.0.0.10 –dport 3389 -j ACCEPT

# Zuletzt sollen die Pakete ge-DNAT-ted werden
iptables -A PREROUTING -t nat -i ppp0 -p tcp –dport 443 -j DNAT –to 10.0.0.10         # OWA auf Windows-Server
iptables -A PREROUTING -t nat -i ppp0 -p tcp –dport 3389 -j DNAT –to 10.0.0.10        # RDP auf Windows-Server

 

echo ” [Iptables set]”

Enthalten ist hier auch ein “Portforwarding” auf einen zweiten Rechner 10.0.0.10. Ist die Iptable zunächst leer, so bekommt man nach dem Ausführen dieses Scripts schon eine fertige Firewall mit NAT. Mit UFW und Ipmasq entsteht hingegen ein Wust an Chains. Mal eben ein DNAT machen ist mir damit nicht gelungen.

Damit man die Firewall noch schön ins System integriert noch folgendes Hilfsskript /etc/iptables_flush.sh

#!/bin/sh

#
# Set the default policy
#
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

#
# Set the default policy for the NAT table
#
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT

#
# Delete all rules
#
iptables -F
iptables -t nat -F

#
# Delete all chains
#

iptables -X
iptables -t nat -X

# End message
echo ” [End of flush]”

Hier werden die Policies alle auf ACCEPT gesetzt, also aufgepasst, das ist kein Dauerzustand; hat aber den Vorteil, dass man noch z.B. per SSH Zugriff hat, sonst geht das Gerenne zum Server los 🙂

Schließlich noch ein Initscript gebastelt – /etc/init.d/firewall

#!/bin/bash

RETVAL=0

# To start the firewall
start() {
  echo -n “Iptables rules creation: ”
  /etc/iptables.sh
  RETVAL=0
}

# To stop the firewall
stop() {
  echo -n “Removing all iptables rules: ”
  /etc/iptables_flush.sh
  RETVAL=0
}

case $1 in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  status)
    /sbin/iptables -L
    /sbin/iptables -t nat -L
    RETVAL=0
    ;;
  *)
    echo “Usage: firewall {start|stop|restart|status}”
    RETVAL=1
esac

exit

Nun mit update-rc.d firewall defaults das Init-Script in die /etc/rcX.d eintragen lassen. Sobald man an der /etc/iptables.sh Änderungen macht, sind sie somit nach einem /etc/init.d/firewall restart da.

Inspiriert von:
http://ubuntuforums.org/showthread.php?t=159661
https://help.ubuntu.com/community/IptablesHowTo
und anderen einschlägigen Google-Such-Stichworten