Маршрутизатор Ubuntu возвращает ICMP, административно запрещенный для всех IPv6

Я использую машину Ubuntu 14.04 с именем ubu1404-150805-3 в качестве маршрутизатора с двумя стеками (IPv4 и IPv6). У меня есть клиентский компьютер с именем ubu1404-150805-2, который также является Ubuntu 14.04 и единственный доступ к сети которого осуществляется через этот маршрутизатор Ubuntu. Это все прекрасно работает для IPv4. Но всякий раз, когда клиент пытается отправить пакет IPv6 чему-либо, кроме маршрутизатора, маршрутизатор возвращает пакет ICMP типа 3, код 9 (административно запрещен). Клиент может ping6 роутер. Что идет не так и как я могу это исправить?

На маршрутизаторе Ubuntu нет правил ip6tables, а единственное правило iptables делает SNAT:

root@ubu1404-150805-3:~# iptables-save
# Generated by iptables-save v1.4.21 on Sun Sep 27 03:35:36 2015
*nat
:PREROUTING ACCEPT [33:3275]
:INPUT ACCEPT [4:744]
:OUTPUT ACCEPT [17:1207]
:POSTROUTING ACCEPT [1:60]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Sun Sep 27 03:35:36 2015
root@ubu1404-150805-3:~# ip6tables-save
root@ubu1404-150805-3:~# 

Маршрутизатор имеет два сетевых адаптера: один для восходящего и один для нисходящего потоков. У него нет нативной службы IPv6 из апстрима, поэтому я также установил туда miredo. Маршрутизатор не имеет проблем с тем, что делает сам IPv6:

root@ubu1404-150805-3:~# ping6 -c 1 2001:4860:4860::8844
PING 2001:4860:4860::8844(2001:4860:4860::8844) 56 data bytes
64 bytes from 2001:4860:4860::8844: icmp_seq=1 ttl=57 time=289 ms

--- 2001:4860:4860::8844 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 289.616/289.616/289.616/0.000 ms

Для сравнения, вот клиент, терпящий неудачу в этом:

mspreitz@ubu1404-150805-2:~$ ping6 -c 1 2001:4860:4860::8844
PING 2001:4860:4860::8844(2001:4860:4860::8844) 56 data bytes
From fddf:2::1 icmp_seq=1 Destination unreachable: Administratively prohibited

--- 2001:4860:4860::8844 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

tcpdump -i eth1 на маршрутизаторе показывает входящий запрос ping и "административно запрещенный" возврат клиенту.

tcpdump -i teredo на роутере показывает, что он перенаправляет запрос ping клиента! И никакого ответа на пинг не видно.

root@ubu1404-150805-3:~# tcpdump -nne -i teredo
tcpdump: WARNING: teredo: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on teredo, link-type RAW (Raw IP), capture size 65535 bytes
03:57:39.349401 ip: fddf:2::b9ca:b0dc:8ae:4002 > 2001:4860:4860::8844: ICMP6, echo request, seq 1, length 64

Вот ip addr с роутера:

root@ubu1404-150805-3:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:e0:d0:b2 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fee0:d0b2/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:f7:66:4a brd ff:ff:ff:ff:ff:ff
    inet 10.0.100.1/24 brd 10.0.100.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fddf:2::1/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fef7:664a/64 scope link 
       valid_lft forever preferred_lft forever
5: teredo: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1280 qdisc pfifo_fast state UNKNOWN group default qlen 500
    link/none 
    inet6 2001:0:53aa:64c:28fd:345a:d0ed:e570/32 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::ffff:ffff:ffff/64 scope link 
       valid_lft forever preferred_lft forever

А вот конфиг на клиенте:

mspreitz@ubu1404-150805-2:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:72:df:14 brd ff:ff:ff:ff:ff:ff
    inet 10.0.100.2/24 brd 10.0.100.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fddf:2::b9ca:b0dc:8ae:4002/64 scope global temporary dynamic 
       valid_lft 85988sec preferred_lft 13988sec
    inet6 fddf:2::a00:27ff:fe72:df14/64 scope global dynamic 
       valid_lft 85988sec preferred_lft 13988sec
    inet6 fe80::a00:27ff:fe72:df14/64 scope link 
       valid_lft forever preferred_lft forever

Маршрутизатор настроен на пересылку одноадресных пакетов IPv4 и IPv6:

root@ubu1404-150805-3:~# sysctl -a | grep forward
net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.all.mc_forwarding = 0
net.ipv4.conf.default.forwarding = 1
net.ipv4.conf.default.mc_forwarding = 0
net.ipv4.conf.eth0.forwarding = 1
net.ipv4.conf.eth0.mc_forwarding = 0
net.ipv4.conf.eth1.forwarding = 1
net.ipv4.conf.eth1.mc_forwarding = 0
net.ipv4.conf.lo.forwarding = 1
net.ipv4.conf.lo.mc_forwarding = 0
net.ipv4.conf.teredo.forwarding = 1
net.ipv4.conf.teredo.mc_forwarding = 0
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.all.mc_forwarding = 0
net.ipv6.conf.default.forwarding = 1
net.ipv6.conf.default.mc_forwarding = 0
net.ipv6.conf.eth0.forwarding = 1
net.ipv6.conf.eth0.mc_forwarding = 0
net.ipv6.conf.eth1.forwarding = 1
net.ipv6.conf.eth1.mc_forwarding = 0
net.ipv6.conf.lo.forwarding = 1
net.ipv6.conf.lo.mc_forwarding = 0
net.ipv6.conf.teredo.forwarding = 1
net.ipv6.conf.teredo.mc_forwarding = 0

А у маршрутизатора отключена конфиденциальность IPv6:

root@ubu1404-150805-3:~# sysctl -a | grep tempaddr
net.ipv6.conf.all.use_tempaddr = 0
net.ipv6.conf.default.use_tempaddr = 0
net.ipv6.conf.eth0.use_tempaddr = 0
net.ipv6.conf.eth1.use_tempaddr = 0
net.ipv6.conf.lo.use_tempaddr = 0
net.ipv6.conf.teredo.use_tempaddr = -1

Я сомневаюсь, что это имеет значение, но я использую radvd и rdnssd на маршрутизаторе. Клиент настроен в /etc/network/interfaces используя статический метод для IPv4 и IPv6, с autoconf 1 (т. е. включение SLAAC) в случае v6.

Вот информация о версии с сервера:

root@ubu1404-150805-3:~# uname -a
Linux ubu1404-150805-3 3.13.0-61-generic #100-Ubuntu SMP Wed Jul 29 11:21:34 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

И то же самое на клиенте:

mspreitz@ubu1404-150805-2:~$ uname -a
Linux ubu1404-150805-2 3.13.0-61-generic #100-Ubuntu SMP Wed Jul 29 11:21:34 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

Кстати, обе эти машины являются виртуальными машинами VirtualBox (версия 4.3.30). Я использую внутреннюю сеть VirtualBox на eth1 сервера и eth0 клиента. Сервер eth0 привязан к хосту, Mac с MacOS 10.10.5.

1 ответ

Teredo предоставляет IPv6 только для самого хоста, поэтому вы не можете использовать его для предоставления IPv6 в вашей локальной сети. Если вам нужны подсети, которые вы можете маршрутизировать, вы должны использовать туннельный сервис, такой как tunnelbroker.net или SixXS.

Кроме того, Teredo - ужасно ненадежный протокол.

Другие вопросы по тегам