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 공부 좀 더 해 보자.
리눅스의 방화벽 규칙.
네트워크를 타고 들어오는 모든 패킷에 대해 규칙을 가지고 패킷 필터링을 진행한다.
패킷은 기본적으로
Header
와Data
를 가진다.
Header
에는 출발지와 도착지에 대한 IP와 포트 번호, 체크썸, 프로토콜 옵션 등이 포함된다.
Data
에는 패킷을 통해 전송될 데이터가 포함된다.
따라서 패킷 필터링이란 지나가는 패킷의Header
를 보고 그 패킷의 운명을 결정하는 것을 의미한다.
이 규칙에 따라 허용(ACCEPT)와 차단(DROP) 유무를 지정할 수 있다.
iptables 정책의 핵심은 Chain에 있다.
iptables [-t table] [action] [chain] [matches] [-j target]
-t
: 테이블(table) 지정 옵션. filter, nat, mangle, raw가 있으며 default 값은 filter.
-A
(—append) : 새로운 정책 추가
-I
(—insert) : 정책을 삽입할 위치 지정
-D
(—delete) : 정책 삭제
-R
(—replace) : 정책 교체
-F
(—flush) : 체인으로부터 모든 정책을 삭제
-P
(—policy) : 기본 정책 설정
-L
(—list) : 정책 목록 확인
INPUT
체인 : 호스트(Linux) 서버로 들어오는 모든 패킷이 통과하는 곳OUTPUT
체인 : 호스트(Linux) 서버에서 생성되어 외부로 보내지는 모든 패킷이 통과하는 곳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
: 호출 체인 내에서 패킷 처리를 계속함