KVM 가상 머신에서 특정 HTTPS 웹사이트를 로드할 수 없고 IPv6를 통해서만 로드할 수 있기 때문에 이것이 나를 미치게 만듭니다. IPv4는 잘 작동합니다. IPv6 연결은 하이퍼바이저의 동일한 웹사이트에 대해 작동합니다.
내 설정
- KVM 하이퍼바이저는 다음에서 실행됩니다.우분투 14.04.5 LTS.
- 이더넷 0에 추가되다br0브리지 인터페이스, 이 브리지를 사용하여 가상 머신을 외부 세계에 연결합니다.
- 두 개의 가상 머신이 하이퍼바이저에서 실행됩니다. 첫 번째가 실행 중입니다.우분투12.04(EOL에 도달했다는 것을 알고 있지만 그것은 중요하지 않습니다.) 두 번째는우분투16.04.두 개의 가상 머신문제가 발생합니다.
- VM은 Virtio 인터페이스를 사용하여 네트워크에 연결합니다.
- IPv6 주소는 하이퍼바이저와 가상 머신에 의해 획득됩니다.
- 내 DNS 서버는 도메인이 지원하는 경우 IPv6 주소를 반환하고, 그렇지 않으면 IPv4에서 작동합니다.
하이퍼바이저나 VM 모두 IPv6용 방화벽(ip6tables)이 없습니다.
# ip6tables -v -L -n Chain INPUT (policy ACCEPT 196K packets, 32M bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 5007K packets, 3858M bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 185K packets, 30M bytes) pkts bytes target prot opt in out source destination # ip6tables -v -L -n -t nat Chain PREROUTING (policy ACCEPT 1749 packets, 181K bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 135 packets, 24165 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 187 packets, 27578 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 1801 packets, 185K bytes) pkts bytes target prot opt in out source destination
질문
IPv6(및 IPv4) 연결은 하이퍼바이저의 모든 웹사이트에서 작동합니다(양호하고 예상됨).
# wget https://lwn.net -O - > /dev/null; echo Exit code: $? --2017-08-02 18:55:47-- https://lwn.net/ Resolving lwn.net (lwn.net)... 2600:3c03::f03c:91ff:fe61:5c5b, 45.33.94.129 Connecting to lwn.net (lwn.net)|2600:3c03::f03c:91ff:fe61:5c5b|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 25202 (25K) [text/html] Saving to: ‘STDOUT’ 100%[=====================================>] 25,202 149KB/s in 0.2s 2017-08-02 18:55:48 (149 KB/s) - written to stdout [25202/25202] Exit code: 0
IPv6 연결은 VM 내부에서 시도한 대부분의 웹 사이트에서 작동하지만 전부는 아닙니다. 예를 들어,https://lwn.net그리고https://hioa.no두 개의 https 웹사이트를 사용하는 데 문제가 있습니다. 아래 wget 명령에서 볼 수 있듯이 연결이 도착했습니다.연결됨상태이지만 거기에 붙어 있습니다.
# wget https://lwn.net -O - > /dev/null; echo Exit code: $? --2017-08-02 18:53:40-- https://lwn.net/ Resolving lwn.net (lwn.net)... 2600:3c03::f03c:91ff:fe61:5c5b, 45.33.94.129 Connecting to lwn.net (lwn.net)|2600:3c03::f03c:91ff:fe61:5c5b|:443... connected.
지금까지 나는 문제를 해결하려고 노력했다.
ping6으로 시작하세요. 흥미롭게도 IPv6를 사용할 때 가상 머신의 핑은 모든 도메인에서 작동합니다! https를 포함하면 작동하지 않습니다.
# ping6 -c 1 -n hioa.no PING hioa.no(2001:700:700:2::65) 56 data bytes 64 bytes from 2001:700:700:2::65: icmp_seq=1 ttl=53 time=88.7 ms # ping6 -c 1 -n lwn.net PING lwn.net(2600:3c03::f03c:91ff:fe61:5c5b) 56 data bytes 64 bytes from 2600:3c03::f03c:91ff:fe61:5c5b: icmp_seq=1 ttl=54 time=145 ms
가상 네트워크 장치를 변경해 보았습니다.가상 기기도착하다e1000. 문제는 여전히 존재합니다.
IPv4를 사용하여 웹사이트에 연결하려고 하는데 문제가 있습니다.
# dig A lwn.net ; <<>> DiG 9.10.3-P4-Ubuntu <<>> A lwn.net ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41423 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;lwn.net. IN A ;; ANSWER SECTION: lwn.net. 2633 IN A 45.33.94.129
IPv4 연결이 제대로 작동합니다!
# wget --no-check-certificate https://45.33.94.129 -O - > /dev/null; echo Exit code: $? --2017-08-02 18:41:32-- https://45.33.94.129/ Connecting to 45.33.94.129:443... connected. WARNING: certificate common name `*.lwn.net' doesn't match requested host name `45.33.94.129'. HTTP request sent, awaiting response... 200 OK Length: 25226 (25K) [text/html] Saving to: `STDOUT' 100%[==================================>] 25,226 137K/s in 0.2s 2017-08-02 18:41:33 (137 KB/s) - written to stdout [25226/25226] Exit code: 0
"openssl s_client"를 사용하여 연결을 시도하고 오류 메시지가 나타나는지 확인하십시오. 그러나 "openssl s_client"는 아직 IPv6를 지원하지 않습니다(적어도 Ubuntu 16.04에 포함된 openssl 버전에서는 지원하지 않음).
확인됨정보그리고/var/log/시스템 로그하지만 거기에는 관련이 없습니다.
특정 사이트에서 왜 이런 이상한 동작이 나타나는지 아는 사람이 있나요? 다음에 조사해야 할 사항에 대한 조언이 있습니까?
답변1
가상 머신의 MTU를 1492로 줄여 문제가 해결되었습니다. 하이퍼바이저는 인터넷에 대한 PPPoE 연결 설정을 담당하며 ppp0 인터페이스의 MTU는 1492바이트입니다.
IPv4와 IPv6 모두 경로 MTU 검색을 구현하는데 MTU가 문제가 되는 이유는 무엇입니까? 그렇다면 이 경우 경로 MTU 검색이 작동하지 않는 이유는 무엇입니까(일부 IPv6 대상에만 해당)?
만난 것 같아요블랙홀여기 상황.
Wireshark를 사용하여 일부 트래픽을 캡처 tcpdump
하고 파일을 로드했습니다. 첨부된 그림(패킷 1-3)과 같이 TCP 3방향 핸드셰이크를 통해 연결이 이루어지는 것을 관찰했습니다. 이것은 내 질문의 출력에서도 분명합니다 . 메시지를 인쇄한 후 wget이 멈추는 wget
것을 볼 수 있습니다 . connected
3방향 핸드셰이크가 성공한 후 클라이언트(내 가상 머신)는 SSL을 보냅니다."안녕하세요 고객님"메시지를 받았지만 받지 못했습니다."안녕하세요 서버"물러서세요. 클라이언트가 수신하는 것은 TCP 시퀀스 번호를 기반으로 분명히 순서가 잘못된 패킷입니다(wireshark도 보고함).[TCP 마지막 세그먼트가 캡처되지 않음], 연속 데이터). 그런 다음 클라이언트는 수신한 마지막 주문 패킷(중복 ACK)에 대해 ACK(패킷 6)로 응답하고 서버가 패킷을 재전송하려고 시도하면서 연결이 중지됩니다.패킷 손실지원되는 MTU보다 크므로 도달할 수 없습니다. 따라서 Ctrl+를 눌러 C연결 종료(패킷 8-10)를 시작할 때까지 연결이 중단됩니다 .
그렇다면 경로 MTU 검색이 일부 IPv6 대상(전부는 아님)에서만 작동할 뿐만 아니라 IPv4에서는 전혀 문제가 없는 이유는 무엇입니까? 이 질문의 경우, 내 설치에는 IPv6 방화벽이 없기 때문에 특정 웹사이트로 가는 도중 방화벽이 차단되어 있는 것으로 가정합니다.ICMPv6 패킷이 너무 큼 메시지경로 MTU 검색이 작동하는 데 필요합니다. 흥미롭게도 간단한 ICMPv6 핑 패킷이 통과하고 응답을 받기도 합니다.