Today I learned
- iptables
- 포트 포워딩
- pm2
iptables
- iptables란? 패킷 필터링 기능을 사용해 패킷의 해더를 보고 그 전체 패킷을 제어할 수 있다 방화벽은 순차적 실행으로 등록 순서에 있어서 먼저 등록한 부분에 대해서 효력이 유효 하기 때문에 등록 시 순서가 매우 중요하다
설정 파일의 위치: /etc/sysconfig/iptables(명령어 대신 vim을 사용해서 수정 가능) - 모든 입출력 패킷에 대해 거부하는 설정이 먼저 등록되면 그 이후 포트를 열어주는 설정을 해도 효과가 없다
- 특정 조건을 가지고 있는 패킷에 대해 허용(ACCEPT)과 차단(DROP)등을 지정할 수 있으며 특정 조건등을 통해 다양한 방식의 패킷 필터링과 처리 방식을 지원한다
- 리눅스의 패킷 필터링(Packet Filtering) 도구로 리눅스 방화벽을 설정하고 구성하거나 NAT(Network Address Translation)에 사용한다
- 테이블(table)
- nat: Network Address Translation, IP 주소 변환
- raw: 넷 필터의 연결 추적 하위 시스템과 독립적으로 동작해야 하는 규칙을 설정하는 테이블
- security: 리눅스 보안 모듈인 SELinux에 의해 사용되는 MAC(Mandatory Access Control) 네트워크 관련
규칙 적용 - mangle: 패킷 데이터를 변경하는 특수 규칙을 적용하는 테이블 성능향상을 위해 TOS(Type of Service) 설정
- filter: iptables의 기본 테이블로 패킷 필터링 담당
- 체인(Chain)
- INPUT: 시스템 외부에서 내부로 들어오는 체인
- OUTPUT: 시스템 내부에서 외부로 나가는 체인
- FORWARD: 시스템을 통과하는 체인
- 일치하는 패킷의 규칙을 연결하는 단위 INPUT, OUTPUT, FORWARD가 내장 체인으로 되어있음
- 액션(action)
- -A(--append) : 새로운 정책을 추가
- -I(--insert) : 위치를 선택하여 정책을 삽입
- -D(--delete) : 정책을 삭제
- -R(--replace) : 정책을 교체
- -F(--flush) : 체인으로부터 모든 정책 삭제
- -P(--policy) : 기본 정책을 설정
- -L(--list) : 정책 목록을 확인
- 매치(matches)
- -s(--source, --src) : 출발지 매칭. 도메인, IP 주소, 넷마스크 값을 이용하여 표기(패킷의 송신지를 제어)
- -d(--destination, --dst) : 목적지 매칭. 도메인, IP 주소, 넷마스크 값을 이용하여 표기(패킷의 수신지를 제어)
- -p : 프로토콜과 매칭. TCP, UDP, ICMP와 같은 이름을 사용하고 대소문자는 구분하지 않음(프로토콜을 제어)
- -p 옵션 뒤에 프로토콜 지정 추가 옵션
- --sport: 송신지 포트와 매칭(송신지 포트를 제어, 외부의 서비스하는 것을 제어)
- --dport: 수신지 포트와 매칭(수신지 포트를 제어, 자신이 서비스하는 것을 제어
- -p 옵션 뒤에 프로토콜 지정 추가 옵션
- -i(--in-interface) : 입력 인터페이스와 매칭
- -o(--out-interface) : 출력 인터페이스와 매칭
- -j(--jump) : 매치되는 패킷을 어떻게 처리할지 지정(방화벽을 지난 후 패킷의 상태를 제어)
- -f (--fragment): 분절된 패킷
- NAT
- 폭발적인 인터넷 사용인구의 증가로 인해 IP주소가 부족해지는 현상을 해결하는 방안으로 나온 기술
- 말 그대로 네트워크 주소를 변환하여 주는 역할
- 한 개의 공인 IP주소를 공유하여 여러대의 컴퓨터가 인터넷 접속이 가능하도록 하는 것이 대표적(SNAT)
- NAT 테이블에서 사용하는 체인
- PREROUTING : 외부에서 내부로 보낼때 변환하는 체인 (DNAT - 하나의 공인 IP주소로 다수의 서버를 운영하는 경우 사용)
- POSTROUTING : 내부에서 외부로 보낼때 변환하는 체인 (SNAT - 공인 IP주소 하나로 다수의 컴퓨터가 인터넷 접속 가능)
포트 포워딩
간단하게 말하면 포트(port)를 전달(forwarding)해 주는 거라고 생각하자 특정 포트로 들어오는 데이터 패킷을 다른 포트로 바꿔서 다시 전송을 해주는 작업
나는 개인과제에서 3000번 포트로 서버를 열고 AWS에 배포를 진행했다 URL에 3000 포트를 넣어주면 정상적으로 내가 배포한 웹서버에 접속할 수 있었다 하지만 3000 포트를 계속 적어주는 게 불편했기 때문에 http의 포트인 80번 포트로 들어오는 데이터 패킷을 3000 포트로 보내주는 작업인 포트 포워딩을 진행했다
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
포트 포워딩 이슈
오늘은 팀원이 포트 포워딩을 진행 했는데 작동을 하지 않는 이슈 발생했다 문제를 팀원과 함께 해결해보았다 처음에 설정한 포트가 제대로 열려있나 확인을 해봤다
netstat -tnlp
4000번으로 설정한 포트의 상태가 정상적이였다 그렇다면 iptables에 nat 테이블의 상태를 확인해 보기로 했다
sudo iptables -t nat -L --line-numbers
리스트에 4000번 포트 말고 3000번 포트가 있었다 3000번 포트로 포트 포워딩하는 설정이 먼저 입력이 되어있었다 그래서 순서대로 효력이 유효한 iptables특성으로 4000번 포트로 포트 포워딩을 해주지 않아 문제가 발생한 거였다 1번에 입력되어있는 잘못된 설정을 지워 준다
sudo iptables -t nat -D PREROUTING 1
테이블 설정을 제대로 하고 80번 포트로 접속하니까 정상적으로 작동이 되는 것을 확인했다
PM2
pm2는 프로세스 매니저(Process Manager) node.js를 사용할 때 패키지를 관리해주는 npm이 있다면 node.js나 express.js 프레임워크를 이용해 백엔드 사용하는 프로세스를 관리해주는 pm2이다!
AWS에서 express.js를 이용해서 웹서버를 실행하고 있어도 실행한 shell을 종료하면 웹서버가 꺼져버렸다 그렇다고 shell, PC도 끄지 않고 지속적으로 돌릴 수는 없다 pm2로 우리가 만든 응용프로그램을 관리해주고 온라인 상태로 유지하자
pm2는 관리자 권한이 필요해 잠깐 관리자 계정으로 진행한다
sudo -s
특정 폴더나 프로젝트가 아닌 전역 프로그램으로 설치를 진행한다 -g옵션은 Global의 약자로 전역이라는 뜻이라고 생각하자
npm install -g pm2
다운이 완료 되었다면 관리자 계정을 변환하도록 하자 관리자 계정은 필요할 때만 사용해야 한다
su ubuntu
pm2를 정상적으로 다운로드했다면 웹서버를 켜보자!
pm2 start app.js
pm2로 실행한 웹서버의 상태를 확인하고 싶다면
pm2 list
실행 중인 서버를 종료하고 싶다면 pm2 list에서 확인한 id를 이용 하자
pm2 delete 0
오늘은 내가 만든 웹서버를 AWS에 올리고 접속의 관한 설정과 서버를 유지하는 방법에 대해서 학습하고 실습을 진행해 보았다 그러다 팀원의 이슈를 보고 iptables와 포트 포워딩에 대해서 조금 더 학습을 진행하게 되었고 많은 도움이 되었다