만쥬의 개발일기
article thumbnail

Spring Boot로 외부 메인 서버에 서버를 띄웠을 때, 분명 서버도 잘 올라가 있고 내부망에서는 API 송수신이 되는데, 간혹 외부 접속은 아예 불가능 한 경우가 있었다.

 

그때의 해결 방법들을 모아보자.

다음 먼저 개발 환경은 다음과 같다.

  • Spring Boot 버전 3 이상
  • Linux Ubuntu 20.04

스프링 설정에서 외부 접근 권한이 막혔을때

application.properties에 다음 내용을 추가한다.

server.port=8080
server.address=0.0.0.0

server.port 설정은 내가 서버를 열 포트를 지정한다. (default는 8080)

server.address=0.0.0.0 는 모든 IP에서의 접근을 허용한다.

 

스프링 부트의 port가 외부 접근이 막혔을 때

다음 명령어로 내가 원하는 포트의 상태를 확인한다.

netstat -nap | grep {포트번호}

그리고 외부에서 접속할 수 있도록 해당 포트의 방화벽 규칙을 수정해준다.

 

1 TCP PORT일 경우

iptables -I INPUT 1 -p tcp --dport 12345 -j ACCEPT

 

2 UDP PORT일 경우

iptables -I INPUT 1 -p udp --dport 12345 -j ACCEPT

 

위 명령어들을 입력한 뒤 , 변경사항 저장은 다음 명령어로 해준다.

service iptables save

 

스프링 부트 서버가 IPv6로 올라갔을 때 

다음 명령어로 내가 원하는 포트가 열려 있는지 확인한다.

netstat -nap | grep 8080

여기서 tcp6로 서버가 올라가 있는 것을 확인할 수 있다.

스프링에 내장되어있는 톰캣이 가끔 IPv6로만 올라가는 경우가 있다.

 

해당 서버는 Ubuntu20 버전이었는데, 최신 버전의 리눅스에서 tcp6가 우선권이 있는게 아닐까하는 추측이 있다.

netstat -lntp

위 명령어를 사용하면 어떤 포트들이 IPv6로 올라가있는지 확인가능하다.

 

가장 간단한 해결 방법은 , 서버에서 IPv6의 사용을 disable 시키는 것이다.

cat /proc/sys/net/ipv6/conf/all/disable_ipv6 

우선 위 명령어로 IPv6를 사용 중인지 확인한다.

위 예시와 같이 0이 나온다면 사용 중인것이고, 1이 나오면 사용하지 않는다는 뜻이다.

 

이제 다음 명령어로 수정해야 할 환경 변수들을 모두 확인해보자.

sudo sysctl -a | grep net.ipv6.conf | grep disable_ipv6

 

위 환경 변수들의 설정은 conf.all을 수정해주는 것 만으로도 한 번에 해결 가능하다.

sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1

모든 설정이 잘 변경된 모습

 

재부팅 시 자동 적용되도록 sysctl.conf에도 다음 내용을 넣어준다.

vi /etc/sysctl.conf
#IPv6 죽이기
net.ipv6.conf.all.disable_ipv6 = 1
#net.ipv6.conf.default.disable_ipv6 = 1
#net.ipv6.conf.lo.disable_ipv6 = 1

 

이제 서버가 외부에서도 정상적으로 접근된다.

 

reference

profile

만쥬의 개발일기

@KangManJoo

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!