Я пытаюсь настроить туннельный сервер 6in4 на своем VPS. Клиент и сервер могут пинговать IPv6-адреса друг друга, когда я пытаюсь пинговать внешний сервер от клиента, я получаю сообщение об ошибке недоступности адреса ICMP.
Но я могу без проблем пинговать веб-сайт IPv6 с сервера, и после пинга с сервера я могу пинговать с клиента примерно через 30 секунд, после чего я снова получаю ошибку недоступности адреса ICMP.
tcpdump показывает, что при эхо-запросе с сервера он отправит пакет запроса соседа, используя свой общедоступный IPv6-адрес, и правильно получит обратно объявление соседа от шлюза. Но при пинге от клиента сервер отправит пакет запроса соседа, используя свой локальный адрес канала, и не получит ничего обратно. После нескольких попыток сервер откажется и вернет клиенту недоступный ICMP-адрес.
Как я могу это исправить? Я знаю, что могу добавить в шлюз постоянную запись соседа, но это довольно хакерский метод, поэтому я хочу по возможности избегать этого.
Вот дополнительная информация:
Серверная ОС: Сервер Ubuntu 13.10
uname -a
: Linux 3.11.0-19-generic #33-Ubuntu SMP Tue Mar 11 18:48:34 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
Мой интернет-провайдер дал мне только блок / 112, поэтому я использовал npd6 для обработки входящих пакетов запроса от соседей
ip6tables не имеет записей в таблицах INPUT и OUTPUT
tcpdump (при пинге с сервера):
18:14:33.988952 IP6 [server's public IPv6 address] > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has [gateway's IPv6 address], length 32
18:14:33.989410 IP6 [gateway's IPv6 address] > [server's public IPv6 address]: ICMP6, neighbor advertisement, tgt is [gateway's IPv6 address], length 32
18:14:33.989428 IP6 [server's public IPv6 address] > google-public-dns-a.google.com: ICMP6, echo request, seq 1, length 64
18:14:34.038299 IP6 google-public-dns-a.google.com > [server's public IPv6 address]: ICMP6, echo reply, seq 1, length 64
tcpdump (при пинге от клиента обратите внимание, что fe80 :: 5054: ff: fe3b: 3836 - это локальный адрес ссылки сервера):
18:12:35.284184 IP [client's IPv4 address] > server: IP6 [sit tunnel address (client)] > google-public-dns-a.google.com: ICMP6, echo request, seq 1, length 64
18:12:35.284263 IP6 fe80::5054:ff:fe3b:3836 > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has [gateway's IPv6 address], length 32
18:12:36.282458 IP6 fe80::5054:ff:fe3b:3836 > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has [gateway's IPv6 address], length 32
18:12:37.282470 IP6 fe80::5054:ff:fe3b:3836 > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has [gateway's IPv6 address], length 32
18:12:38.282503 IP server > [client's IPv4 address]: IP6 [sit tunnel address (server)] > [sit tunnel address (client)]: ICMP6, destination unreachable, unreachable address google-public-dns-a.google.com, length 112
После пинга от клиента вывод ip neigh
на сервере выглядит так (нерелевантные записи удалены):
[gateway's IPv6 address] dev eth0 router FAILED
ip addr
и ip -6 route
(адреса анонимны):
.. snipped ..
2: eth0: <BROADCAST,MULTICAST,ALLMULTI,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
inet .. snipped .. scope global eth0
valid_lft forever preferred_lft forever
inet6 2001:db8:aa:b::cccc:1/48 scope global
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe3b:3836/64 scope link
valid_lft forever preferred_lft forever
9: sit: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1472 qdisc noqueue state UNKNOWN
link/sit .. snipped .. peer 1.2.3.4
inet6 2001:db8:aa:b::cccc:8001/120 scope global
valid_lft forever preferred_lft forever
inet6 fe80::dafb:71de/128 scope link
valid_lft forever preferred_lft forever
::1.2.3.4 dev sit metric 1024
2001:db8:aa:b::cccc:8000/120 dev sit proto kernel metric 256
2001:db8:aa::/48 dev eth0 proto kernel metric 256
fe80::/64 dev eth0 proto kernel metric 256
default via 2001:db8:aa::1 dev eth0 metric 1024
Эта установка в корне нарушена. Вам понадобится множество хаков, таких как статические маршруты, прокси-NDP и т. Д., Чтобы заставить его работать. Здесь нет красивых решений ...
Теперь как это должен сделать это: