

/etc/rc.conf
Код: Выделить всё
ipv6_enable="YES"
ipv6_defaultrouter="2A00:18C0:1:1::1"
ipv6_ifconfig_bce0_alias0="2a00:18c0:1:1::2eee/64"
$ ifconfig bce0
bce0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=1bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4>
ether 00:1c:c4:11:ff:0a
inet6 fe80::21c:c4ff:fe11:ff0a%bce0 prefixlen 64 scopeid 0x1
inet 111.1.1.1 netmask 0xffffffe0 broadcast 111.1.1.31
inet6 2a00:18c0:1:1::2eee prefixlen 64
media: Ethernet autoselect (1000baseTX <full-duplex>)
status: active
Код: Выделить всё
ifconfig bce0 inet6 2a00:18c0:1:1::2eee/64
route add -inet6 default 2A00:18C0:1:1::1
Нужно разрешить весть icmp6 траффик, без этого ipv6 не работает, это все равно что запретить arp для ipv4

allow icmp6 from any to any
Так же введено понятие me6 - грубо говоря, я с протоколом IPv6. IP6 - ipv6 протокол. Пример
allow tcp from any to { me or me6 } established
Косяк - таблицы ipv6 адреса не понимают, трабла известная, в 9-ке пофикшено.
PF
Все работает.
Кое где придется писать proto inet или proto inet6:
pass inet proto icmp to ($ext_if) icmp-type $icmp_types no state
pass inet6 proto icmp6

/etc/namedb/named.conf
Код: Выделить всё
options {
allow-recursion 2a00:18c0/32;
listen-on-v6 { 2a00:18c0:1:1::2eee; }; //Обязательно
query-source-v6 2a00:18c0:1:1::2eee; // все ниже по желанию, если у вас куча интерфейсов на машине
transfer-source-v6 2a00:18c0:1:1::2eee;
notify-source-v6 2a00:18c0:1:1::2eee;
};
zone "provider.net" {
type master;
file "provider.net";
};
zone "0.c.8.1.0.0.a.2.ip6.arpa" {
type master;
file "ARPA.IP6.2a00-18c0-0000-0000-0000-0000-0000-0000"; //мне так удобнее
};

Ну с прямой зоной все ясно, в файл provider.net добваляем запись вида
Код: Выделить всё
ipv6server IN AAAA 2a00:18c0:1:1::2eee

А вот с обраткой чистой воды шаманство:
файл ARPA.IP6.2a00-18c0-0000-0000-0000-0000-0000-0000
Код: Выделить всё
@ IN SOA dns1.privider.net. hostmaster.provider.net. (
1 ; Serial
3600 ; Refresh
400 ; Retry
1209600 ; Expire
3600 ) ; Minimum
IN NS dns1.provider.net.
IN NS dns2.provider.net.
2eee.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.0.1.0.0.0 IN PTR ipv6server.provider.net.
2a00:18c0:1:1::2eee == 2a00:18c0:0001:0001:0000:0000:0000:2eee -> 2eee.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.0.1.0.0.0.18c0.2a00 (Кто придумал???)
Соответственно два последних октета не пишем, т.к. в описании зоны уже все есть.
В кратце, нули слева можно не писать, пустые октеты пропускаем ::, но можно один раз! Т.е. если у вас 2a00:18c0:0001:0000:0001:0000:0000:2eee, то сократить можно только до 2a00:18c0:1:0:1::2eee

Для простоты создания обратной зоны для себя веду просто файл вида:
Код: Выделить всё
2a00:18c0:0001:0001::2eee ipv6server.provider.net.
ipv6dns.rb
Берем каталог ZONEDIR, из каждого файлика генерим одну зону, скипаем комменты и пустые строки
Код: Выделить всё
#!/usr/bin/env ruby
# v.0.1 by kirgudu@kirgudu.org
require 'ipaddr'
ZONE = '.0.c.8.1.0.0.a.2.ip6.arpa'
ZONEDIR = '/etc/namedb/IPv6/'
serial = Time.now.to_i
def prnhead
print <<EOF
$TTL 10800
;
; (REVERSE zone for 2a00.18c0::1 network)
;
@ IN SOA dns1.provider.net. hostmaster.provider.net. (
#{serial} ; Serial
3600 ; Refresh
400 ; Retry
1209600 ; Expire
3600 ) ; Minimum
IN NS dns1.provider.net.
IN NS dns2.provider.net.
EOF
end
prnhead
Dir.new("#{ZONEDIR}").each do | zfile |
next if zfile =~ /^\./
lines = IO.readlines("#{ZONEDIR}/#{zfile}")
lines.each do | line |
next if line =~ /^\s+$/ or line =~ /^#/ or line =~ /^;/
ip,name = line.chomp.downcase.split
ip6 = IPAddr.new ip
dnsadr = ip6.ip6_arpa
dnsadr = dnsadr.gsub(ZONE,"")
puts "#{dnsadr} IN PTR #{name}"
end
end

PS: Пару раз, когда фре прикручивал ipv6 адреса без перезагрузки - оно ребуталось с кернель паником. что 7.2, что 8.0. Шайтан. Так что осторожнее.