이렇게 시작됐어요.
어느날부터 개발툴이며 로컬 실행이며 프로그램 실행이며 포트가 막혔다며 포트가 바뀌거나 아예 작동되지 않는 일이 일어나기 시작했어요.
웹 개발시 리액트는 포트 번호나 로컬 주소를 콘솔에 띄워주지 않고 바로 웹브라우저를 띄우다보니 닫고 나면 다시 열 때 기본 포트 3000번이 아니면 이걸 못 찾으니 netstat 이나 Process Explorer, TCPView 등에서 찾아보는 등 고생하게 되더라구요.
예시로 든 프로그램은 IntelliJ IDEA 라는 개발 도구인데, 이 프로그램은 6942부터 6991까지 총 50개의 포트를 시도하기 때문에 한두개 막혀서 일어나는 문제가 아니였던거예요.
"IDE가 서버 시작을 위해 폴더를 잠그려고 하면 번호 6942 부터 6991까지의 포트 중 먼저오는 하나를 점유하려고 합니다. 범위내 포트 50개가 모두 점령된것은 흔한 일이 아닙니다. 네트워킹 오류나 보안SW 때문일 수 있습니다."
-IDEA 구동 실패: 주소가 이미 사용중입니다, JetBrains 커뮤니티-
그밖에 3306번을 쓰는 MySQL도 켜지지 않아서 포트를 바꿔줘야하는 상황도 겪었고, 이 때 개발초보인 저에겐 이 포트번호를 쓰는 개발품의 포트 설정을 모두 바꿔줘야하는 불편이 있었어요.
그런데 이렇게 누군가 먹어버린 포트는 netstat 등의 도구를 쓰면 나오기 마련이죠? 그런데 제가 겪은 문제는 이들 프로그램에서 해당 포트는 점유되지 않은 걸로 나왔고 그래서 sudo nc -l -p 3306 같이 직접 점유를 시도해보는 방법밖에 알 길이 없었어요.
이럴 때 재부팅을 시켜보면 점유된게 사라지곤 해서 다행으로 여기고 쓰다 보면 다른데가 점유되어 있더라구요. 흠... 그래서 인터넷에 검색을 해서 Hyper-V의 vEthernet 어댑터도 꺼보고 했지만 오래 가는 해결 방법은 아니었어요.
그러다가 문득 IntelliJ IDEA에서 범위단위로 포트를 찾는다는 생각에 검색어를 '포트 점유'에서 '포트 고갈'로 변경하고 dynamicport 를 언급한 문서를 보게 되었어요.
"IANA 권장사항을 준수하기 위해 마이크로소프트에서는 외향 연결용 동적 클라이언트 포트 범위를 늘렸습니다. 새로운 기본 시작 포트 번호는 49152번, 새로운 기본 끝 포트는 65535번으로, 1025에서 5000까지 쓰던 구버전의 Windows와는 다릅니다."
-포트 고갈 문제에 대처하기
조회 명령은 총 4가지 인데 IP 버전별, TCP/UDP 이렇게 2x2 = 4가지 였어요.
netsh int ipv4 show dynamicport tcp
netsh int ipv4 show dynamicport udp
netsh int ipv6 show dynamicport tcp
netsh int ipv6 show dynamicport udp
그래서 저도 조회해봤죠.
> netsh int ipv4 show dynamicport tcp
Protocol tcp Dynamic Port Range
---------------------------------
Start Port : 1024
Number of Ports : 13977
> netsh int ipv4 show dynamicport udp
Protocol tcp Dynamic Port Range
---------------------------------
Start Port : 49152
Number of Ports : 16384
> netsh int ipv6 show dynamicport tcp
Protocol tcp Dynamic Port Range
---------------------------------
Start Port : 1024
Number of Ports : 13977
> netsh int ipv6 show dynamicport udp
Protocol tcp Dynamic Port Range
---------------------------------
Start Port : 49152
Number of Ports : 16384
으엥??? 왜 제 컴퓨터는 다르게 되어있는거죠?
바로 찾았다! 싶어서 바꾸는 명령을 찾아 스크롤을 하게 되었어요
netsh int ipv4 set dynamicport tcp start=10000 num=1000
netsh int ipv4 set dynamicport udp start=10000 num=1000
netsh int ipv6 set dynamicport tcp start=10000 num=1000
netsh int ipv6 set dynamicport udp start=10000 num=1000
"이 예시 명령은 동적 포트 범위를 10000부터 10999 까지 1000개를 갖도록 설정하게 됩니다. 최소 범위(num) 값은 255이며, 최소 시작 포트 번호는 1025입니다. 끝 포트 번호는 65535를 넘을 수 있습니다."
-포트 고갈 문제에 대처하기-
계산하는건 귀찮으니까 멀쩡히 잘 있는 UDP쪽의 값을 복사 붙여넣기 하면 될 것 같아요!
netsh int ipv4 set dynamicport tcp start=49152 num=16384
netsh int ipv4 set dynamicport udp start=49152 num=16384
netsh int ipv6 set dynamicport tcp start=49152 num=16384
netsh int ipv6 set dynamicport udp start=49152 num=16384
그리고 다시 조회!
> netsh int ipv4 show dynamicport tcp
Protocol tcp Dynamic Port Range
---------------------------------
Start Port : 49152
Number of Ports : 16384
> netsh int ipv4 show dynamicport udp
Protocol tcp Dynamic Port Range
---------------------------------
Start Port : 49152
Number of Ports : 16384
> netsh int ipv6 show dynamicport tcp
Protocol tcp Dynamic Port Range
---------------------------------
Start Port : 49152
Number of Ports : 16384
> netsh int ipv6 show dynamicport udp
Protocol tcp Dynamic Port Range
---------------------------------
Start Port : 49152
Number of Ports : 16384
그리고 재부팅은 필요없다고 되어있지만, 잘 적용되라는 마음을 담아 재부팅 해줬어요. 그리고 유령 점유 현상이 말끔히 해결되었네요. 🥰 나중에 더 검색을 해보니 윈도10 2004 인사이더 빌드 설치시 이 동적 포트 번호 범위가 변경되는 버그가 있었다는 댓글을 봤어요. 이렇게 변경된 값은 정식 버전으로 올린지 오래 뒤에도 원래대로 돌아오지 않았고, 저는 그대로 고생을 했던거였어요.
포트 고갈 관련 MS문서 보고 동적포트 범위 조회를 해봤더니
TCP는 1024~15000 까지 13977개
UDP는 49152~65535 까지 16384개 로 설정되어있어서 다르게 뜨는데, 문서상으로는 49152~65535 로 넷 다 같은 값이 기본값인것 같다. 누가 바꾼거지 ????
-라루얀 트위터
여러분도 무시무시한🤣 인사이더 버그🐞 조심하세요~
--------------------
2020-09-26
그동안 이 문제를 겪던 저를 도와주려고 같이 고민하고 이것저것 두들겨 주셨던 분들에게 감사의 뜻을 전할게요.
감사합니다 ㅠㅠ
ReplyDelete