Work/개발 노트

[Go언어] tcp로 웹 서버 구동시 tcp6로 Listen

★용호★ 2020. 9. 14. 00:14
Golang echo framework로 웹 서버 실행 시 tcp를 지정하여 IPv4를 사용하도록 설정을 했는데도 서버가 실행된 후 LISTEN 상태를 보면 아래와 같이 tcp6만 실행되어있다.
netstat -anp | grep 8080
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp6       0      0 :::8080                 :::*                    LISTEN      -

 

그럼에도 ACL이 허용된 다른 서버에서 telnet으로 접근을 시도하면 정상적으로 접근이 된다.

 

telnet 10.0.13.35 8080
Trying 10.0.13.35...
Connected to 10.0.13.35.
Escape character is '^]'.
^]

 

기본적으로 AF_INET6 소켓은 실제로 IPv4 및 IPv6 모두에서 작동하게 되는데 Golang Echo framework에서 서버 실행 시 소켓 설정하는 부분을 보면 다음과 같다.

 

func favoriteAddrFamily(network string, laddr, raddr sockaddr, mode string) (family int, ipv6only bool) {
	switch network[len(network)-1] {
	case '4':
		return syscall.AF_INET, false
	case '6':
		return syscall.AF_INET6, true
	}

	if mode == "listen" && (laddr == nil || laddr.isWildcard()) {
		if supportsIPv4map() || !supportsIPv4() {
			return syscall.AF_INET6, false
		}
		if laddr == nil {
			return syscall.AF_INET, false
		}
		return laddr.family(), false
	}

	if (laddr == nil || laddr.family() == syscall.AF_INET) &&
		(raddr == nil || raddr.family() == syscall.AF_INET) {
		return syscall.AF_INET, false
	}
	return syscall.AF_INET6, false
}
  • echo에서 네트워크 설정 시 "tcp"를 사용할 경우 함수 맨 위 switch문의 case에 걸리지 않기 때문에 하위 조건들에 모두 일치하지 않을 경우 결국 AF_INET6로 소켓이 설정된다.
  • 결론적으로 AF_INET6로 설정되면 결국 netstat 명령 시 tcp6로만 보여지지만 IPv4, IPv6모두 연결이 가능하다.

참고