Openvpn ipv6 tunelis

Iš Žinynas.
Jump to navigation Jump to search

Situacija kai reikia į lokalų tinklą įvesti ipv6, baigiasi pasenusių maršrutizatorių derinimo nesekme nes jie dažniausia nepripažysta ir nesupranta ipv6 bei 41 protokolo. Šis straipsnis taip pat tinka tiems kurie nori naršyti, naudojant ipv6 bet nenori užsiimti maršrutizatorių, klientų bei viso tinklo sudėtingu derinimu. Straipsnis padės openvpn pagalba įgalinti ipv6 veikimą kliento kompiuteryje be didelių pastangų. Jums tereikia ipv6 natyviai arba per 4to6 tunelį palaikančio serverio su root teisėmis ir openvpn.

Screenshot at Jan 07 13-43-02.png

IPV6 konfigūracija serveryje:

Sistemos konfigūracija[keisti]

Įgalinam ipv4/ipv6 maršrutizavimą, į /etc/sysctl.conf įrašę:

net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.proxy_ndp = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.eth0.forwarding=1

Įkrauname naujai įrašytas taisykles:

sysctl -p

OpenVPN diegimas[keisti]

apt-get install easy-rsa openvpn sudo bind9

Pasiruošiame generuoti sertifikatus, vpn duomenų šifravimui:

cp -r /usr/share/easy-rsa/ /etc/openvpn
mkdir /etc/openvpn/easy-rsa/keys

Atsidarome /etc/openvpn/easy-rsa/vars ir paredaguojame šiuos kintamuosius:

export KEY_COUNTRY="LT"
export KEY_PROVINCE="CA"
export KEY_CITY="Vilnius"
export KEY_ORG="ManoImone"
export KEY_EMAIL="as@manoimone.lt"
export KEY_OU="ManoImone"
export KEY_ALTNAMES="altnames"
export KEY_NAME="serveris"

Išsaugome, sugeneruojame hellmano parametrus su openssl:

openssl dhparam -out /etc/openvpn/dh2048.pem 2048

Padarome bugfix, jeigu openssl versija lygi arba didesnė negu 1:

ln -s openssl-1.0.0.cnf openssl.cnf

Sugeneruojame sertifikatus, reikalui esant visada galima keisti kintamuosius:

cd /etc/openvpn/easy-rsa
source ./vars
./clean-all
./build-ca
./build-key-server serveris # Naudojame kintamajį iš /etc/openvpn/easy-rsa/vars:export KEY_NAME="serveris"
cp /etc/openvpn/easy-rsa/keys/{serveris.crt,serveris.key,ca.crt} /etc/openvpn # Pakeičiame failo pavadinimą serveris (jeigu reikia)

Pridedame sistemos vartotoją vpn (ant jo leisime openvpn, saugumui pakelti):

useradd -r -s /bin/false vpn

Sukuriame kliento konfigūracijos direktoriją:

mkdir /etc/openvpn/ccd

Sudedame /etc/openvpn/variables globalius openvpn kintamuosius

prefix=2a07:5741:0:c:80:
prefixlen=112

Sukuriame kiento prisijungimo scriptą /etc/openvpn/server-clientconnect.sh, su šiuo tekstu

#!/bin/sh

# Check client variables
if [ -z "$ifconfig_pool_remote_ip" ] || [ -z "$common_name" ]; then
        echo "Missing environment variable."
        exit 1
fi

# Load server variables
. /etc/openvpn/variables

ipv6=""

# Find out if there is a specific config with fixed IPv6 for this client
if [ -f "/etc/openvpn/ccd/$common_name" ]; then
        # Get fixed IPv6 from client config file  
        ipv6=$(sed -nr 's/^.*ifconfig-ipv6-push[ \t]+([0-9a-fA-F\\:]+).*$/\1/p' "/etc/openvpn/ccd/$common_name")
fi

# Get IPv6 from IPv4
if [ -z "$ipv6" ]; then
        ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4)
        if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then
                echo "Invalid IPv4 part."
                exit 1
        fi
        hexipp=$(printf '%x' $ipp)
        ipv6="$prefix$hexipp"
fi

# Create proxy rule
/sbin/ip -6 neigh add proxy $ipv6 dev eth0

Taip pat kliento atsijungimo failą, /etc/openvpn/server-clientdisconnect.sh

#!/bin/sh

# Check client variables
if [ -z "$ifconfig_pool_remote_ip" ] || [ -z "$common_name" ]; then
        echo "Missing environment variable."
        exit 1
fi

# Load server variables
. /etc/openvpn/variables

ipv6=""

# Find out if there is a specific config with fixed IPv6 for this client
if [ -f "/etc/openvpn/ccd/$common_name" ]; then
        # Get fixed IPv6 from client config file  
        ipv6=$(sed -nr 's/^.*ifconfig-ipv6-push[ \t]+([0-9a-fA-F\\:]+).*$/\1/p' "/etc/openvpn/ccd/$common_name")
fi

# Get IPv6 from IPv4
if [ -z "$ipv6" ]; then
        ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4)
        if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then
                echo "Invalid IPv4 part."
                exit 1
        fi
        hexipp=$(printf '%x' $ipp)
        ipv6="$prefix$hexipp"
fi

# Delete proxy rule
/sbin/ip -6 neigh del proxy $ipv6 dev eth0

Pridedame pasileidimo flag'ą (+x):

chmod +x /etc/openvpn/server-clientconnect.sh
chmod +x /etc/openvpn/server-clientdisconnect.sh

Įdedame pora sudo taisyklių į /etc/sudoers

Defaults:vpn env_keep += "ifconfig_pool_remote_ip common_name"
vpn ALL=NOPASSWD: /etc/openvpn/server-clientconnect.sh
vpn ALL=NOPASSWD: /etc/openvpn/server-clientdisconnect.sh

Atėjo laikas surašyti pagrindinį openvpn konfigūracijos failą, /etc/openvpn/server.conf:

port 443
proto tcp-server
dev tun0
tun-ipv6
push tun-ipv6
ca ca.crt
cert serveris.crt # jeigu reikia pakeičiame pagal aplinkybes
key serveris.key # jeigu reikia pakeičiame pagal aplinkybes
dh dh2048.pem
client-to-client
client-config-dir /etc/openvpn/ccd
script-security 2
client-connect "/usr/bin/sudo -u root /etc/openvpn/server-clientconnect.sh"
client-disconnect "/usr/bin/sudo -u root /etc/openvpn/server-clientdisconnect.sh"
server 10.8.0.0 255.255.255.0
server-ipv6 2a07:5741:0:c:80::/112
topology subnet
route-ipv6 2a07:5741:0:c:80::/64
push "route-ipv6 2000::/4"
push "route-ipv6 3000::/4"
push "route-ipv6 fc00::/4"
push "redirect-gateway ipv6 !ipv4"
push "dhcp-option DNS 10.8.0.1"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
push "redirect-gateway def1 bypass-dhcp"
#push "redirect-gateway ipv6" #For iOS
persist-key
persist-tun
keepalive 10 120
comp-lzo
user vpn
group vpn
status openvpn-status.log
verb 4

Dar turime praleisti ipv6 per išorinį adresą, t.y:

ip6tables -t nat -A POSTROUTING -s 2a07:5741:0:c:80::/112 -j SNAT --to 2a07:5741:0:c::1
ip6tables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

Taip pat jeigu naudojame debian ir kitas panašias distribucijas, turime praleisti udp 53 prievadą DNS užklausoms:

-A INPUT -p udp -m state --state NEW -m udp --dport 53 -j ACCEPT

Plačiau kaip papildomai įdėti ugniasienės taisykles.


Prieš paleidžiant openvpn įsitikinkite ar paleistas bind9 (dns name servisas).

systemctl status bind9

Jei ne tuomet reikia jį įjungti ir paleisti, jis bus atsakingas už dns užklausas:

systemctl enable bind9
systemctl start bind9 

Dabar galima paleisti openvpn

systemctl start openvpn

arba paleisti debug režimu (jeigu kažkas nesuveikė)

openvpn --cd /etc/openvpn --config /etc/openvpn/server.conf

Kliento sertifikato konfigūracija[keisti]

cd /etc/openvpn/easy-rsa
source ./vars
./build-key ipv6-lt

Turėsime sugeneruotus šiuos failus (tai prisijungimo raktai):

  • /etc/openvpn/easy-rsa/keys/ca.crt
  • /etc/openvpn/easy-rsa/keys/ipv6-lt.crt
  • /etc/openvpn/easy-rsa/keys/ipv6-lt.key

Kuriuos reiktų parsisiųsti tulimesniam kliento konfigūravimui Sukuriame failą su kliento ipv6 konfigūracija /etc/openvpn/ccd/ipv6-lt, pavadinimas taip pat priklauso kokiu prieš tai pavadinimu kurėte raktus.

ifconfig-push 10.8.0.101 255.255.255.0
ifconfig-ipv6-push 2a07:5741:0:c:80::1001/112 2a07:5741:0:c:80::1

Kliento kompiuteris[keisti]

Screenshot at Jan 07 13-47-54.png

Atsisiunčiame kokį nors OpenVPN klientą, priklauso kokią operacijų sistemą naudojate.

  • Mac OS X - TunnelBlick, Viscosity.
  • Widows - Viscosity OpenVPN.
  • Linux - sudo openvpn --config /kelias/iki/ipv6-lt.ovpn, arba visokia GUI fygnia randama standartiškai pagal grafinę aplinką (pvz.: network-manager-openvpn-gnome ir t.t.).

Sukuriame kliento prisijungimo prie openvpn failą ipv6-lt.ovpn į jį surašome šį tekstą:

client
dev tun
proto tcp-client
remote xxx.xxx.xxx.xxx 443 # BŪTINAI PAKEISTI, vietoje xxx.xxx.xxx.xxx reikia nurodyti jūsų serverio išorinį ip ant kurio kaba openvpn
nobind
persist-key
persist-tun
;user nobody
;group nobody
remote-cert-tls server
ns-cert-type server
comp-lzo
<ca>
-----BEGIN CERTIFICATE-----
(čia įsirašo tekstas iš ca.crt)
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
(čia įsirašo tekstas iš ipv6-lt.crt)
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
(čia įsirašo tekstas iš ipv6-lt.key)
-----END PRIVATE KEY-----
</key>

Štai ir viskas, galima pratestuoti kliento kompiuteryje paleidus:

ping6 www.kame.net

Taip pat galite laisvai naudotis Google Chrome, kad galėtumėte naršyti platųjį ipv6 tinklą.