HE.Net IPv6 Tunnel IPv4 Hálózaton

computer network ipv6 over ipv4 he net

Nemrégiben IPv6-al kísérleteztem, Olyan megoldást szerettem volna kipróbálni, ami legalább bizonyos mértékben hordozható. Ha van rá mód, akkor mindig ugyanazt a tartományt szeretném használni, hogy tudjak tűzfalat is konfigurálni és bizonyos címeknek esetleg egyedi szabályokat beállítani akár külső elérésekhez is. Publikus IPv6 címeket akartam használni egy hálózatban router mögött, dual-stack módban IPv4-el, így használhatóak maradnak a jelenlegi belső szolgáltatásaim is. Úgy döntöttem végül, hogy ezen feltételek mellett a HE.NET IPv6 megoldását fogom kipróbálni egy Mikrotik router segítségével. A cikk olvasása és értelmezése alapszintű IPv6 hálózati ismeretek és Mikrotik RouterOS alap-közepes szintű ismeretek meglétét feltételezi, nem célom az alapoktól mindent elmagyarázni ezen a téren.

Az IPv6 hálózatok egyik alapvető igénye, hogy az ICMPv6 ne legyen szűrve, azaz gyakorlatilag minden, route-olható címmel rendelkező állomást lehessen pingelni hálózaton kívülről is. Az ICMPv6 tiltását kifejezetten nem javaslom, néhány IPv4 világból érkezett rendszergazda jó ötletnek tarthatja – ne hallgass rájuk.

A HE.NET IPv6 tunnel broker szolgáltatás igénybevételéhez ingyenes regisztráció szükséges, ezt itt lehet megtenni: HE.NET IPv6 Tunnel Broker

Regisztráció után vegyünk fel egy új tunnelt, itt érdemes a hozzánk legközelebbi, budapesti tunnel server-t kijelölni. Gondoskodni kell róla az IPv4 tűzfalban, hogy a router megkapja az innen (jelenleg a budapesti tunnel server IPv4 címe: 216.66.87.14) érkező, protocol 41 csomagokat, illetve a tunnel servernek tudjon protocol 41 csomagokat küldeni. Nem 41-es TCP vagy UDP port, hanem 41-es protocol.

Azt tapasztaltam, hogy a szolgáltatói router mögé rakott Mikrotik az én esetemben DMZ hostként használva nem kapja meg a protocol 41 (ipv6 encapsulated in ipv4, RFC2473) csomagokat, így a rendszert úgy állítottam be, hogy a szolgáltatói eszköz PPPoE passthrough módban (egyes szolgáltatóknál bridge-módként lehet ismert) legyen és a Mikrotik router legyen a PPPoE kliens. Üzemszerű használathoz emiatt érdemes valamilyen erősebb router modellt választani a PPPoE miatt, főleg nagyobb sebességű internet-vonal esetén már maga a PPPoE is észrevehető mértékű terhelést okozhat egy sima DHCP-vel szemben például. (DIGI, vagy Telekom jellemzően PPPoE – kontra UPC a legtöbb helyen DHCP).

A Mikrotik routeren engedélyezve kell legyen az “IPv6” csomag. Fontos megjegyezni, hogy az IPv6 tűzfal teljesen különálló szabályokkal rendelkezik, semmiképpen se engedjünk IPv6 forgalmat a routeren megfelelő tűzfalbeállítás nélkül, mert route-olható IPv6 címek beállítása és használata esetén az IPv4 esetén megszokott, NAT-olt belső hálózaton található információk mindenki számára elérhetővé válnak, akár a publikus internet felől is! Ezért mindenekelőtt az IPv6 tüzfalat hozzuk létre:

# Remove unnecessary interface definitions
add action=accept chain=input connection-state=established,related
add action=drop chain=input connection-state=invalid
add action=accept chain=input protocol=icmpv6
# that's safer
add action=drop chain=input in-interface=!bridge
# rest of input is implicitly accepted
add action=accept chain=forward connection-state=established,related
add action=accept chain=forward in-interface=bridge
add action=drop chain=forward
# For reference this is the default for ipv6 firewall in RouterOS v6.47+
/ipv6 firewall address-list add address=::/128 comment="defconf: unspecified address" list=bad_ipv6
/ipv6 firewall address-list add address=::1/128 comment="defconf: lo" list=bad_ipv6
/ipv6 firewall address-list add address=fec0::/10 comment="defconf: site-local" list=bad_ipv6
/ipv6 firewall address-list add address=::ffff:0.0.0.0/96 comment="defconf: ipv4-mapped" list=bad_ipv6
/ipv6 firewall address-list add address=::/96 comment="defconf: ipv4 compat" list=bad_ipv6
/ipv6 firewall address-list add address=100::/64 comment="defconf: discard only " list=bad_ipv6
/ipv6 firewall address-list add address=2001:db8::/32 comment="defconf: documentation" list=bad_ipv6
/ipv6 firewall address-list add address=2001:10::/28 comment="defconf: ORCHID" list=bad_ipv6
/ipv6 firewall address-list add address=3ffe::/16 comment="defconf: 6bone" list=bad_ipv6
/ipv6 firewall address-list add address=::224.0.0.0/100 comment="defconf: other" list=bad_ipv6
/ipv6 firewall address-list add address=::127.0.0.0/104 comment="defconf: other" list=bad_ipv6
/ipv6 firewall address-list add address=::/104 comment="defconf: other" list=bad_ipv6
/ipv6 firewall address-list add address=::255.0.0.0/104 comment="defconf: other" list=bad_ipv6
/ipv6 firewall filter add action=accept chain=input comment="defconf: accept established,related,untracked" connection-state=established,related,untracked
/ipv6 firewall filter add action=drop chain=input comment="defconf: drop invalid" connection-state=invalid
/ipv6 firewall filter add action=accept chain=input comment="defconf: accept ICMPv6" protocol=icmpv6
/ipv6 firewall filter add action=accept chain=input comment="defconf: accept UDP traceroute" port=33434-33534 protocol=udp
/ipv6 firewall filter add action=accept chain=input comment="defconf: accept DHCPv6-Client prefix delegation." dst-port=546 protocol=udp src-address=fe80::/16
/ipv6 firewall filter add action=accept chain=input comment="defconf: accept IKE" dst-port=500,4500 protocol=udp
/ipv6 firewall filter add action=accept chain=input comment="defconf: accept ipsec AH" protocol=ipsec-ah
/ipv6 firewall filter add action=accept chain=input comment="defconf: accept ipsec ESP" protocol=ipsec-esp
/ipv6 firewall filter add action=accept chain=input comment="defconf: accept all that matches ipsec policy" ipsec-policy=in,ipsec
/ipv6 firewall filter add action=drop chain=input comment="defconf: drop everything else not coming from LAN" in-interface-list=!LAN
/ipv6 firewall filter add action=accept chain=forward comment="defconf: accept established,related,untracked" connection-state=established,related,untracked
/ipv6 firewall filter add action=drop chain=forward comment="defconf: drop invalid" connection-state=invalid
/ipv6 firewall filter add action=drop chain=forward comment="defconf: drop packets with bad src ipv6" src-address-list=bad_ipv6
/ipv6 firewall filter add action=drop chain=forward comment="defconf: drop packets with bad dst ipv6" dst-address-list=bad_ipv6
/ipv6 firewall filter add action=drop chain=forward comment="defconf: rfc4890 drop hop-limit=1" hop-limit=equal:1 protocol=icmpv6
/ipv6 firewall filter add action=accept chain=forward comment="defconf: accept ICMPv6" protocol=icmpv6
/ipv6 firewall filter add action=accept chain=forward comment="defconf: accept HIP" protocol=139
/ipv6 firewall filter add action=accept chain=forward comment="defconf: accept IKE" dst-port=500,4500 protocol=udp
/ipv6 firewall filter add action=accept chain=forward comment="defconf: accept ipsec AH" protocol=ipsec-ah
/ipv6 firewall filter add action=accept chain=forward comment="defconf: accept ipsec ESP" protocol=ipsec-esp
/ipv6 firewall filter add action=accept chain=forward comment="defconf: accept all that matches ipsec policy" ipsec-policy=in,ipsec
/ipv6 firewall filter add action=drop chain=forward comment="defconf: drop everything else not coming from LAN" in-interface-list=!LAN

A tunnel broker oldalon a tunnel létrehozása után első körben a tunnel adatlapján lévő következő információk lesznek érdekesek:

  • Tunnel ID – a tunnel azonosítója, számokból áll, legfelül található

IP adatok:

  • Routed /64 – a hozzárendelt route-olható /64 network – ez a belső, LAN oldali IPv6 címtartomány
  • Client IPv6 address – a routeren használt IPv6 cím – ez lesz a mi routerünk WAN oldali IPv6 címe
  • Server IPv6 address – a route-oláshoz használt peering IPv6 cím – ez a szolgáltató oldali cím, kvázi a default gateway

Advanced fülön található adatok:

  • MTU – ez Telekom PPPoE esetén legyen 1460-ra állítva
  • Update key– ez szükséges lesz az IPv4 cím frissítéséhez később

A HE.NET példa scriptekkel is szolgál, a Mikrotikhez ajánlott verziójuk a következő:

/interface 6to4 add comment="Hurricane Electric IPv6 Tunnel Broker" disabled=no local-address=X.X.X.X mtu=1280 name=he-6in4 remote-address=Y.Y.Y.Y
/ipv6 route add comment="" disabled=no distance=1 dst-address=2000::/3 gateway=AAAA:BBBB:CCCC::1 scope=30 target-scope=10
/ipv6 address add address=DDDD:EEEE:FFFF::2/64 advertise=no disabled=no eui-64=no interface=he-6in4

A fenti scriptben az IP címeket a megfelelőkre kell cserélni, ezeket vastaggal jelöltem:

  • X.X.X.X – az aktuális WAN IPv4 címünk
  • Y.Y.Y.Y – a tunnel broker szerver IPv4 címe (jelen példában 216.66.87.14, lásd mint fentebb)
  • AAAA:BBBB:CCCC::1 – a fenti “Server IPv6 address” értéke
  • DDDD:EEEE:FFFF::2/64 – a fenti “Client IPv6 address” értéke

Mindezek sikeres beállítása után a routerről már lehet IPv6-on pingelni, egy terminál nyitása után például a Sprint nevű amerikai szolgáltató egyszerű, jól megjegyezhető IPv6 címmel rendelkezik:

[admin@RB4011] > ping count=3 2600:: 
SEQ HOST SIZE TTL TIME STATUS 
0 2600:: 56 51 132ms echo reply 
1 2600:: 56 51 132ms echo reply 
2 2600:: 56 51 130ms echo reply 
sent=3 received=3 packet-loss=0% min-rtt=130ms avg-rtt=131ms max-rtt=132ms

Vegyük fel a route-olt /64 egyik, mondjuk első címét:

/ipv6 address add address=AAAA:BBBB::1/64 interface=bridge-internal eui-64=no advertise=yes

Itt is értelemszerűen az AAAA:BBBB címet, illetve az interface-t töltsük ki a megfelelő értékekkel.

Nálam az IPv6 beállítások a következőképpen néznek ki:

[admin@RB4011] > /ipv6 settings print 
forward: yes
accept-redirects: yes-if-forwarding-disabled
accept-router-advertisements: no
max-neighbor-entries: 8192

Szükséges lehet még beállítani a DHCPv6 servert a routerben annak érdekében, hogy a router a prefix delegálást tovább tudja adni a belső hálózaton lévő kliensek számára és a kliens IPv6 címhez tudjon jutni a SLAAC által.

Ezek után hálózatunk készen áll az IPv6 használatára.

Annak érdekében, hogy a HE.NET tudja, hogy a forgalmat hova kell küldenie, szükséges tudniuk, hogy mi az aktuális IP címünk. Dinamikus WAN oldali cím használata esetén a HE.NET nem old fel hostnevet, így nem jó ötlet valamilyen dinamikus DNS szolgáltatás használata, a HE.NET elvárja, hogy IP címmel jelöljük ki a végpontunkat, de biztosít lehetőséget az IPv4 cím dinamikus frissítésére API-n keresztül.

Az IPv4 cím frissítéséhet a System -> Scripts alatt vegyünk fel egy új scriptet mondjuk “HE-IPv6-update” néven az alábbi tartalommal:

# Update Hurricane Electric IPv6 Tunnel Client IPv4 address
# This is a refreshed version based on an existing script from Mikrotik
# http://wiki.mikrotik.com/wiki/Hurricane_Electric_IPv6_Tunnel_-_IPv4_Endpoint_updater
# IP API call format at he.net:
# https://#USERNAME:[email protected]/nic/update?username=$USERNAME&password=$API_KEY&hostname=$TUNNEL_ID
# ----------------------------------
# Modify the following to match your parameters
# ----------------------------------
# Router's WAN interface name
:local WANinterface "pppoe-out"
# Router's 6to4 interface name
:local HEtunnelinterface "he-6in4"
# Your username - you use it to log in at https://tunnelbroker.net
:local HEuserid "abcdefgh"
# Tunnel ID (not name) as written in your tunnel's details at https://tunnelbroker.net
:local HEtunnelid "123456"
# Your Update Key for this tunnel, as written in the "Advanced" tab on tunnel details page
:local HEkey "abcd1234-abcd1234"
# ----------------------------------
# STOP modifying here
# ----------------------------------
# Internal processing below...
# ----------------------------------
:local HEupdatehost "ipv4.tunnelbroker.net"
:local HEupdatepath "/nic/update?"
:local outputfile ("HE-" . $HEtunnelid . ".txt")
:local HEipv4addr
# Get WAN interface IP address
# The next line is for cloud public ip address, but in our case putting the Mikrotik behind the provider's router did not work, so we set the WAN directly to pppoe
#:set HEipv4addr [/ip cloud get public-address]
:set HEipv4addr [/ip address get [/ip address find interface=$WANinterface] address]
:set HEipv4addr [:pick [:tostr $HEipv4addr] 0 [:find [:tostr $HEipv4addr] "/"]]
:if ([:len $HEipv4addr] = 0) do={
:log error ("Could not get IP for interface " . $WANinterface)
:error ("Could not get IP for interface " . $WANinterface)
}
# Update the HEtunnelinterface with WAN IP
/interface 6to4 {
:if ([get ($HEtunnelinterface) local-address] != $HEipv4addr) do={
:log info ("Updating IPv6 Tunnel " . $HEtunnelid . " Client IPv4 address to new IP " . $HEipv4addr . "...")
disable $HEtunnelinterface
/tool fetch mode=https host=($HEupdatehost) url=("https://" . $HEuserid . ":" . $HEkey . "@" . $HEupdatehost . $HEupdatepath . "&username=" . $HEuserid . "&pass=" . $HEkey . "&hostname=" . $HEtunnelid) dst-path=($outputfile)
# Change the client IPv4 address
set ($HEtunnelinterface) local-address=$HEipv4addr
# I like to make a little pause before enabling the interface
/delay 3
# Enable the IPv6 interface
enable $HEtunnelinterface
# Append the file to log for review
:log info ([/file get ($outputfile) contents])
# Clean up after ourselves
/file remove ($outputfile)
} else={
# If client's IPv4 didn't change at all, put it in the log so that we know the script is working
:log info ("Updating " . $HEtunnelinterface . " No change, IP is still " . $HEipv4addr )
}
}

A script elején lévő konfigurációs részben néhány változót a megfelelő értékre kell állítani, ezeket vastaggal kiemeltem. Az adatok a he.net tunnelbroker oldaláról beszerezhetőek, a tunnel létrehozása után ezeket részleteztem is, az ott rögzített adatokkal szükséges kitölteni a mezőket.

A fenti scriptet én időzítőből hívom meg 5 percenként, ehhez fel kell venni egy bejegyzést a System -> Scheduler alatt. A neve legyen például “HE-ipv6”, az Interval értéke 00:05:00, a tartalma pedig ez:

system script run HE-IPv6-update

TIPP: A Magyar Telekom által optikai hálózatokon használt SagemCom F@st 5655v2 típusú ONT (fekete, lyukacsos tetejű, általában fekvő pozícióban használatos) firmware-e sajnos hibás. A Broadcom kommunikációs chip, amelyre a készüléket építették a driverében a pktrunner modulban rosszul adja vissza a PPPoE payload length értékét, így azt a PPPoE-t termináló végberendezés – legyen az az ONT maga, vagy a Mikrotik, vagy egyéb típusú router ha az ONT-t PPPoE passthrough módban használjuk – emiatt hibás csomagként jellemzően eldobja. A jelenség általában az, hogy a kisebb csomagoknál, vagy ICMP pingnél nem észrevehető a probléma, a 6-in-4 tunnel felépülése után azonnal és stabilan használható, azonban HTTP vagy HTTPS, esetleg TLS kapcsolatok nem épülnek fel, vagy felépülés után rövid úton elbomlanak. Ebben az esetben gyanakodhatunk eszközhibára. Nálam a megoldás az lett, hogy az eszközt cserlétettem egy SagemCom F@st 5670 típusra, ezzel a probléma nem jelentkezik, a tunnel stabilan és gyorsan működik azóta is a fenti leírás szerint összeállított konfigurációban.