본문 바로가기

Server/JEUS

JEUS 외부 접속 403... 포트포워딩 문제인 줄 알았는데 아니었다

개발 서버에 외부에서 접속할 일이 있어서 포트포워딩을 설정하고 테스트하고 있었다.

그런데 외부 주소로 접속하자 갑자기 403 Forbidden이 발생했다.

처음에는 당연히 포트포워딩 문제라고 생각했다.

포트 설정을 잘못했나...?

그래서 포트포워딩 설정부터 서버 상태, 접속 경로 등을 하나씩 확인하기 시작했다.

그런데 확인하다 보니 조금 이상한 점이 있었다.

WireGuard로 접속하면 정상인데?

같은 서버인데 WireGuard를 켜고 접속하면 정상적으로 접속됐다.

반대로 WireGuard를 끄고 외부 포트를 통해 직접 접속하면 403이 발생했다.

상황만 놓고 보면 딱 네트워크 문제처럼 보였다.

WireGuard 접속 → 정상
외부 포트 접속 → 403 Forbidden

 

내부에서는 되고 외부에서는 안 되니까 방화벽이나 포트포워딩 설정을 계속 의심했다.

그런데 자세히 확인해보니 요청 자체가 서버에 도달하지 않는 상황은 아니었다.

포트가 아예 막혀 있다면 연결 자체가 안 되어야 하는데 JEUS에서 403 응답을 내려주고 있었다.

그렇다면 네트워크보다는 JEUS 쪽을 확인해볼 필요가 있었다.

결국 JEUS 로그를 열어봤다

JEUS 로그를 확인해보니 이런 에러가 남아 있었다.

jeus.servlet.util.NotAllowedAddressException:
The number of licensed clients was exceeded.

at jeus.servlet.common.WebContainerManager.checkAllowedClientCounts(...)

 

여기서 원인이 거의 보였다.

The number of licensed clients was exceeded.

 

허용된 클라이언트 수를 초과했다는 내용이었다.

포트포워딩 문제가 아니었다.

열심히 네트워크 설정을 보고 있었는데, 실제로는 JEUS 라이선스에서 클라이언트 접속을 제한하고 있었던 것이다.

개발용 JEUS 라이선스의 클라이언트 제한

확인해보니 해당 서버에서 사용 중인 JEUS 라이선스는 개발용이었다.

그리고 외부에서 접속하는 클라이언트 수가 일정 수준을 넘어가면 다음과 같은 예외가 발생하고 있었다.

NotAllowedAddressException

 

처음에 403만 봤을 때는 전혀 라이선스 문제라고 생각하지 못했다.

HTTP 상태 코드만 보면 단순한 접근 권한 문제처럼 보이기 때문이다.

결국 전체적인 흐름은 이런 식이었다.

외부에서 서버 접속
        ↓
포트포워딩을 통해 JEUS까지 요청 전달
        ↓
JEUS에서 클라이언트 확인
        ↓
라이선스에서 허용하는 클라이언트 수 초과
        ↓
403 Forbidden

 

즉 외부에서 JEUS까지 요청은 정상적으로 도착하고 있었지만, JEUS가 해당 요청을 허용하지 않고 있었던 것​이다.

 

그런데 재기동하니까 다시 된다?

원인을 확인하는 과정에서 JEUS를 재기동할 일이 있었다.

그리고 다시 외부에서 접속해봤는데...

접속이 된다.

순간 해결된 줄 알았다 ㅋㅋ

하지만 조금 더 확인해보니 근본적으로 문제가 해결된 것은 아니었다.

재기동 이후 기존에 관리되던 클라이언트 상태가 초기화되면서 다시 접속할 수 있게 된 것으로 보였다.

JEUS 재기동
    ↓
클라이언트 상태 초기화
    ↓
외부 접속 가능
    ↓
사용자가 다시 증가
    ↓
허용 범위 초과 시 403 발생

 

따라서 재기동은 임시로 접속할 수 있게 만드는 방법일 뿐, 근본적인 해결책은 아니었다.

더군다나 여러 명이 함께 사용하는 개발 서버라면 함부로 재기동하는 것도 좋은 방법이 아니다.

내가 접속하려고 재기동했는데 다른 사람이 작업 중이었다면 오히려 더 큰 문제가 생길 수 있다.

왜 WireGuard에서는 접속됐을까?

마지막으로 궁금했던 부분이 하나 더 있었다.

왜 WireGuard를 사용했을 때는 정상적으로 접속됐을까?

외부 포트를 통해 직접 접근하는 경우와 WireGuard를 통해 내부 네트워크처럼 접근하는 경우에는 JEUS에서 클라이언트를 인식하는 방식에 차이가 있을 수 있다.

실제로 이번 환경에서는 WireGuard를 통한 접근은 정상적으로 가능했고, 외부 포트를 통한 접근에서 클라이언트 제한 문제가 발생했다.

다만 이 부분은 당시 환경에서 확인된 현상을 기준으로 판단한 것이기 때문에, 정확한 라이선스 정책과 클라이언트 식별 방식은 JEUS 라이선스 조건을 별도로 확인할 필요가 있다.

이번에 배운 점

이번 문제는 처음에는 단순한 포트포워딩 문제라고 생각했다.

그런데 하나씩 확인하다 보니

포트포워딩 → WireGuard → JEUS → 로그 → 라이선스

순서로 원인의 범위를 좁혀갈 수 있었다.

특히 기억에 남는 건 403이라는 결과만 보고 원인을 단정하면 안 된다는 점이다.

403을 보면 보통 권한이나 네트워크 설정부터 생각하게 되는데, 이번처럼 WAS 내부 정책이나 라이선스 때문에 발생할 수도 있었다.

그리고 역시 서버 문제를 볼 때는 로그가 중요했다.

이것저것 설정을 한참 들여다봤는데 결국 결정적인 단서는 로그에 그대로 적혀 있었다.

The number of licensed clients was exceeded.

 

다음에 비슷하게 "내부에서는 되는데 외부에서는 왜 안 되지?"​라는 문제가 생긴다면,

이번에는 조금 더 빨리 로그부터 열어볼 것 같다.