Назад | Перейти на главную страницу

ip6tables snat не работает должным образом

У меня есть три компьютера с такими именами: ноутбук, vds и домашний;

vds - сервер openvpn; home - это клиент openvpn. и я получил сеть ipv6 2a01: dead: beef :: / 64
vds имеет адрес 2a01:dead:beef::311 на tun0
у дома есть адрес 2a01:dead:beef::312 на tun0
у ноутбука есть адрес 2a01:beef:beef::666 на en3

Я хочу иметь доступ с ноутбука к дому через vds, поэтому я сделал thin на vds:
На vds я добавил дополнительный адрес 2a01:dead:beef::2ea и я сделал эти правила iptables:

ip6tables -t nat -A PREROUTING -i eth0 -d 2a01:dead:beef::2ea -j DNAT --to-destination 2a01:dead:beef::312
ip6tables -t nat -A POSTROUTING -s 2a01:dead:beef::312 -o tun0 -j SNAT --to-source 2a01:dead:beef::2ea 

Я изменил маршруты на vds:

vds:~/>ip -6 r
2a01:dead:beef::312 dev tun0  metric 1
2a01:dead:beef::/64 dev eth0  proto kernel  metric 256
2a01:dead:beef::/64 dev tun0  proto kernel  metric 256
fe80::/64 dev eth0  proto kernel  metric 256
default via 2a01:dead:beef::1 dev eth0  metric 1024

и в конфигурации сервера openvpn я добавил

push "route-ipv6 2000::/3"

так дома tun0 стал маршрутом ipv6 по умолчанию:

home:~/>ip -6 r
2a01:dead:beef::/64 dev tun0  proto kernel  metric 256
2000::/3 dev tun0  metric 1
fe80::/64 dev mlan0  proto kernel  metric 256
fe80::/64 dev eth11  proto kernel  metric 256
fe80::/64 dev tun0  proto kernel  metric 256

Теперь, если я пингую 2a01: dead: beef :: 2ea со своего ноутбука, DNAT и SNAT работают корректно, и я получаю пинг:

laptop:~/>ping6 2a01:dead:beef::2ea
PING6(56=40+8+8 bytes) 2a01:beef:beef::666 --> 2a01:dead:beef::2ea
16 bytes from 2a01:dead:beef::2ea, icmp_seq=0 hlim=55 time=108.618 ms
16 bytes from 2a01:dead:beef::2ea, icmp_seq=1 hlim=55 time=108.752 ms

Но если я пингую свой ноутбук из дома, я не получаю пинга:

home:~/>ping6 2a01:beef:beef::666
PING 2a01:beef:beef::666 (2a01:beef:beef:0:0:0:0:666) 56 data bytes
^C
--- 2a01:beef:beef::666 ping statistics ---
8 packets transmitted, 0 received, 100% packet loss, time 6999ms

Я запустил tcpdump на ноутбуке и вот что вижу:

laptop:~/>sudo /usr/sbin/tcpdump -i en3 -n -nn -ttt "ip6[40]=128 or ip6[40]=129"
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on en3, link-type EN10MB (Ethernet), capture size 65535 bytes
00:00:00.000000 IP6 2a01:dead:beef::312 > 2a01:beef:beef::666: ICMP6, echo request, seq 1, length 64
00:00:00.000050 IP6 2a01:beef:beef::666 > 2a01:dead:beef::312: ICMP6, echo reply, seq 1, length 64
00:00:00.999054 IP6 2a01:dead:beef::312 > 2a01:beef:beef::666: ICMP6, echo request, seq 2, length 64
00:00:00.000045 IP6 2a01:beef:beef::666 > 2a01:dead:beef::312: ICMP6, echo reply, seq 2, length 64
00:00:00.999858 IP6 2a01:dead:beef::312 > 2a01:beef:beef::666: ICMP6, echo request, seq 3, length 64
00:00:00.000038 IP6 2a01:beef:beef::666 > 2a01:dead:beef::312: ICMP6, echo reply, seq 3, length 64
00:00:00.999968 IP6 2a01:dead:beef::312 > 2a01:beef:beef::666: ICMP6, echo request, seq 4, length 64
00:00:00.000158 IP6 2a01:beef:beef::666 > 2a01:dead:beef::312: ICMP6, echo reply, seq 4, length 64

Итак, эхо-запросы поступают от 2a01:dead:beef::312 вместо 2a01:dead:beef::2ea, это означает, что на этот раз SNAT не изменяет адрес источника.

Ребята, подскажите пожалуйста, что я здесь делаю не так?

Я напортачил с правилом SNAT. Правильное правило

ip6tables -t nat -A POSTROUTING -s 2a01:230:2:6::312 -o eth0 -j SNAT --to-source 2a01:230:2:6::2ea

Я изменил исходящий интерфейс с tun0 к eth0 потому что я хочу сопоставить пакеты, идущие снаружи, а не внутри.

Я до сих пор не понимаю, как это может работать наполовину, пожалуйста, уточните этот ответ, если вы знаете, как.