내 도커 컨테이너 중 하나는 호스트 포트 8500에 매핑되는 포트 8500에 HTTP 인터페이스를 노출합니다.아니요IPv6가 활성화되었습니다. 이는 여전히 localhost:8500에서 액세스할 수 있어야 함을 의미합니다. IPv6가 선호되므로 [::1]:8500에 요청하게 됩니다. 이것은 붙어서 다시는 돌아오지 않을 것입니다.
컬을 사용하여 이 명령을 복사하면 중단됩니다.
curl -g -6 "http://[::1]:8500"
컬의 --verbose 옵션은 아무것도 표시하지 않았고 --ascii-trace도 아무것도 표시하지 않았습니다. 동시에 IPv4 localhost에 대한 요청이 성공했습니다.
curl http://127.0.0.1:8500
나에게 예상되는 HTML을 제공합니다. 루프백에서 IPv4 HTTP 서버를 실행하는 경우 다음을 사용하십시오.
python -m SimpleHTTPServer 4001
그런 다음 IPv4 로컬 호스트에 대한 많은 HTML을 얻습니다.
curl http://127.1:4001
IPv6에 대한 올바른 연결 실패:
curl -g -6 "http://[::1]:4001"
curl: (7) Failed to connect to ::1 port 4001: Connection refused
참고 사항: Docker 1.7.1. IPv6 예아니요컨테이너에 대해 활성화되므로 IPv6 iptable 규칙이 없습니다. (ip6tables -v -L은 아무것도 제공하지 않습니다)
내 질문은: 요청이 중단된 이유는 무엇이며 어떻게 해야 합니까?
답변1
ipv6 및 ebable 전달을 활성화합니다.
# cat /etc/sysctl.conf | grep ipv6
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.disable_ipv6=0
net.ipv6.conf.default.disable_ipv6=0
답변2
IPV6 전달이 활성화되지 않으면 패킷이 삭제됩니다. 따라서 컬은 서버의 응답을 계속 기다리지만 실제로는 아무것도 얻지 못합니다. 일정 시간이 지나면 시간 초과가 발생합니다.
방화벽을 설정하여 이를 복제할 수 있습니다.극세사 묶음. 방화벽을 사용하여 특정 포트에 대한 액세스를 차단한 다음 해당 포트에 액세스하려고 하면 컬은 시간이 초과될 때까지 기다립니다. 게다가 IP 버전은 이와 특별히 관련이 없습니다.