본문 바로가기
개발관련

Error: listen EACCES: permission denied 0.0.0.0:80 정리

by 딸기별땅 2022. 6. 1.

현재 우리 회사의 서비스는 linux에 올려져 있다. 서버는 node.js를 사용. 

그런데 mac에서 작업하던걸 linux에 그대로 올리니까

80포트는 안된단다...아니 1024 까지는 기본적으로 못 쓰게 되어있다네. 

throw er; // Unhandled 'error' event
      ^
Error: listen EACCES: permission denied 0.0.0.0:80
...
Emitted 'error' event on Server instance at:
    at emitErrorNT (node:net:1361:8)
    at processTicksAndRejections (node:internal/process/task_queues:83:21) {
  code: 'EACCES',
  errno: -13,
  syscall: 'listen',
  address: '0.0.0.0',
  port: 80
}

대략 이런 에러메세지를 뱉는다. 

난 일단 서버 보안 이런거 잘 알못임.. 그냥 할수있는한 해결책들을 정리해 봄. 

 

임시방편으로 vs code에서 전체검색에서 80' 또는 80"을 검색해서

포트를 8080으로 바꿔 준뒤 노드서버를 실행시켰다. 1025 이상의 숫자면 동작 할거다.

 

그렇지만 그렇다고 해서 호스트 뒤에 포트를 붙여서 쓰긴 싫었으므로 다른 방법을 찾아본다. 

iptables -t nat -I PREROUTING -p tcp —dport 80 -j REDIRECT —to-port 8080

iptables가 뭔지 잘 모르고 옵션들도 사실 알고 쓴것도 아님. 그냥 붙여 넣었다.. 

80으로 들어온 요청을 8080으로 리다이렉트 시킨다는거 같다.

내생각엔 이게 비교적 이상적인 방법인것으로 보이나,

적용했음에도 계속해서 permission denied 가 떴음. (아직 원인 모름 ㅠㅠㅠ)

 

아무래도.. 백엔드 개발자인 직장동료분에게 여쭤 보기로 함..

"80포트에서 아파치가 돌고있는데요?"

sudo lsof -i :80

대략 이렇게 조회가 가능하다. 

음.. -_-; 일단 80포트에서 돌던 아파치는 죽여도 살아나길래 다른포트로 전부 빼주었다.

만약에 나처럼 아파치가 먼저 80포트를 잡아 먹고 있던 상황이라면, (아니라면 상관 없음)

 

sudo vi /etc/apache2/ports.conf
sudo vi /etc/apache2/sites-available/000-default.conf

한줄씩 vi로 열어서 80이라고 되있는부분을 원하는 포트 번호로 변경한다.

 

sudo service apache2 restart

아파치 재시작하고, 80포트가 사용되고 있지 않은걸 확인했는데도 여전히 접근 금지..

 

이건 명확히 권한의 문제인지라 권한 관련해서 이리저리 뒤져보고..

node를 root권한(sudo ...) 으로 실행시키면 당연히 안된다.

프로젝트 내에 노드모듈이 아니라 root의 노드모듈을 가져다 쓰기 때문임.

 

# enable node to run in port 80
sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep /usr/local/bin/node

또는

sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\`

 

capabilities 를 설치+세팅해서 node가 80포트를 사용할수있게 허용해주는 코드이다. 

root권한이 반드시 필요한 작업들이 있는데, 유저권한에서 허용할수 있게 예외를 처리해주는 모양이다.

정상적으로 동작하는것을 확인한후 회사에 포트포워딩을 요청했다가, 

오늘이 공휴일이라는 사실을 깨달았다 -_-;;

 

사실 가장 위에 리다이렉팅 시키는 방법이 가장 이상적일것으로 추측이 되는데..

이건 나중에 시간날때 다시 들여다봐야 될듯 하다...

댓글