haproxy에서 IPv4 및 IPv6의 모든 인터페이스에 바인딩


13

모든 인터페이스 ( 및 및 )의 소켓 뿐만 아니라 소켓에 바인딩 하도록 haproxy 를 구성하고 싶습니다 .tcptcp60.0.0.0:80:::80

다음 설정으로이 목표에 도달 할 수있었습니다.

listen web
  bind :80 v4v6
  bind :::80 v6only

이보다 더 짧은 방법이 있습니까?

나는 다르게 행동하기를 기대하지만 v4v6키워드는 haproxy 를 v4 소켓에만 바인딩합니다.


3
무엇에 대해 bind :::80 v4v6?
Michael-sqlbot

실제로 이것은 작동합니다. 감사! 크레딧을 줄 수 있도록 답변으로 제출해 주시겠습니까?
StephenKing

답변:


25

IPv6 및 IPv4에 대해 동일한 포트에서 청취하려면 다음을 사용하십시오.

bind :::80 v4v6

분명히 이것은 정확한 것으로 보이는 직관적 인 추측이었습니다 ...하지만 "운이 좋은"추측을 답으로 게시하는 대신 효과가 있지만 정당화 해야하는 것처럼 보입니다.

v4v6 키워드는 haproxy를 v4 소켓에만 바인드합니다.

첫 번째 직관은 이 소켓이 IPv4에서만 수신하게 v4v6하는 것이 아니라 오히려 :80(또는 더 정확하게는 IP 주소를 전혀 사용하지 않고, 단지 포트 번호를 사용하는 것) 것이 었습니다.

이것은 다음 문서에서 확인 된 것으로 보입니다 bind.

address선택 사항이며 호스트 이름, IPv4 주소, IPv6 주소 또는 '*'입니다. 프런트 엔드가 수신 할 주소를 지정합니다. 설정하지 않으면 시스템의 모든 IPv4 주소가 청취됩니다. '*'시스템의 특수 주소 " 0.0.0.0" 에도 동일하게 적용됩니다 . IPv6에 해당하는 것은 '::'입니다.

http://cbonte.github.io/haproxy-dconv/configuration-1.6.html#4.2-bind (강조 추가)

따라서 다음 세 가지 형식은 모두 동일하며 HAProxy에서 IPv4로 해석됩니다.

bind :80
bind *:80
bind 0.0.0.0:80

다음으로, 문서 에서 IPv6을 수신하기 위해 위의 바인드 명령문 중 하나를 확장하는 데 사용할 수 있음 v4v6을 나타 내기 위해 단독으로 읽을 수있는 한 문장 v4v6이 있습니다 ...

v4v6

기본 주소를 사용할 때 소켓을 IPv4 및 IPv6 모두에 바인딩하는 데 사용됩니다.

... 음, 그러나 이것이 실제로 "v6 기본 주소"( ::)를 의미하는 것 같습니다 .

기본적으로 IPv6에만 바인드 된 시스템에서는 그렇게하는 것이 때때로 필요합니다.

... 그리고 지금, 나는 그것을 훨씬 더 의심합니다 ...

비 IPv6 소켓에는 영향을 미치지 않으며 v6only옵션으로 대체됩니다 .

http://cbonte.github.io/haproxy-dconv/configuration-1.6.html#5.1

따라서 IPv6 기본 청취 주소를 지정하는 지시문 v4v6만 수정 하는 것으로 보입니다 (세 번째 는 주소와 포트를 구분하는 구분 자임).bind:::


5

수락 된 답변은 적어도 OpenBSD의 haproxy-1.6.11p0에서 작동하지 않습니다. 또한, TL; DR. 그냥 해:

bind 0.0.0.0:80
bind :::80

작동합니다 :

# netstat -an|grep "*.80"
tcp          0      0  *.80                   *.*                    LISTEN
tcp6         0      0  *.80                   *.*                    LISTEN
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.