커널 옵션으로 부팅된 Linux(Ubuntu Groovy) 서버가 있어서 ipv6.disable=1
IPv6를 사용할 수 없습니다.
또한 IPv4 전용 시스템에서 작동한다고 주장하는 일부 듀얼 스택 소프트웨어가 있는데 이를 변경할 수 없습니다. 이제 소프트웨어는 에 바인딩하려고 ::
하지만 당연히 실패합니다. 이 서버가 IPv4에 바인딩되어 사용되도록 운영 체제를 어떻게든 구성할 수 있습니까 0.0.0.0
?
편집: 또는 바인딩 전, 이름 확인 중에 이 작업을 수행할 수 있습니까? 소프트웨어는 구문 분석을 시도 ::
하고 응답으로 IPv4 주소를 얻으면 127.0.0.1
IPv4를 사용할 것이라고 가정합니다.
답변1
가능하더라도 귀하가 요구하는 것은 작동하지 않을 것입니다. 소프트웨어가 ::에 바인딩되면 주소가 IPv6 형식으로 표시된다고 가정할 수 있습니다. 허용되는 소켓은 IPv6이고 IPv4 주소는 캡슐화됩니다.
따라서 192.168.1.1은::FFFF:192.168.1.1이 됩니다.
즉, 어떻게든 다른 IP에 바인딩할 수 있더라도 이를 IPv4 소켓으로 설정하게 되며 소프트웨어는 이를 처리하도록 컴파일되지 않습니다. 소프트웨어에서는 IPv6 소켓이 필요하지만 IPv6이 비활성화되어 있으므로 그렇게 할 수 없습니다.
IPv6를 비활성화하면 호환성 코드가 없습니다. 결론은 IPv6이 비활성화되어 있고 사용 중인 소프트웨어에서 이를 활성화해야 한다는 것입니다.
여기서 유일한 옵션은 IPv6를 활성화하거나(왜 비활성화해야 하는지 질문에서 명확하지 않음) 소스에서 직접 IPv6 소프트웨어를 다시 컴파일하고 문제를 "수정"하기 위해 소스 코드를 패치하는 것입니다.
답변2
당신이 할 수 있는 일은 타협하는 것입니다. IPv6를 활성화하되 그것이 모든 곳에서 효과적으로 사용되도록 허용하지 마십시오.
시작 시 IPv6를 활성화하지만 sysctl -w ...
다음 매개변수를 사용하거나 /에 이러한 매개변수를 추가하여 /etc/sysctl.conf
향후 및 현재 인터페이스에서는 비활성화합니다 /etc/sysctl.d
.
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.all.disable_ipv6=1
이러한 방식으로 IPv6 사용은 효과적으로 비활성화되지만 IPv6 소켓 API는 활성화된 상태로 유지됩니다. 따라서 애플리케이션은 여전히 듀얼 스택 모드로 바인딩할 수 ::
있으며 IPv4도 이와 연결될 수 있습니다(기본값은 다음과 같습니다).RFC 3493).
::1에 대한 예외 및 질문을 고려할 수 있습니다.루오구성 및 애플리케이션 동작에 따라 달라지는 인터페이스입니다. 여러 선택 중에서:
/etc/hosts
아래 표시된 항목에서 제거하십시오.::1 localhost ip6-localhost ip6-loopback
아니면 IPv6를 비활성화하지 마세요.루오(이전 설정 이후) 우리는 ::1 을 얻습니다:
net.ipv6.conf.lo.disable_ipv6=0
항목을 예약하려면
/etc/hosts
::1보다 127.0.0.1 우선순위를 부여하거나 다음을 추가하여 IPv6보다 IPv4 우선순위를 부여하는 것이 좋습니다/etc/gai.conf
.precedence ::ffff:127.0.0.1/128 100
또는:
precedence ::ffff:0:0/96 100
참고: 일부 네트워크 구성 도구(예: NetworkManager)는 토글을 disable_ipv6
자체 설정으로 재설정하므로 구성된 인터페이스에서 IPv6을 비활성화하도록 명시적으로 구성해야 합니다.
대안: 이것이 받아들이기 너무 어렵다면 IPv6를 비활성화하는 대안이 있습니다( CONFIG_IP_ADVANCED_ROUTER
모든 주요 배포 커널은 .
교체하여 IPv6 라우팅 규칙이 라우팅 테이블을 사용하지 못하도록 방지선호도 0규칙과블랙홀IPv6 경로 조회가 실패하도록 하는 규칙(기본 설정 32766을 포함한 모든 규칙을 제거하여 Network is unreachable
대신 얻을 수 있음 Invalid argument
):
ip -6 rule delete preference 0
ip -6 rule add preference 0 blackhole
인터페이스에 다른 설정이 없더라도:
$ ping ::1
ping: connect: Invalid argument
ping ff05::2
ping: connect: Invalid argument
IPv6 수신은 여전히 성공하지만(RFC에 따라 기본적으로 이중 스택으로 설정됨):
$ socat tcp6-listen:4242 /dev/null &
[1] 430541
$ ss -tnle sport == 4242
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 5 *:4242 *:* uid:1000 ino:5971821 sk:1106 v6only:0 <->
IPv4 라우팅이 차단되지 않으므로 듀얼 스택 모드에서도 IPv4 트래픽을 계속 수신할 수 있습니다.