Openvpn ipv6 tunelis
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.
IPV6 konfigūracija serveryje:
- Public IPv6: 2a07:5741:0:c::1
- /64 Potinklis: 2a07:5741:0:c::/64
- Pasirinktas VPN Ipv6 potinklis: 2a07:5741:0:c:80::/112
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]
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ą.