Я большой сторонник использования IPv6, стараюсь использовать его везде, где это возможно.
Недавно задумавшись, я решил, что на большинстве своих виртуальных машин я переключу ssh только на ipv6, буду привязываться к случайно выбранному при настройке адресу, который потом для своего удобства пропишу в DNS. Но возник вопрос с доступом с моего ноута к тем, кого я буду настраивать таким образом.
Понятно, что всегда можно зайти через сервер, где у меня IPv6, я, конечно, обычно так делаю, но случаи бывают разные.
Немного почесав затылок, я понял, что могу взять какой-нибудь /112 из предоставленного хостером /64 и раздать его через OpenVPN на свой ноутбук и другие персональные машины, получив тем самым настоящий ipv6, а не адрес от брокеров.
Я решил, что должен это сделать.
Для этого я выбрал виртуальную машину от vultr, на которой у меня изначально ничего не было и которая предназначалась для тестирования, и приступил к ее настройке.
Vultr дает виртуальным машинам сети /64, в нашем примере пусть это будет сеть 2001:NNNN:NNNN:NNNN::/64, из нее мы возьмем «маленький» кусочек /112, который и раздадим нашим компьютерам, пусть это будет 2001:NNNN :NNNN:NNNN:80::/112. Я не буду описывать процедуру генерации ключей для OpenVPN; достаточно подробно описано в других руководствах; Я буду рассматривать только тот конфиг и скрипты, которые будут использоваться для наших целей.
В файле /etc/openvpn/variables пропишем сеть и маску, которую будем использовать, отсюда это дело у нас возьмут на себя скрипты:
Конфигурация OpenVPN-сервера:# Subnet prefix=2001:NNNN:NNNN:NNNN:80:: # netmask prefixlen=112
# Listen port
port 8149
# Protocol
proto udp
# IP tunnel
dev tap0
# Master certificate
ca ca.crt
# Server certificate
cert server.crt
# Server private key
key server.key
# Diffie-Hellman parameters
dh dh2048.pem
# Allow clients to communicate with each other
client-to-client
# Client config dir
client-config-dir /etc/openvpn/ccd
# Run client-specific script on connection and disconnection
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 mode and client subnets
server 10.18.0.0 255.255.255.0
server-ipv6 2001:NNNN:NNNN:NNNN:80::/112
topology subnet
# IPv6 routes
push "route-ipv6 2001:NNNN:NNNN:NNNN::/64"
push "route-ipv6 2000::/3"
persist-key
persist-tun
# Ping every 10s. Timeout of 120s.
keepalive 10 120
# Enable compression
comp-lzo
# User and group
user vpn
group vpn
# Log a short status
status openvpn-status.log
verb 4
sndbuf 0
rcvbuf 0
В конфиге у нас есть скрипты, которые будут запускаться при подключении и отключении клиента: сервер-клиентconnect.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
# Create proxy rule
/sbin/ip -6 neigh add proxy $ipv6 dev eth0
и сервер-клиентдисконнект.ш
#!/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
Как видно в конфиге сервера, мы будем запускать его под пользователем vpn, поэтому нам нужно добавить пользователя # пользовательдобавляет VPN и разрешите этому пользователю sudo наши скрипты, добавив его в /etc/sudoers (не редактируйте его вручную, открыв непосредственно в редакторе, вызовите visudo, чтобы проверить корректность файла перед сохранением!):
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
Теперь давайте включим ndp (Neighbor Discovery Protocol), который нам нужен для того, чтобы наши хосты находили друг друга по IPv6 и были доступны из Интернета по их адресам, добавив в /etc/sysctl.conf (или в отдельный файл в /etc/sysctl.d/ по вашему желанию) строки:
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.proxy_ndp = 1
и завершение # sysctl -p Настроим адреса для отдельной машины, создав файл с именем хоста, который будет подключаться (имя должно совпадать с именем, использованным для создания сертификата для машины), пусть это будет abyrvalg-laptop в /etc/openvpn/ccd /etc/openvpn/ccd/abyrvalg-ноутбук
ifconfig-push 10.18.0.101 255.255.255.0
ifconfig-ipv6-push 2001:NNNN:NNNN:NNNN:80::1001/112 2001:NNNN:NNNN:NNNN:80::1
Первый из адресов IPv6 — это адрес, который будет выдан хосту, второй — адрес его шлюза.
Сервер готов, напишем конфиг для клиента:
abyrvalg-laptop.conf # Client mode
client
# IPv6 tunnel
dev tap
# TCP protocol
proto udp
# Address/Port of VPN server
remote SERVER_IP 8149
# Don't bind to local port/address
nobind
# Don't need to re-read keys and re-create tun at restart
persist-key
persist-tun
# User/Group
;user nobody
;group nobody
# Remote peer must have a signed certificate
remote-cert-tls server
ns-cert-type server
# Enable compression
comp-lzo
ca ca.crt
cert abyrvalg-laptop.crt
key abyrvalg-laptop.key
sndbuf 0
rcvbuf 0
И попробуем вручную запустить сервер и клиент для тестов.
Я предполагаю, что файл конфигурации сервера и файлы сертификатов находятся в /etc/openvpn на сервере, а файл конфигурации для клиента вместе с сертификатами находится в /etc/openvpn на клиенте, конфиги называются server.conf на сервере.
и ipv6.conf на клиенте
На сервере делаем: # cd /etc/openvpn
# openvpn .
/server.conf
на клиенте # cd /etc/openvpn
# openvpn .
/ipv6.conf
Если все сделано правильно, то на клиенте команда ip -6 a s dev Tap0 покажет нам что-то вроде 48: tap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UNKNOWN qlen 100
inet6 2001:NNNN:NNNN:NNNN:80::1001/112 scope global
и ping6 -c 4 ipv6.google.com
покажет: PING ipv6.google.com(lr-in-x8a.1e100.net) 56 data bytes
64 bytes from lr-in-x8a.1e100.net: icmp_seq=1 ttl=46 time=110 ms
64 bytes from lr-in-x8a.1e100.net: icmp_seq=2 ttl=46 time=113 ms
64 bytes from lr-in-x8a.1e100.net: icmp_seq=3 ttl=46 time=110 ms
64 bytes from lr-in-x8a.1e100.net: icmp_seq=4 ttl=46 time=110 ms
--- ipv6.google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 110.586/111.367/113.285/1.183 ms
Вуаля! Теперь у нас на ноутбуке или настольном компьютере есть обычный IPv6 без туннельных брокеров.
Чтобы добавить запуск openvpn при загрузке вашей системы, используйте стандартные инструменты; они могут различаться в зависимости от дистрибутива.
Используется при настройке и написании данный статья, где вы также можете посмотреть примеры генерации ключей для OpenVPN, если вы их еще не генерировали.
В отличие от оригинальной статьи, я использую udp, а не TCP, и Tap, а не Tun устройства.
Теги: #Системное администрирование #openvpn #ipv6
-
Компьютерные Игры Не Для Ваших Детей
19 Oct, 24 -
Тинькофф Прекращает Выпуск Карт Яндекс-Плюс
19 Oct, 24 -
Почему Использования Agile Недостаточно
19 Oct, 24 -
Подход К Обработке Онлайн-Анализа
19 Oct, 24 -
Вся Правда О Шаблонизаторах
19 Oct, 24 -
Тема О Разработке Списков
19 Oct, 24 -
Русский Раздел На Enetri.com
19 Oct, 24