Linux Router für IPv6 mit ip6tables und SIXXS-Tunnel
http://www.ipv6-forum.com/forum/showthread.php?tid=85
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:
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
interface eth1 {
AdvSendAdvert on;
prefix 2001:15c0:zzzz::/64
{
AdvAutonomous on;
AdvOnLink on;
AdvRouterAddr on;
};
};
Als nächstes das Startup-Skript:
#!/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:
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:
- im Browser http://ipv6.google.com öffnen
- ping6 ipv6.google.com
Auf einem Linux-Client (hier Ubuntu) sollte der Befehl ifconfig folgendes ausgeben:
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)
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