Na serwerze Debian z nginx nie otrzymuję odpowiedzi z serwera WWW przez HTTPS i IPv6. HTTP działa dobrze.
- netstat zgłasza, że port 443 nasłuchuje na adresie IPv6
- zapora jest otwarta, ipv6scanner.com informuje, że port 443 jest otwarty
- lokalnie (przez terminal) wget i curl otrzymują poprawną odpowiedź, więc konfiguracja nginx jest OK
- brak oznak błędu z nginx error.log
- brak zapisu w access.log, gdy się nie powiedzie, więc komunikacja prawdopodobnie nie dociera do serwera WWW
- DNS jest w porządku. Tłumaczenie działa, a połączenie nie działa, nawet jeśli adres IP jest dostępny bezpośrednio
Każda próba połączenia z „zewnętrznego” (czyli poza siecią, z Internetu) kończy się niepowodzeniem (przeglądarka internetowa, telnet, ipv6-test.com, curl ...). W ogóle nie ma odpowiedzi.
Można to przetestować na stronie www.ekasparova.eu. Nie mam pojęcia. Co jeszcze mogę sprawdzić?
edytować:
wynik traceroute6 --mtu www.google.com
jest następujący:
traceroute to www.google.com (2a00:1450:4014:800::2004), 30 hops max, 65000 byte packets
1 * F=1500 * *
2 * * *
~
30 * * *
Więc nigdy nie osiąga końca ...
edycja2:
Moje wyjście ip6tables-save (lokalna zapora ogniowa):
# Generated by ip6tables-save v1.6.0 on Wed Oct 17 06:25:40 2018
*filter
:INPUT DROP [32:9320]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:ufw6-after-forward - [0:0]
:ufw6-after-input - [0:0]
:ufw6-after-logging-forward - [0:0]
:ufw6-after-logging-input - [0:0]
:ufw6-after-logging-output - [0:0]
:ufw6-after-output - [0:0]
:ufw6-before-forward - [0:0]
:ufw6-before-input - [0:0]
:ufw6-before-logging-forward - [0:0]
:ufw6-before-logging-input - [0:0]
:ufw6-before-logging-output - [0:0]
:ufw6-before-output - [0:0]
:ufw6-logging-allow - [0:0]
:ufw6-logging-deny - [0:0]
:ufw6-reject-forward - [0:0]
:ufw6-reject-input - [0:0]
:ufw6-reject-output - [0:0]
:ufw6-skip-to-policy-forward - [0:0]
:ufw6-skip-to-policy-input - [0:0]
:ufw6-skip-to-policy-output - [0:0]
:ufw6-track-forward - [0:0]
:ufw6-track-input - [0:0]
:ufw6-track-output - [0:0]
:ufw6-user-forward - [0:0]
:ufw6-user-input - [0:0]
:ufw6-user-limit - [0:0]
:ufw6-user-limit-accept - [0:0]
:ufw6-user-logging-forward - [0:0]
:ufw6-user-logging-input - [0:0]
:ufw6-user-logging-output - [0:0]
:ufw6-user-output - [0:0]
-A INPUT -j ufw6-before-logging-input
-A INPUT -j ufw6-before-input
-A INPUT -j ufw6-after-input
-A INPUT -j ufw6-after-logging-input
-A INPUT -j ufw6-reject-input
-A INPUT -j ufw6-track-input
-A INPUT -j LOG --log-prefix "[IPTABLES] " --log-tcp-options
-A INPUT -j LOG --log-prefix "[IPTABLES] " --log-tcp-options
-A FORWARD -j ufw6-before-logging-forward
-A FORWARD -j ufw6-before-forward
-A FORWARD -j ufw6-after-forward
-A FORWARD -j ufw6-after-logging-forward
-A FORWARD -j ufw6-reject-forward
-A FORWARD -j ufw6-track-forward
-A FORWARD -j LOG --log-prefix "[IPTABLES] " --log-tcp-options
-A FORWARD -j LOG --log-prefix "[IPTABLES] " --log-tcp-options
-A OUTPUT -j ufw6-before-logging-output
-A OUTPUT -j ufw6-before-output
-A OUTPUT -j ufw6-after-output
-A OUTPUT -j ufw6-after-logging-output
-A OUTPUT -j ufw6-reject-output
-A OUTPUT -j ufw6-track-output
-A ufw6-after-input -p udp -m udp --dport 137 -j ufw6-skip-to-policy-input
-A ufw6-after-input -p udp -m udp --dport 138 -j ufw6-skip-to-policy-input
-A ufw6-after-input -p tcp -m tcp --dport 139 -j ufw6-skip-to-policy-input
-A ufw6-after-input -p tcp -m tcp --dport 445 -j ufw6-skip-to-policy-input
-A ufw6-after-input -p udp -m udp --dport 546 -j ufw6-skip-to-policy-input
-A ufw6-after-input -p udp -m udp --dport 547 -j ufw6-skip-to-policy-input
-A ufw6-after-logging-forward -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW BLOCK] "
-A ufw6-after-logging-input -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW BLOCK] "
-A ufw6-before-forward -m rt --rt-type 0 -j DROP
-A ufw6-before-forward -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw6-before-forward -p ipv6-icmp -m icmp6 --icmpv6-type 1 -j ACCEPT
-A ufw6-before-forward -p ipv6-icmp -m icmp6 --icmpv6-type 2 -j ACCEPT
-A ufw6-before-forward -p ipv6-icmp -m icmp6 --icmpv6-type 3 -j ACCEPT
-A ufw6-before-forward -p ipv6-icmp -m icmp6 --icmpv6-type 4 -j ACCEPT
-A ufw6-before-forward -p ipv6-icmp -m icmp6 --icmpv6-type 128 -j ACCEPT
-A ufw6-before-forward -p ipv6-icmp -m icmp6 --icmpv6-type 129 -j ACCEPT
-A ufw6-before-forward -j ufw6-user-forward
-A ufw6-before-input -i lo -j ACCEPT
-A ufw6-before-input -m rt --rt-type 0 -j DROP
-A ufw6-before-input -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw6-before-input -m conntrack --ctstate INVALID -j ufw6-logging-deny
-A ufw6-before-input -m conntrack --ctstate INVALID -j DROP
-A ufw6-before-input -p ipv6-icmp -m icmp6 --icmpv6-type 1 -j ACCEPT
-A ufw6-before-input -p ipv6-icmp -m icmp6 --icmpv6-type 2 -j ACCEPT
-A ufw6-before-input -p ipv6-icmp -m icmp6 --icmpv6-type 3 -j ACCEPT
-A ufw6-before-input -p ipv6-icmp -m icmp6 --icmpv6-type 4 -j ACCEPT
-A ufw6-before-input -p ipv6-icmp -m icmp6 --icmpv6-type 128 -j ACCEPT
-A ufw6-before-input -p ipv6-icmp -m icmp6 --icmpv6-type 129 -j ACCEPT
-A ufw6-before-input -p ipv6-icmp -m icmp6 --icmpv6-type 133 -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-input -p ipv6-icmp -m icmp6 --icmpv6-type 134 -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-input -p ipv6-icmp -m icmp6 --icmpv6-type 135 -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-input -p ipv6-icmp -m icmp6 --icmpv6-type 136 -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-input -p ipv6-icmp -m icmp6 --icmpv6-type 141 -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-input -p ipv6-icmp -m icmp6 --icmpv6-type 142 -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-input -s fe80::/10 -p ipv6-icmp -m icmp6 --icmpv6-type 130 -j ACCEPT
-A ufw6-before-input -s fe80::/10 -p ipv6-icmp -m icmp6 --icmpv6-type 131 -j ACCEPT
-A ufw6-before-input -s fe80::/10 -p ipv6-icmp -m icmp6 --icmpv6-type 132 -j ACCEPT
-A ufw6-before-input -s fe80::/10 -p ipv6-icmp -m icmp6 --icmpv6-type 143 -j ACCEPT
-A ufw6-before-input -p ipv6-icmp -m icmp6 --icmpv6-type 148 -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-input -p ipv6-icmp -m icmp6 --icmpv6-type 149 -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-input -s fe80::/10 -p ipv6-icmp -m icmp6 --icmpv6-type 151 -m hl --hl-eq 1 -j ACCEPT
-A ufw6-before-input -s fe80::/10 -p ipv6-icmp -m icmp6 --icmpv6-type 152 -m hl --hl-eq 1 -j ACCEPT
-A ufw6-before-input -s fe80::/10 -p ipv6-icmp -m icmp6 --icmpv6-type 153 -m hl --hl-eq 1 -j ACCEPT
-A ufw6-before-input -p ipv6-icmp -m icmp6 --icmpv6-type 144 -j ACCEPT
-A ufw6-before-input -p ipv6-icmp -m icmp6 --icmpv6-type 145 -j ACCEPT
-A ufw6-before-input -p ipv6-icmp -m icmp6 --icmpv6-type 146 -j ACCEPT
-A ufw6-before-input -p ipv6-icmp -m icmp6 --icmpv6-type 147 -j ACCEPT
-A ufw6-before-input -s fe80::/10 -d fe80::/10 -p udp -m udp --sport 547 --dport 546 -j ACCEPT
-A ufw6-before-input -d ff02::fb/128 -p udp -m udp --dport 5353 -j ACCEPT
-A ufw6-before-input -d ff02::f/128 -p udp -m udp --dport 1900 -j ACCEPT
-A ufw6-before-input -j ufw6-user-input
-A ufw6-before-output -o lo -j ACCEPT
-A ufw6-before-output -m rt --rt-type 0 -j DROP
-A ufw6-before-output -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw6-before-output -p ipv6-icmp -m icmp6 --icmpv6-type 1 -j ACCEPT
-A ufw6-before-output -p ipv6-icmp -m icmp6 --icmpv6-type 2 -j ACCEPT
-A ufw6-before-output -p ipv6-icmp -m icmp6 --icmpv6-type 3 -j ACCEPT
-A ufw6-before-output -p ipv6-icmp -m icmp6 --icmpv6-type 4 -j ACCEPT
-A ufw6-before-output -p ipv6-icmp -m icmp6 --icmpv6-type 128 -j ACCEPT
-A ufw6-before-output -p ipv6-icmp -m icmp6 --icmpv6-type 129 -j ACCEPT
-A ufw6-before-output -p ipv6-icmp -m icmp6 --icmpv6-type 133 -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-output -p ipv6-icmp -m icmp6 --icmpv6-type 136 -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-output -p ipv6-icmp -m icmp6 --icmpv6-type 135 -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-output -p ipv6-icmp -m icmp6 --icmpv6-type 134 -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-output -p ipv6-icmp -m icmp6 --icmpv6-type 141 -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-output -p ipv6-icmp -m icmp6 --icmpv6-type 142 -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-output -s fe80::/10 -p ipv6-icmp -m icmp6 --icmpv6-type 130 -j ACCEPT
-A ufw6-before-output -s fe80::/10 -p ipv6-icmp -m icmp6 --icmpv6-type 131 -j ACCEPT
-A ufw6-before-output -s fe80::/10 -p ipv6-icmp -m icmp6 --icmpv6-type 132 -j ACCEPT
-A ufw6-before-output -s fe80::/10 -p ipv6-icmp -m icmp6 --icmpv6-type 143 -j ACCEPT
-A ufw6-before-output -p ipv6-icmp -m icmp6 --icmpv6-type 148 -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-output -p ipv6-icmp -m icmp6 --icmpv6-type 149 -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-output -s fe80::/10 -p ipv6-icmp -m icmp6 --icmpv6-type 151 -m hl --hl-eq 1 -j ACCEPT
-A ufw6-before-output -s fe80::/10 -p ipv6-icmp -m icmp6 --icmpv6-type 152 -m hl --hl-eq 1 -j ACCEPT
-A ufw6-before-output -s fe80::/10 -p ipv6-icmp -m icmp6 --icmpv6-type 153 -m hl --hl-eq 1 -j ACCEPT
-A ufw6-before-output -j ufw6-user-output
-A ufw6-logging-allow -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW ALLOW] "
-A ufw6-logging-deny -m conntrack --ctstate INVALID -m limit --limit 3/min --limit-burst 10 -j RETURN
-A ufw6-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW BLOCK] "
-A ufw6-skip-to-policy-forward -j DROP
-A ufw6-skip-to-policy-input -j DROP
-A ufw6-skip-to-policy-output -j ACCEPT
-A ufw6-track-output -p tcp -m conntrack --ctstate NEW -j ACCEPT
-A ufw6-track-output -p udp -m conntrack --ctstate NEW -j ACCEPT
-A ufw6-user-input -p tcp -m tcp --dport 20 -j ACCEPT
-A ufw6-user-input -p tcp -m tcp --dport 21 -j ACCEPT
-A ufw6-user-input -p tcp -m tcp --dport 25 -j ACCEPT
-A ufw6-user-input -p tcp -m tcp --dport 53 -j ACCEPT
-A ufw6-user-input -p tcp -m tcp --dport 80 -j ACCEPT
-A ufw6-user-input -p tcp -m tcp --dport 110 -j ACCEPT
-A ufw6-user-input -p tcp -m tcp --dport 143 -j ACCEPT
-A ufw6-user-input -p tcp -m tcp --dport 587 -j ACCEPT
-A ufw6-user-input -p tcp -m tcp --dport 993 -j ACCEPT
-A ufw6-user-input -p tcp -m tcp --dport 995 -j ACCEPT
-A ufw6-user-input -p tcp -m tcp --dport 8080 -j ACCEPT
-A ufw6-user-input -p tcp -m tcp --dport 8081 -j ACCEPT
-A ufw6-user-input -p tcp -m tcp --dport 10000 -j ACCEPT
-A ufw6-user-input -p udp -m udp --dport 53 -j ACCEPT
-A ufw6-user-input -p tcp -m multiport --dports 29799:29899 -j ACCEPT
-A ufw6-user-input -p udp -m udp --dport 25 -j ACCEPT
-A ufw6-user-input -p tcp -m tcp --dport 8082 -j ACCEPT
-A ufw6-user-limit -m limit --limit 3/min -j LOG --log-prefix "[UFW LIMIT BLOCK] "
-A ufw6-user-limit -j REJECT --reject-with icmp6-port-unreachable
-A ufw6-user-limit-accept -j ACCEPT
COMMIT
# Completed on Wed Oct 17 06:25:40 2018
edycja3:
Dzięki pomocy wszystkich udało mi się przekonać operatora centrum danych, że problem tkwi w ich infrastrukturze. Problem naprawdę polegał na ustawieniu MTU na routerze wirtualnym na drodze do Internetu.
ip6table-save
będzie odpowiedni.ip6tables-save
które chciałem zobaczyć. To polecenie wyświetli pełne reguły.Odpowiedzi:
Masz problem z MTU.
Testowałem
wget -O /dev/null https://www.ekasparova.eu
podczas obserwacji ruchutcpdump
. Oto co zobaczyłem:Pierwsze 3 pakiety to uścisk dłoni. Oba końce ogłaszają,
mss 1440
co oznacza, że są w stanie odbierać pakiety z 1440 bajtami ładunku TCP, licząc również nagłówki, co łącznie daje 1500 bajtów ruchu IP, co zwykle obsługuje Ethernet.Następne 2 pakiety to hello klienta i potwierdzenie, że zostało odebrane przez serwer.
Ostatnie 2 pakiety są tam, gdzie robi się ciekawie. Domyślnie
tcpdump
pokazuje względne numery sekwencji, które w tym przypadku ułatwiają odczytanie. W pakiecie z serwera jest to interesująca częśćseq 2857:3678
. Widzimy skok od1
do2857
którego środek znajduje się szczelina 2856 bajtów której klient jeszcze nie otrzymują. 2856 bajtów odpowiada dwóm pakietom po 1428 bajtów. Różnica między 1440 a 1428 jest rozmiarem opcji znacznika czasu.Tak więc serwer wysłał serwer hello podzielony na 3 pakiety. Ale pierwsze dwa były za duże dla sieci i nie zostały dostarczone do klienta.
Widzimy to w końcowym pakiecie od klienta do serwera
sack 1 {2857:3678}
. Jest to selektywne potwierdzenie wysyłane przez klienta informujące serwer, że istnieje luka w danych, które otrzymał do tej pory.Prawdopodobnie serwer ciągle wysyła dwa utracone pakiety w kółko. Ale bez względu na to, ile razy retransmituje te same dwa pakiety, pozostają one zbyt duże dla sieci. I prawdopodobnie router na ścieżce wysyła komunikat o błędzie z powrotem do serwera, informując go, że pakiety są zbyt duże i muszą zostać ponownie przesłane w mniejszych pakietach.
Jeśli serwer otrzyma te komunikaty o błędach, w razie potrzeby retransmituje pakiety mniejsze. I pamięta mniejszą PMTU, tak że przy kolejnych żądaniach nie musi powtarzać tego kroku wykrywania.
Możliwym wyjaśnieniem tego wszystkiego jest to, że masz źle skonfigurowaną zaporę ogniową, która odrzuca wszystkie komunikaty o błędach informujące serwer, że musi ponownie przesłać dane w mniejszych pakietach.
źródło
traceroute6 --mtu www.google.com
poszukaćF=####
wstawionych do linii wyjściowych lub linii wyjściowych, w których nie ma odpowiedzi. Po zastanowieniu, po prostu uruchom go i edytuj swoje pytanie za pomocą wyniku.Zgadzam się z @kasperd, że jest to problem MTU. Na przykład domyślnie
wget -6 -O/dev/null http://www.ekasparova.eu
nie działałby (otrzyma krótkie przekierowanie do tegohttps://www.babysoul.cz/
samego adresu IP, ale zawiesi się na kolejnym większym pakiecie). Następnie zmniejszyłem MSS dla twojego hosta:a potem
wget
działa normalnie. To jest kwestia MTU. Porównanie danych wyjściowychmtr -6 -n --psize 1410 www.ekasparova.eu
(które działa)mtr -6 -n --psize 1411 www.ekasparova.eu
wskazuje, że problem występuje albo na twoim hoście,2a04:f310:100:3:f816:3eff:fea3:4553
albo w jego górnej części2a04:f310:100::125
Co możesz zrobić jako obejście (oprócz skontaktowania się z dostawcą):
Sprawdź, przy jakim rozmiarze pakietu się psuje (tzn.
wget -6 -O/dev/null http://v6.testmyipv6.com/MTUtest/1500.dat
Prawdopodobnie nie zadziała dla ciebie, kiedy powinno, alewget -6 -O/dev/null http://v6.testmyipv6.com/MTUtest/1000.dat
będzie dobrze), a następnie:ifconfig eth0 mtu 1200
). To powinno działać dla wszystkich pakietów. Problem polega na tym, że jeśli coś po drodze ma jeszcze niższy MTU, nie będziesz w stanie się z nimi komunikować. A obniżenie MTU spowoduje nieco niższą wydajność (nie jest to wielka sprawa, chyba że zazwyczaj jesteś dużą witryną)źródło
ip6tables
). Nie powinieneś tego robić, ale okazuje się, że zablokowanie MSS w tranzycie do maksymalnie 1220 jest bardzo skutecznym obejściem problemów MTU. Można to zrobić w punkcie końcowym lub dowolnym routerze między nimi, a to złagodzi problemy MTU dla TCP w obu kierunkach.advmss
wpływasz tylko na wielkość segmentów, które otrzymujesz, a nie na segmenty, które będziesz wysyłać. Maksymalna liczba osób, które chcesz wysłać, nie jest przekazywana - ponieważ nie ma takiej potrzeby. Obie wyprowadzają swoją wartość domyślną z MTU, jedną z dwóch można zastąpićadvmss
. Nie znam sposobu, aby wpis routingu zastąpił inny, ale jeśli istnieje sposób, chciałbym się nauczyć.