[OS] 리눅스 포트포워딩 (80 to 8080)

susu·2023년 3월 18일
0

문제상황

Ubuntu 기반 VM 서버 위에 스프링 부트 프로젝트를 배포했다.
로컬에서 8080 포트로 개발을 진행하던 프로젝트였는데,
배포 후 테스트를 해보니 요청이 8080 포트로 전달되지 못했다.

따라서 디폴트 포트인 80번으로 요청을 보내서,
해당 요청이 8080 포트로 리다이렉트 되도록 포트포워딩을 시켜주기로 했다.

해결 과정

저는 해당 현상을 포트포워딩을 통해 우회적으로 해결했지만,
조금 더 찾아보니 애초에 우분투 자체 방화벽에서 8080 포트를 열어줬어야 하는 것으로 보입니다.
아래와 같이 iptables 명령어를 통해 특정 포트를 열어줄 수 있습니다.

$ sudo iptables -I INPUT 1 -p tcp --dport [열고 싶은 포트 번호] -j ACCEPT

기본적으로 클라우드 자원 위에 서버를 올리게 되면
http://인스턴스에 할당된 외부 IP or 도메인 형식으로 접근할 수 있게 된다.
이때 뒤에 포트 번호를 붙이지 않으면 해당 주소로 보내지는 모든 요청은 아파치 서버 기본 포트인 80번으로 가게 된다.
(eg. http://인스턴스에 할당된 외부 IP or 도메인:8080)

이 요청들을 서버가 사용하는 8080 포트로 보내보자.

리눅스나 유닉스 계열 OS들은 보안 유지를 위해 1024 이하 포트(well-known port)들에 대해
일반 유저 권한에서 바인딩하지 못하도록 막아놓는다.
따라서 iptables 명령어로 방화벽 규칙을 수정해서 포트포워딩을 진행해야 한다.

$ sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

이를 통해 80번으로 오던 패킷(요청)들을 서버가 사용하는 8080 포트로 보내줄 수 있다.

조금 더 알아보자

이 기회에 OS 공부 좀 더 해 보자.

iptables

리눅스의 방화벽 규칙.
네트워크를 타고 들어오는 모든 패킷에 대해 규칙을 가지고 패킷 필터링을 진행한다.

패킷은 기본적으로 HeaderData를 가진다.
Header에는 출발지와 도착지에 대한 IP와 포트 번호, 체크썸, 프로토콜 옵션 등이 포함된다.
Data에는 패킷을 통해 전송될 데이터가 포함된다.
따라서 패킷 필터링이란 지나가는 패킷의 Header를 보고 그 패킷의 운명을 결정하는 것을 의미한다.

이 규칙에 따라 허용(ACCEPT)와 차단(DROP) 유무를 지정할 수 있다.
iptables 정책의 핵심은 Chain에 있다.

iptables 기본 명령어

iptables [-t table] [action] [chain] [matches] [-j target]
  • -t : 테이블(table) 지정 옵션. filter, nat, mangle, raw가 있으며 default 값은 filter.
  • action : 정책의 추가, 삭제, 변경 등을 선택.

    -A(—append) : 새로운 정책 추가
    -I(—insert) : 정책을 삽입할 위치 지정
    -D(—delete) : 정책 삭제
    -R(—replace) : 정책 교체
    -F(—flush) : 체인으로부터 모든 정책을 삭제
    -P(—policy) : 기본 정책 설정
    -L(—list) : 정책 목록 확인

  • chain : 패킷에 대한 정보를 라우팅할 방법을 지정
    Chain은 패킷이 조작될 상태를 지정하며,
    iptables에는 세 가지의 기본 Chain(INPUT, FORWARD, OUTPUT)이 내장되어 있다.
  1. INPUT 체인 : 호스트(Linux) 서버로 들어오는 모든 패킷이 통과하는 곳
  2. OUTPUT 체인 : 호스트(Linux) 서버에서 생성되어 외부로 보내지는 모든 패킷이 통과하는 곳
  3. FORWARD 체인 : 호스트(Linux) 서버가 목적지가 아닌 모든 패킷,
    즉 라우터로 사용되는 호스트 컴퓨터를 통과하는 패킷보내지는 패킷들이 통과하는 곳
  • matches : 출발지와 목적지를 매칭할 방법 지정

    -s(—source, —src) : 출발지 매칭, 도메인, IP 주소, 넷마스크 값을 이용하여 표기
    -d(—destination, —dst) : 목적지 매칭, 도메인, IP주소, 넷마스크 값을 이용하여 표기
    -p : 프로토콜과 매칭, TCP, UDP, ICMP와 같은 이름을 사용하고 대소문자는 구분하지 않음
    -i(—in-interface) : 입력 인터페이스와 매칭
    -o(—out-interface) : 출력 인터페이스와 매칭
    -j(—jump) : 매치되는 패킷을 어떻게 처리할지 지정
    -f(—fragment) : 분절된 패킷
    —sport : 송신지 포트와 매칭
    —dport : 수신지 포트와 매칭

  • -j target : 패킷이 규칙과 일치할 때 취할 동작을 지정

    ACCEPT : 패킷 허용
    DROP : 패킷 버리기
    REJECT : 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송
    LOG : 패킷을 syslog에 기록
    RETURN : 호출 체인 내에서 패킷 처리를 계속함

profile
블로그 이사했습니다 ✈ https://jennairlines.tistory.com

0개의 댓글