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
'♾️Language & Framework > 🌿Spring' 카테고리의 다른 글
[Spring / trouble Shooting] - java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver (0) | 2024.02.14 |
---|---|
[Spring Boot] - 클라이언트 접속 IP 기록용 Tomcat Access Log 설정하기 (0) | 2024.01.01 |
[Spring] - @ResponseEntity의 이해와 사용 방법 (0) | 2023.11.25 |
[Spring] - @RestControllerAdvice를 이용해서 예외처리 AOP 처리하기 (0) | 2023.11.24 |
[Spring] - JPA 칼럼명 카멜케이스 적용하기 (0) | 2023.11.23 |