Настройка ipv6 на openwrt

Материал из RNet Wiki

Перейти к: навигация, поиск
Примечание:

Все действия происходили на версии  Attitude Adjustment (r33288) из транка, но должны работать также и на Backfire.

Настройку будем производить из консоли.


Содержание

Необходимые пакеты

Нам понадобятся: модуль поддержки ipv6 для ядра, ipv6 dhcp клиент, radvd для раздачи адресов локальным машинам, ipv6 firewall:

opkg update
opkg install kmod-ipv6 wide-dhcpv6-client radvd ip6tables

Сразу же поставим флаг запуска для radvd, чтобы он стартовал при загрузке системы:

/etc/init.d/radvd enable

Я также рекомендую установить traceroute6, эта утилита полезена для диагностики:

opkg install iputils-traceroute6

Настройка

Разрешим передачу ipv6 пакетов между интерфейсами на уровне ядра. Вставте следующую строчку в /etc/sysctl.conf:

net.ipv6.conf.all.forwarding=1

Теперь в конфигурационный файл /etc/config/network для WAN интерфейса (куда у вас подключён кабель провайдера) в секцию config interface 'wan' добавляем опции:

option accept_ra '1'
option send_rs '1'

Опция accept_ra разрешает принимать Router Advertisement message, что необходимо для получаения ipv6 адреса. А опция send_rs разрешает интерфейсу выполнять запрос этого сообщения, чтобы не ждать пока оно придёт само. Подробнее про методы получанеия адреса и других параметров можно почитать здесь.

Конфигурационный файл dhcpv6 клиента /etc/config/dhcp6c:

config 'dhcp6c' 'basic'
option 'enabled' '1' # 1 = enabled; 0 = disabled
option 'interface' 'wan' # This is the interface the DHCPv6 client will run on
option 'dns' 'dnsmasq' # Which DNS server you run (only dnsmasq currently supported)
option 'debug' '0' # 1 = enable debugging; 0 = disable debugging

# Send options (1 = send; 0 = do not send)
option 'pd' '1' # Prefix Delegation
option 'na' '0' # Non-Temporary Address
option 'rapid_commit' '1' # Rapid Commit

# Request options (1 = request; 0 = do not request)
option 'domain_name_servers' '1'
option 'domain_name' '0'
option 'ntp_servers' '0'
option 'sip_server_address' '0'
option 'sip_server_domain_name' '0'
option 'nis_server_address' '0'
option 'nis_domain_name' '0'
option 'nisp_server_address' '0'
option 'nisp_domain_name' '0'
option 'bcmcs_server_address' '0'
option 'bcmcs_server_domain_name' '0'

# Override the used DUID, by default it is derived from the interface MAC
# The given value must be uppercase and globally unique!
#option 'duid' '00:03:00:06:D8:5D:4C:A5:03:F2'

# Script to run when a reply is received
option 'script' '/usr/bin/dhcp6c-state'

# Define one or more interfaces on which prefixes should be assigned
config 'interface' 'lan'
option 'enabled' '1'
option 'sla_id' '0'
option 'sla_len' '0'

Добавляем в конфигурационный файл фаервола правила для ipv6 /etc/config/firewall: 

# Allow DHCPv6 replies 
# see https://dev.openwrt.org/ticket/10381
# Разрешаем обмен сообщениями на wan порту по протоколу ipv6 через порты 546/547 в зоне 
# локальных адресов для того, чтобы dhcp v6 клиент мог соединяться с сервером и получать необходимые данные 
config rule
option name Allow-DHCPv6
option src wan
option proto udp
option src_ip fe80::/10
option src_port 547
option dest_ip fe80::/10
option dest_port 546
option family ipv6
option target ACCEPT

# Allow essential incoming IPv6 ICMP traffic
# Разрешаем принимать служебные пакеты по протоколу icmp (пинг + ipv6 специфичные)
config rule
option name Allow-ICMPv6-Input
option src wan
option proto icmp
list icmp_type echo-request
list icmp_type destination-unreachable
list icmp_type packet-too-big
list icmp_type time-exceeded
list icmp_type bad-header
list icmp_type unknown-header-type
list icmp_type router-solicitation
list icmp_type router-advertisement
list icmp_type neighbour-solicitation
list icmp_type neighbour-advertisement
option limit 1000/sec
option family ipv6
option target ACCEPT

# Allow essential forwarded IPv6 ICMP traffic
# Разрешаем пересылать служебные пакеты по протоколу icmp за wan интерфейс
config rule
option name Allow-ICMPv6-Forward
option src wan
option dest *
option proto icmp
list icmp_type echo-request
list icmp_type destination-unreachable
list icmp_type packet-too-big
list icmp_type time-exceeded
list icmp_type bad-header
list icmp_type unknown-header-type
option limit 1000/sec
option family ipv6
option target ACCEPT

# Allow forwarded IPv6 tcp/udp traffic
# Разрешаем пересылать ipv6 трафик по протоколам tcp/udp за wan интерфейс 
config rule
option name Allow-IPv6-Forward
option src wan
option dest *
option proto tcpudp
option family ipv6
option target ACCEPT

Конфигурационный файл radvd /etc/config/radvd:

config interface
option interface 'lan'
option AdvSendAdvert 1
option AdvManagedFlag 0
option AdvOtherConfigFlag 0
list client ''

config prefix
option interface 'lan'
# If not specified, a non-link-local prefix of the interface is used
list prefix ''
option AdvOnLink 1
option AdvAutonomous 1
option AdvRouterAddr 0

config route
option interface 'lan'
list prefix ''
option ignore 1

config rdnss
option interface 'lan'
# If not specified, the link-local address of the interface is used
list addr ''

config dnssl
option interface 'lan'
list suffix 'local'
list suffix 'lan'

После всего вышесказанного следует либо перезагрузить роутер, либо перезапустить /etc/init.d/firewall, /etc/init.d/network, /etc/init.d/radvd и /etc/init.d/dhcp6c.

Проверка

Проверяем пинг до гугла:

ping ipv6.google.com

PING ipv6.google.com (2a00:1450:400f:801::1013): 56 data bytes

64 bytes from 2a00:1450:400f:801::1013: seq=0 ttl=58 time=12.265 ms

64 bytes from 2a00:1450:400f:801::1013: seq=1 ttl=58 time=12.153 ms

64 bytes from 2a00:1450:400f:801::1013: seq=2 ttl=58 time=12.156 ms

64 bytes from 2a00:1450:400f:801::1013: seq=3 ttl=58 time=12.133 ms

--- ipv6.google.com ping statistics ---

4 packets transmitted, 4 packets received, 0% packet loss

round-trip min/avg/max = 12.133/12.176/12.265 ms 

Пинг до рнета:

ping v6.rnet.ru
PING v6.rnet.ru (2a00:1838:10:2:5054:ff:fe83:d88): 56 data bytes
64 bytes from 2a00:1838:10:2:5054:ff:fe83:d88: seq=0 ttl=62 time=1.154 ms
64 bytes from 2a00:1838:10:2:5054:ff:fe83:d88: seq=1 ttl=62 time=0.977 ms
64 bytes from 2a00:1838:10:2:5054:ff:fe83:d88: seq=2 ttl=62 time=6.309 ms
64 bytes from 2a00:1838:10:2:5054:ff:fe83:d88: seq=3 ttl=62 time=1.836 ms
--- v6.rnet.ru ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.977/2.569/6.309 ms

Онлайн сервис для проверки через браузер http://test-ipv6.com

Фильтрация входящих пакетов, защита домашней сети, открытие портов

Рассмотрим кусочек правил iptables из пункта настроек более детально:

# Allow forwarded IPv6 tcp/udp traffic
# Разрешаем пересылать ipv6 трафик по протоколам tcp/udp за wan интерфейс
config rule
option name Allow-IPv6-Forward
option src wan
option dest *
option proto tcpudp
option family ipv6
option target ACCEPT

Это правило разрешает весь входящий трафик по протоколу ipv6, роутер пропускает через себя трафик, инициализированный с внешней стороны, насквозь, никак его не обрабатывая. С одной стороны это удобно, устройства, подключённые к роутеру, доступны из интернета, но с другой стороны в таком случае каждое сетевое устройство должно защищаться самостятельноо, а это, наверное, не есть хорошо. Просто удалив это правило можно защитить домашнюю сеть от атак извне, т. к. по умолчанию в конфигурационном файле фаервола присутствуют строчки:

config defaults
option syn_flood '1'
option input 'REJECT'
option output 'REJECT'
option forward 'REJECT'
option drop_invalid '1'

- что означает запрет любых соединений. А чтобы открыть порт, например, для торрент-клиента, онлайн игры или веб сервера, можно добавить в конфигурационный файл следующие строчки:

#открываем 80 порт для веб сервера
config rule
option name 'v6-web-server'
option src 'wan'
option dest 'lan'
option proto 'tcp'
option dest_ip 'адрес машины (ipv6)'
option dest_port '80'
option target 'ACCEPT'

Опцию option family ipv6 указывать необязательно, он умный, сам догадается по dest_ip что это для ipv6.

После добавления правил перезагружаем фаервол командой в консоле:

/etc/init.d/firewall restart

Проверить открытость порта можно с помощью онлайн сервиса.

Я всё настроил, но пинги не ходят

Такое может произойти, если у вас есть сосед с роутером типа ДЛИНК, производитель которого не позаботился о правильной настройке ipv6. В этом случае роутер соседа вещает в сеть маршрут до себя через Router Advertisement message.

Проверить это можно посмотрев таблицу маршрутов ipv6:

ip -6 route

Если в выводе окажется два маршрута по умолчанию, до fe80::204:4eff:fe87:f000 и ещё один, то это оно и есть.

И что делать? Могу посоветовать два пути решения.

При помощи фаервола.

Заблокировать фаерволом всё, кроме fe80::204:4eff:fe87:f000.

Прописать статику.

Для этого в /etc/config/network вместо accept_ra и send_rs добавляем опцию: option ip6addr 'ваш_ipv6_адрес', далее в /etc/rc.local прописываем маршрут до шлюза рнета, чтобы при перезагрузке он добавлялся в таблицу маршрутов:

ip -6 route add default via fe80::204:4eff:fe87:f000 dev eth0.2 proto kernel metric 1024

В /etc/resolv.conf в конец файла прописываем ipv6 dns рнета:

nameserver 2a00:1838:10:2:5054:ff:fec0:f5d9

И отключаем/удаляем ipv6 dhcp клиент.

Личные инструменты