Linux Router für IPv6 mit ip6tables und SIXXS-Tunnel - Wolfgang Ninaus - 12-30-2010 06:53 PM
In meinem Beitrag "Einrichten eines 6in4 static Tunnels mit SIXXS unter Linux" habe ich beschrieben, wie man einen IPv6 Tunnel einrichtet.
Nun möchte ich das ganze auf ein Netzwerk erweitern:
Mein Linux-Router (hier ein Debian Lenny) ist mit 2 Netzwerkkarten ausgestattet:
eth0: Netzwerkkarte mit Internetzugang
eth1: Internes Netzwerk
Als erstes habe ich bei Sixxs ein subnet beantragt. Innerhalb weniger Stunden bekam ich mein approval-mail, das ungefähr so aussieht:
Code:
The SixXS Staff have honored your request for a subnet on the following tunnel:
-------
PoP Name : xxxx (xxxx [ASxxxx])
Subnet IPv6 : 2001:15c0:zzzz::/48
Routed to : 2001:15c0:xxxx:xxxx::2/64
Your IPv4 : yy.yy.yyy.yy9
-------
Eigentlich sind nur 2 Änderungen notwendig:
1. Das Start-Skript muss für das Netzwerk auf der internen Netzwerkkarte erweitert werden.
2. radvd - konfigurieren.
radvd - damit alle Clients IP-Adressen bekommen:
Dazu muss folgende Datei angepasst werden:
/etc/radvd.conf
Code:
interface eth1 {
AdvSendAdvert on;
prefix 2001:15c0:zzzz::/64
{
AdvAutonomous on;
AdvOnLink on;
AdvRouterAddr on;
};
};
Als nächstes das Startup-Skript:
Code:
#!/bin/bash
# dieses Script liegt auf /etc/network/if-up.d/startipv6tunnel
# The IPv4 address of the SixXS PoP you're using
SIXXS4="yyy.yyy.yy.73"
EXTIP="yy.yy.yyy.yy9"
TUNNELPREFIX="2001:15c0:xxxx:xxxx::"
INTPREFIX="2001:15c0:zzzz::"
EXTERNALIF="eth0"
INTERNALIF="eth1"
MYTUNNELIP="${TUNNELPREFIX}2"
SIXXSTUNNELIP="${TUNNELPREFIX}1"
MTU=1280
IPTABLES="/sbin/iptables"
IPT6="/sbin/ip6tables"
IP6DEV="sixxs"
## ENABLING IPv6 Tunnel ##
$IPTABLES -A INPUT -p 41 -s $SIXXS4 -d $EXTIP -j ACCEPT
$IPTABLES -A OUTPUT -p 41 -d $SIXXS4 -s $EXTIP -j ACCEPT
$IPTABLES -A POSTROUTING -o $EXTERNALIF -t nat -d $SIXXS4 -p all -j SNAT --to-source $EXTIP
## ENABLING IPv6 Tunnel ##
/sbin/ip tunnel add $IP6DEV mode sit local ${EXTIP} remote ${SIXXS4}
/sbin/ip link set $IP6DEV up
/sbin/ip link set mtu ${MTU} dev $IP6DEV
/sbin/ip tunnel change $IP6DEV ttl 64
/sbin/ip -6 addr add ${MYTUNNELIP}/64 dev $IP6DEV
/sbin/ip -6 ro add default via ${SIXXSTUNNELIP} dev $IP6DEV
#eth1 internal IF #
/sbin/ip a a $INTPREFIX"1" dev $INTERNALIF
/sbin/ip r a $INTPREFIX"/64" dev $INTERNALIF
echo "Starting IPv6 firewall..."
$IPT6 -F
$IPT6 -X
$IPT6 -t mangle -F
$IPT6 -t mangle -X
## DROP all incomming traffic
$IPT6 -P INPUT DROP
$IPT6 -P OUTPUT DROP
$IPT6 -P FORWARD DROP
#unlimited access to loopback
$IPT6 -A INPUT -i lo -j ACCEPT
$IPT6 -A OUTPUT -o lo -j ACCEPT
# Allow full outgoing connection but no incomming stuff
$IPT6 -A INPUT -i $IP6DEV -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT6 -A OUTPUT -o $IP6DEV -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# allow incoming ICMP ping pong stuff
$IPT6 -A INPUT -i $IP6DEV -p ipv6-icmp -j ACCEPT
$IPT6 -A OUTPUT -o $IP6DEV -p ipv6-icmp -j ACCEPT
# Clients are allowed to connect to router without limits
$IPT6 -A INPUT -i $INTERNALIF -p all -j ACCEPT
$IPT6 -A OUTPUT -o $INTERNALIF -p all -j ACCEPT
# clients are allowed to reach internet
$IPT6 -A FORWARD -i $INTERNALIF -o $IP6DEV -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT6 -A FORWARD -o $INTERNALIF -i $IP6DEV -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
############## add your custom rules below ############
#### open IPv6 port 80
##$IPT6 -A INPUT -i $IP6DEV -p tcp --destination-port 80 -j ACCEPT
#### open IPv6 port 22
##$IPT6 -A INPUT -i $IP6DEV -p tcp --destination-port 22 -j ACCEPT
#### open IPv6 port 25
##$IPT6 -A INPUT -i $IP6DEV -p tcp --destination-port 25 -j ACCEPT
############# End custom rules ################
#
##### no need to edit below ###
## log everything else
$IPT6 -A INPUT -i $IP6DEV -j LOG
$IPT6 -A INPUT -i $IP6DEV -j DROP
Das ganz noch einmal starten:
Code:
debian:~# /etc/network/if-up.d/startipv6tunnel
Und das wars. Sobald man auf einem Client (Linux oder Windows) die Netzwerkverbindung aktualisiert (also z.B. aus- und einschaltet) hat der Client eine IPv6-Adresse:
Man kann die Verbindung dann einmal mit folgenden Mitteln testen:
Auf einem Linux-Client (hier Ubuntu) sollte der Befehl ifconfig folgendes ausgeben:
Code:
user@ubuntu:/# ifconfig
eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:192.168.xxx.xxx Bcast:192.168.xxx.xxx Mask:255.255.255.0
inet6 addr: 2001:15c0:zzzz:xxxx:abcd:abcd:abcd:abcd/64 Scope:Global
inet6 addr: fe80::abcd:abcd:abcd:abcd/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:49790 errors:0 dropped:0 overruns:0 frame:0
TX packets:46229 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:45647711 (45.6 MB) TX bytes:7472494 (7.4 MB)
Interrupt:18
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:70 errors:0 dropped:0 overruns:0 frame:0
TX packets:70 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:6956 (6.9 KB) TX bytes:6956 (6.9 KB)
Code:
user@ubuntu:/# route -n -6
Kernel IPv6 routing table
Destination Next Hop Flag Met Ref Use If
2001:15c0:zzzz::/64 :: UAe 256 0 26 eth0
fe80::/64 :: U 256 0 0 eth0
::/0 fe80::abcd:abcd:abcd:abcd UGDAe 1024 0 8 eth0
::/0 :: !n -1 1 144 lo
::1/128 :: Un 0 3 18 lo
2001:15c0:zzzz:xxxx:abcd:abcd:abcd:abcd/128 :: Un 0 1 485 lo
fe80::abcd:abcd:abcd:abcd/128 :: Un 0 1 0 lo
ff00::/8 :: U 256 0 0 eth0
::/0 :: !n -1 1 144 lo
RE: Linux Router für IPv6 mit ip6tables und SIXXS-Tunnel - julius - 05-09-2011 10:17 PM
hi, danke für deine anleitung, und hab auch gleich nochmal ne verständnisfrage ...
hab per DD-WRT ein sixxs tunnel am laufen, auf dem WRT läuft auch eine ip6tables ... ganz egal auf welchem gerät das jetzt läuft, geht nur um eine grundlegende verständnisfrage!
1) wenn der WRT per radvd die Adressen aus meinem Subnet an meine Clients verteilt hat ja, falls ich es richtig verstehe, jeder client eine eigene IPV6 Adresse mit der er direkt im IPV6-Internet stellt?
2) Auf dem WRT läuft ja eine ip6tables ... schützt diese meine clients?
... für meine begriffe brauch jeder client seine eigene firewall da IPV6 ja kein NAT mehr hat und somit nicht diesen "schutz" von NAT hat und direkt im Internet steht .... andererseits muss der ganze traffic ja so hardwaremäßig ja trotzdem über den WRT und damit durch die ip6tables ?!
RE: Linux Router für IPv6 mit ip6tables und SIXXS-Tunnel - Wolfgang Ninaus - 05-16-2011 02:28 PM
Hallo!
Zitat:1) wenn der WRT per radvd die Adressen aus meinem Subnet an meine Clients verteilt hat ja, falls ich es richtig verstehe, jeder client eine eigene IPV6 Adresse mit der er direkt im IPV6-Internet stellt?
Ja genau! Wobei diese Adresse idR variiert.
Zitat:2) Auf dem WRT läuft ja eine ip6tables ... schützt diese meine clients?
Im Normalfall schon, da du mit IPTables jedes "Erstpaket" an deine Clients verbieten kannst.
Zitat:... für meine begriffe brauch jeder client seine eigene firewall da IPV6 ja kein NAT mehr hat und somit nicht diesen "schutz" von NAT hat und direkt im Internet steht .... andererseits muss der ganze traffic ja so hardwaremäßig ja trotzdem über den WRT und damit durch die ip6tables ?!
Ja, es muss jedes Paket ob rein oder raus über den WRT und somit über ip6tables; wie oben erwähnt kannst du damit den direkten Zugriff von Außen blockieren/filtern.
Code:
# IP6TABLES
# default policy...
...
ip6tables -P FORWARD DROP
...
# allow forwarding
ip6tables -A FORWARD -i laninterface -j ACCEPT # alle dürfen raus
ip6tables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT #nur die dürfen von außen rein
|