NGINX SSL ไม่ตอบสนองผ่าน IPv6


10

บนเซิร์ฟเวอร์ Debian ที่มี nginx ฉันไม่ได้รับการตอบกลับจากเว็บเซิร์ฟเวอร์ผ่าน HTTPS และ IPv6 HTTP ใช้งานได้ดี

  • netstat รายงานพอร์ต 443 ที่ฟังที่อยู่ IPv6
  • ไฟร์วอลล์เปิดอยู่ ipv6scanner.com รายงานพอร์ต 443 ที่เปิดอยู่
  • ภายใน (ผ่านเทอร์มินัล) wget และ curl ได้รับการตอบสนองที่ถูกต้องดังนั้นการกำหนดค่า nginx ก็โอเค
  • ไม่มีสัญญาณของข้อผิดพลาดจาก nginx error.log
  • ไม่มีการบันทึกใน access.log เมื่อล้มเหลวดังนั้นการสื่อสารอาจไม่ถึงเว็บเซิร์ฟเวอร์
  • DNS ไม่เป็นไร การแปลใช้งานได้และการเชื่อมต่อไม่ทำงานแม้จะเข้าถึงที่อยู่ IP โดยตรง

ทุกความพยายามในการเชื่อมต่อจาก "ภายนอก" (หมายถึงนอกเครือข่ายจากอินเทอร์เน็ต) ล้มเหลว (เว็บเบราว์เซอร์, telnet, ipv6-test.com, curl ... ) ไม่มีการตอบสนองเลย

สามารถทดสอบได้ที่ www.ekasparova.eu ฉันไร้เดียงสา ฉันจะตรวจสอบอะไรอีก

แก้ไข:

ผลลัพธ์ของtraceroute6 --mtu www.google.comจะเป็นดังนี้:

traceroute to www.google.com (2a00:1450:4014:800::2004), 30 hops max, 65000 byte packets
1  * F=1500 * *
2  * * *
~
30  * * *

ดังนั้นมันจะไม่ถึงจุดสิ้นสุด ...

edit2:

เอาท์พุท ip6tables- บันทึกของฉัน (ไฟร์วอลล์ท้องถิ่น):

# 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

edit3:

ขอบคุณทุกคนที่ช่วยฉันทำให้ฉันสามารถโน้มน้าวใจผู้ให้บริการดาต้าเซ็นเตอร์ว่าปัญหาอยู่ในโครงสร้างพื้นฐานของพวกเขา ปัญหาคือการตั้งค่า MTU บนเราเตอร์เสมือนจริงในเส้นทางสู่อินเทอร์เน็ต


Outside = นอกเครือข่ายในส่วน LAN แยกต่างหากหรือจากคอมพิวเตอร์ที่อยู่ในส่วน LAN เดียวกันหรือไม่
IceMage

1
@IceMage Outside หมายถึงจากอินเทอร์เน็ต นอกเครือข่าย ฉันจะแก้ไขคำถามเพื่อชี้แจง
j.kaspar

คุณกำหนดค่าไฟร์วอลล์บนเซิร์ฟเวอร์แล้วหรือยัง หากเซิร์ฟเวอร์กำลังใช้งาน Linux ผลลัพธ์ที่ได้ip6table-saveก็น่าจะเกี่ยวข้องกัน
kasperd

@kasperd ฉันเพิ่มกฎที่เกี่ยวข้องกับ icmp ทั้งหมดลงในคำถาม
j.kaspar

@ j.kaspar มันเป็นผลลัพธ์ของip6tables-saveฉันอยากเห็น คำสั่งนั้นจะส่งออกกฎที่สมบูรณ์
kasperd

คำตอบ:


19

คุณมีปัญหาเกี่ยวกับ MTU

ผมทดสอบในขณะที่สังเกตการจราจรด้วยwget -O /dev/null https://www.ekasparova.eu tcpdumpนี่คือสิ่งที่ฉันเห็น:

19:56:57.048361 IP6 2001:db8::1.47386 > 2a04:f310:100:3:f816:3eff:fea3:4553.443: Flags [S], seq 262121609, win 28800, options [mss 1440,sackOK,TS val 298423713 ecr 0,nop,wscale 7], length 0
19:56:57.087457 IP6 2a04:f310:100:3:f816:3eff:fea3:4553.443 > 2001:db8::1.47386: Flags [S.], seq 2396216876, ack 262121610, win 28560, options [mss 1440,sackOK,TS val 82836580 ecr 298423713,nop,wscale 7], length 0
19:56:57.087490 IP6 2001:db8::1.47386 > 2a04:f310:100:3:f816:3eff:fea3:4553.443: Flags [.], ack 1, win 225, options [nop,nop,TS val 298423723 ecr 82836580], length 0
19:56:57.087692 IP6 2001:db8::1.47386 > 2a04:f310:100:3:f816:3eff:fea3:4553.443: Flags [P.], seq 1:322, ack 1, win 225, options [nop,nop,TS val 298423723 ecr 82836580], length 321
19:56:57.126190 IP6 2a04:f310:100:3:f816:3eff:fea3:4553.443 > 2001:db8::1.47386: Flags [.], ack 322, win 232, options [nop,nop,TS val 82836590 ecr 298423723], length 0
19:56:57.141224 IP6 2a04:f310:100:3:f816:3eff:fea3:4553.443 > 2001:db8::1.47386: Flags [P.], seq 2857:3678, ack 322, win 232, options [nop,nop,TS val 82836594 ecr 298423723], length 821
19:56:57.141301 IP6 2001:db8::1.47386 > 2a04:f310:100:3:f816:3eff:fea3:4553.443: Flags [.], ack 1, win 248, options [nop,nop,TS val 298423736 ecr 82836590,nop,nop,sack 1 {2857:3678}], length 0

3 ซองแรกคือการจับมือกัน ปลายทั้งสองประกาศmss 1440ซึ่งหมายความว่าพวกเขามีความสามารถในการรับแพ็คเก็ตที่มี 1440 ไบต์ของส่วนของข้อมูล TCP นับส่วนหัวเช่นกันรวมถึง 1500 ไบต์ของการรับส่งข้อมูล IP ซึ่งเป็นสิ่งที่ Ethernet ทั่วไปสนับสนุน

อีก 2 แพ็กเก็ตถัดไปคือไคลเอนต์สวัสดีและการตอบรับที่เซิร์ฟเวอร์ได้รับ

แพ็กเก็ต 2 ชุดสุดท้ายคือสิ่งที่น่าสนใจ โดยค่าเริ่มต้นtcpdumpจะแสดงหมายเลขลำดับสัมพัทธ์ซึ่งในกรณีนี้ทำให้การอ่านง่ายขึ้น seq 2857:3678ในแพ็คเก็ตจากเซิร์ฟเวอร์นี้เป็นส่วนที่น่าสนใจ เราเห็นการกระโดดจาก1ไปสู่2857ซึ่งหมายความว่ามีช่องว่าง 2856 ไบต์ซึ่งลูกค้ายังไม่ได้รับ 2856 ไบต์สอดคล้องกับสองแพ็คเก็ตของ 1428 ไบต์ ความแตกต่างระหว่าง 1440 ถึง 1428 คือขนาดของตัวเลือกการประทับเวลา

ดังนั้นเซิร์ฟเวอร์จึงส่งเซิร์ฟเวอร์สวัสดีแยกออกเป็น 3 แพ็กเก็ต แต่สองรายการแรกนั้นใหญ่เกินไปสำหรับเครือข่ายและไม่ได้ส่งมอบให้กับลูกค้า

sack 1 {2857:3678}ในแพ็คเก็ตสุดท้ายจากลูกค้าไปยังเซิร์ฟเวอร์ที่เราเห็นนี้ นี่คือการตอบรับแบบเลือกที่ส่งโดยไคลเอนต์แจ้งเซิร์ฟเวอร์ว่ามีช่องว่างในข้อมูลที่ได้รับมาจนถึงตอนนี้

มีแนวโน้มว่าเซิร์ฟเวอร์จะส่งแพ็คเก็ตที่สูญหายไปสองแพ็กเก็ตซ้ำแล้วซ้ำอีก แต่ไม่ว่ากี่ครั้งที่มันส่งผ่านสองแพ็กเก็ตเดียวกันพวกเขายังคงมีขนาดใหญ่เกินไปสำหรับเครือข่าย และเราเตอร์บนเส้นทางอาจส่งข้อความแสดงข้อผิดพลาดกลับไปที่เซิร์ฟเวอร์เพื่อแจ้งให้ทราบว่าแพ็กเก็ตมีขนาดใหญ่เกินไปและจำเป็นต้องส่งซ้ำในแพ็กเก็ตขนาดเล็ก

หากเซิร์ฟเวอร์ได้รับข้อความแสดงข้อผิดพลาดเหล่านั้นก็จะส่งแพ็กเก็ตใหม่ให้เล็กลงตามต้องการ และมันจะจำ PMTU ขนาดเล็กลงเช่นนั้นในคำขอถัดไปมันไม่จำเป็นต้องทำซ้ำขั้นตอนการค้นพบนี้

คำอธิบายที่เป็นไปได้สำหรับสิ่งนี้คือคุณมีไฟร์วอลล์ที่กำหนดค่าผิดพลาดซึ่งจะทำให้ข้อความแจ้งข้อผิดพลาดทั้งหมดแจ้งเซิร์ฟเวอร์ของคุณว่าจำเป็นต้องส่งข้อมูลซ้ำในแพ็กเก็ตขนาดเล็ก


1
น่าสนใจ ขอบคุณ! ข้อความแสดงข้อผิดพลาด - ฉันเดาว่าเป็นโปรโตคอล ICMP ... มีวิธีทดสอบไหม ไฟร์วอลล์บนเซิร์ฟเวอร์และไฟร์วอลล์ระหว่างเซิร์ฟเวอร์และอินเทอร์เน็ตควรเปิดสำหรับการสื่อสาร ICMP ทั้งหมด
j.kaspar

@ j.kaspar ไฟร์วอลล์คืออะไร พวกเขาจะกำหนดค่าอย่างไร คุณทดสอบพวกเขาอย่างไร
Michael Hampton

@MichaelHampton มีการติดตั้งไฟร์วอลล์ iptables โดยตรงบนเซิร์ฟเวอร์ อันที่สองเป็นของดาต้าเซ็นเตอร์และฉันสามารถจัดการกฎของมันได้ ฉันไม่รู้วิธีทดสอบ ICMP จริงๆ แต่กฎของทั้งคู่จะถูกตั้งค่าเป็น <-> ทุกที่ที่อนุญาตสำหรับ ICMP
j.kaspar

1
@ j.kaspar บนเซิร์ฟเวอร์ Linux ลองtraceroute6 --mtu www.google.comและมองหาF=####แทรกลงในบรรทัดเอาต์พุตหรือบรรทัดเอาต์พุตที่ไม่มีการตอบกลับมาเลย ในความคิดที่สองเพียงแค่เรียกใช้และแก้ไขคำถามของคุณด้วยผลลัพธ์
Michael Hampton

@MichaelHampton เสร็จสิ้น อย่างไรก็ตามฉันไม่แน่ใจว่าจะตีความผลลัพธ์อย่างไร นั่นหมายความว่าการสื่อสารไม่ผ่านการกระโดดครั้งที่สองเลยหรือ
j.kaspar

1

ฉันเห็นด้วยกับ @kasperd ว่าเป็นปัญหาของ MTU ตัวอย่างเช่นโดยค่าเริ่มต้นwget -6 -O/dev/null http://www.ekasparova.euจะไม่ทำงาน (มันจะได้รับการเปลี่ยนเส้นทางสั้น ๆ ไปยังhttps://www.babysoul.cz/IP เดียวกัน จากนั้นฉันบังคับให้ MSS ลดลงสำหรับโฮสต์ของคุณ:

ip -6 ro add 2a04:f310:100:3:f816:3eff:fea3:4553 advmss 1000 via $MY_GW

และหลังจากนั้นใช้wgetงานได้ตามปกติ ดังนั้นจึงเป็นปัญหาของ MTU การเปรียบเทียบผลลัพธ์ของmtr -6 -n --psize 1410 www.ekasparova.eu(ซึ่งใช้งานได้) กับmtr -6 -n --psize 1411 www.ekasparova.euจะระบุว่าปัญหานั้นเกิดขึ้นที่โฮสต์ของคุณ 2a04:f310:100:3:f816:3eff:fea3:4553หรือที่ต้นน้ำ2a04:f310:100::125

สิ่งที่คุณสามารถทำได้เพื่อแก้ไขปัญหา (นอกเหนือจากการติดต่อต้นน้ำของคุณ):

ทดสอบขนาดแพ็คเก็ตที่แตก (เช่นwget -6 -O/dev/null http://v6.testmyipv6.com/MTUtest/1500.datอาจจะไม่เหมาะกับคุณในขณะที่ควร แต่wget -6 -O/dev/null http://v6.testmyipv6.com/MTUtest/1000.datจะใช้ได้ดี) จากนั้น:

  • (แย่กว่า) หนีบ MSS ของคุณเพื่อหาเส้นทาง IPv6 ที่เป็นค่าเริ่มต้น โปรดทราบว่าจะทำงานสำหรับ TCP เท่านั้น ตัวอย่างเช่นแพ็คเก็ต UDP DNS จะยังคงเสียหายหรือ
  • (ดีกว่า) ลด MTU อินเตอร์เฟสของคุณ (ตัวอย่าง ifconfig eth0 mtu 1200) สิ่งนี้ควรใช้ได้กับทุกแพ็กเก็ต ปัญหาคือหากบางสิ่งในทางมี MTU ที่ต่ำกว่าคุณจะไม่สามารถสื่อสารกับพวกเขาได้ และการลด MTU จะส่งผลให้ประสิทธิภาพค่อนข้างต่ำ (ไม่ใช่เรื่องใหญ่ยกเว้นว่าคุณมักเป็นไซต์ใหญ่)
  • (ดีที่สุด) ลองใช้หากการลบไฟร์วอลล์ IPv6 (ของคุณและของคุณอยู่ด้านบน) ช่วยได้ และเมื่อคุณรู้ว่ามันเป็นเช่นนั้นพยายามที่จะนำมันกลับมารวมกันทีละขั้นตอนโดยไม่ทำลายการค้นพบ PMTU จนกว่าคุณจะพบบรรทัดที่มีปัญหา ปัญหาคือต้องมีการทำงานและความร่วมมือจาก ISP ของคุณมากขึ้น (และการเปิดไฟร์วอลล์อาจทำให้คุณเสี่ยงได้ในเวลานั้น)

การลด MSS บนเส้นทางเริ่มต้นไม่ใช่คำแนะนำที่ไม่ดี เป็นสิ่งที่ฉันได้ทำในสภาพแวดล้อมการผลิตเพื่อแก้ไขปัญหา MTU ในเครือข่ายของผู้อื่น ฉันไม่ได้ไปให้ต่ำกว่า 1,000 1220 มีขนาดเล็กพอที่จะเก็บแพ็คเก็ตเต็มรูปแบบภายใน 1280 ไบต์ซึ่ง IPv6 รับประกันว่าจะทำงานได้ตั้งแต่ต้นจนจบ อย่างไรก็ตามปัญหาในคำถามจะไม่ได้รับการบรรเทาโดยการลด MSS บนเส้นทางเริ่มต้นเนื่องจากมีผลกับขนาดแพ็คเก็ตในทิศทางเดียวเท่านั้น
kasperd

หนึ่งสามารถทำให้ MSS อยู่ในระหว่างการขนส่ง (น่าจะเป็นไปได้ที่จะทำip6tables) คุณไม่ควรทำเช่นนั้น แต่ปรากฎว่าการยึด MSS ในการขนส่งสูงสุด 1220 เป็นวิธีแก้ปัญหาที่มีประสิทธิภาพมากสำหรับปัญหา MTU และสามารถทำได้ที่จุดปลายหรือในระหว่างเราเตอร์และมันจะช่วยลดปัญหา MTU สำหรับ TCP ในทั้งสองทิศทาง
kasperd

การลด MTU ลงบนอุปกรณ์ปลายทางจะมีผลต่อ MSS ที่ส่งออกและจะ จำกัด แพ็คเก็ตที่คุณส่งแม้ว่าคุณจะได้รับ MSS ที่สูงขึ้น ดังนั้น MTU ที่ต่ำกว่าที่จุดปลายสามารถลดปัญหา MTU สำหรับ TCP ในทั้งสองทิศทาง อย่างไรก็ตามมันจะช่วยให้ UDP ในทิศทางเดียวเท่านั้น และการลด MTU บนเราเตอร์ในระหว่างนั้นสามารถลดปัญหา MTU หรือแนะนำปัญหา MTU ใหม่ขึ้นอยู่กับสถานการณ์ ดังนั้นการลด MSS จึงเป็นวิธีหนึ่งที่สามารถช่วยได้โดยไม่ต้องแนะนำปัญหา MTU ใหม่
kasperd

@kasperd ไม่ควรลด MSS ลงในด้านใดด้านหนึ่งสำหรับปริมาณข้อมูลที่ไหลในทั้งสองวิธีเนื่องจากมีการเจรจา (เป็น MSS ที่ต่ำกว่า) สำหรับเซสชัน TCP ทั้งหมดในระหว่างการจับมือ 3way หรือไม่ สำหรับการลด MTU และทำลาย UDP ขาเข้าในขณะที่เป็นจริงมันจะไม่แก้ปัญหา แต่ก็ไม่ควรสร้างปัญหาเพิ่มเติมเนื่องจาก UDP ที่มีขนาดใหญ่เกินไปนั้นจะไม่ทำงานอยู่ดี .
Matija Nalis

1
ไม่ MSS ถูกเจรจาอย่างอิสระสำหรับสองทิศทาง แต่ละฝ่ายรู้จำนวนสูงสุดที่พวกเขาเต็มใจที่จะส่งและแจ้งให้อีกฝ่ายทราบถึงจำนวนสูงสุดที่พวกเขาเต็มใจที่จะรับ เมื่อคุณตั้งค่าadvmssคุณจะมีผลกับขนาดของเซ็กเมนต์ที่คุณจะได้รับไม่ใช่เซ็กเมนต์ที่คุณกำลังจะส่ง จำนวนสูงสุดที่คุณยินดีส่งไม่ได้สื่อสารกัน - เพราะไม่จำเป็นต้องทำเช่นนั้น ทั้งสองได้รับค่าเริ่มต้นจาก MTU ซึ่งหนึ่งในสองสามารถแทนที่advmssได้ ฉันไม่ทราบวิธีสำหรับรายการการกำหนดเส้นทางเพื่อแทนที่รายการอื่น แต่ถ้ามีวิธีฉันต้องการเรียนรู้
kasperd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.