기본으로 8080으로 뜨는 스프링부트 어플리케이션을 80으로 띄워야 할 때 매번 이 방법을 써먹었는데 이게 뭘 의미하는 명령어인지는 전혀 몰랐다. 하도 자주 써먹어서 이제 알아보자!
iptables란?
리눅스 방화벽 도구
패킷필터링 기능을 사용할 수 있게 해준다.
패킷 필터링이란?
지나가는 패킷의 해더를 보고 전체 패킷의 운명을 결정하는 것
패킷 = 해더 + 데이터 + ...
해더에 필터링할 정보 : 출발지IP:Port, 도착지IPLPort, checksum, 프롴토콜 옵션 등
데이터 = 전송할 데이터
iptables로 특정 조건을 가진 패킷에 대해 허용(ACCEPT) 또는 차단(DROP) 등을 지정할 수 있으며, 다양한 방식의 패킷 필터링과 처리 방식을 사용할 수 있다.
Chain
iptables의 제어 규칙을 정의하는 기본 단위, 패킷이 조작될 상태
기본 체인
- Chain INPUT : 외부 패킷이 서버로 들어오는 기본 정책
- Chain FORWARD : 서버에서 포워딩되는 기본 정책, 패킷이 서버를 통과하는 것으로 NAT(네크워트 공유) 기능 사용을 위한 것 즉, 해당 리눅스서버가 패킷의 목적지가 아니다!
- NAT (Network Address Translation) : 네트워크 주소 변환 서비스
- SNAT (Source NAT) : 내부 private ip -> public ip 로 변환
- DNAT (Destination NAT) : 외부에서 방화벽 (public ip)로 요청되는 주소를 private ip로 변환
- NAT (Network Address Translation) : 네트워크 주소 변환 서비스
- Chain OUTPUT : 서버에서 생성된 패킷이 외부로 나가는 기본 정책
패킷 -> INPUT -> Linux server -> OUTPUT ->
--------------FORWARD--------------->
iptables의 구조
iptables -A INPUT -s [발신지] --sport [발신지 포트] -d [목적지] --dport [목적지 포트] -j [정책]
- 기본정책으로 설정하는 방법
# iptables -P INPUT ACCEPT # iptables -P OUTPUT ACCEPT # iptables -P FORWARD ACCEPT
- 현재 방화병 규칙을 볼 수 있는 명령
# iptables --list 또는 # iptables -L
- 규칙 추가 후 저장
# service iptables save -> /etc/sysconfig/iptables 에 저장됨
iptables 명령어 옵션
--source (-s)
|
출발지 IP 주소
|
--destination (-d)
|
목적지 IP 주소
|
--protocol (-p)
|
특정 프로토콜
|
--in-interface (-i)
|
입력 인터페이스
|
--out-interface (-o)
|
출력 인터페이스
|
--state
|
연결 상태
|
--string
|
어플리케이션 계층 데이트 바이트 순서
|
--comment
|
커널 메모리 내의 규칙과 연계되는 주석 (최대 256 byte)
|
--syn (-y)
|
SYN 패킷을 허용하지 않음
|
--fragment (-f)
|
두 번째 이후의 조각에 대해 규칙 명시
|
--table (-t)
|
처리될 테이블
|
--jump (-j)
|
규칙에 맞는 패킷을 어떻게 처리 할 것인지 명시
|
--match (-m)
|
특정 모듈
|
ACCEPT
|
패킷을 허가
|
DROP
|
패킷을 버림
|
REJECT
|
패킷을 버리고 적절한 응답 패킷 전송
|
LOG
|
패킷을 syslog에 기록
|
RETURN
|
호출 체인 내에서 계속 패킷 처리
|
NEW
|
새로운 연결 요청 패킷
|
ESTABLISHED
|
기존 연결의 일부
|
RELATED
|
기존 연결에 속하나 새로운 연결을 요청
|
INVALID
|
연결 추적표에서 어느 곳에서 속하지 않는 것
|
-A (--append)
|
새로운 규칙 추가
|
-D (--delete)
|
규칙을 삭제
|
-C (--check)
|
패킷을 테스트
|
-R (--replace)
|
새로운 규칙으로 교체
|
-I (--insert)
|
새로운 규칙을 삽입
|
-L (--list)
|
규칙을 출력
|
-F (--flush)
|
체인으로부터 모두 삭제
|
-Z (--zero)
|
모든 체인의 패킷과 바이트 카운터 값 0으로 초기화
|
-N (--new)
|
새로운 체인 생성
|
-X (--delete-chain)
|
체인 삭제
|
-P (--policy)
|
기본정책 변경
|
예시
# iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
이걸 해석해보자면,
- -A : 새로운 규칙을 추가하겠다!
- PREROUTING : 패킷이 서버로 들어오기 전 규칙 vs POSTROUTING : 서버에서 나가는 규칙을 정의
즉 이 커맨드에서는 INPUT 정책 말고 다른걸 정의하겠다는 것 - -t : nat이라는 테이블을 처리할 것이다
- -i eth0 : ethernet0이라는 물리적 네트워크 인터페이스를 input interface로 사용할 것
- -p tcp : tcp 프로토콜을 사용할 것
- -dport : 서버에서 나가는 포트가 80일것
- -j REDIRECT : 서버를 통과하는 패킷을 redirect 시킬 것이다
- --to-port 8080 : 내부에서는 8080으로 보낼 것임
즉, 내부에서 8080 포트로 나와 통과하는 패킷들을 tcp 프로토콜을 사용하고, 80 포트로 리디렉 하겠다는 규칙을 iptable의 nat 테이블에 추가하겠다는 것!
# iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP
이건 127.0.0.1 즉, 로컬에서 들어오는 (INPUT) ICMP 패킷을 모두 버리는(DROP) 규칙을 iptables에 추가(-A) 하겠다는 뜻
1) 소스 ip가 192.168.0.111 인 접속의 모든 접속 포트를 막아라.
# iptables -A INPUT -s 192.168.0.111 -j DROP
2) INPUT 사슬에 출발지 주소가 127.0.0.1(-s 127.0.0.1) 인 icmp 프로토콜(-p icmp) 패킷을 거부(-j DROP)하는 정책을 추가(-A)하라
# iptables -A INPUT -p icmp -s 127.0.0.1 -j DROP
3) INPUT 사슬에 목적지 포트가 23번(--dport23)인 tcp 프로토콜(-p tcp) 패킷을 거부하는(-j DROP)규칙을 추가(-A) 하라.
# iptables -A INPUT -p tcp --dport 23 -j DROP
4) INPUT 사슬에 목적지 포트 번호가 80번(--dport 80)인 tcp 프로토콜(-p tcp)패킷을 받아들이는(-j ACCEPT) 규칙을 추가(-A) 하라
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
5) INPUT 사슬에 목적지 포트번호가 1023번 보다 작은 모든 포트(--dport :1023)인 tcp프로토콜(-p tcp)패킷을 거부하는(-j DROP)규칙을 추가(-A)하라
# iptables -A INPUT -p tcp --dport :1023 -j DROP
6) ftp포트를 열어라
# iptables -I INPUT -p tcp --dport 21 -j ACCEPT
7) imap 서비스를 방화벽에서 열어라
# iptables -I INPUT -s 192.168.0.0/255.255.255.0 -p udp --dport 143 -j ACCEPT
8) 웹서버 방화벽 열어라
# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
9) 웹서버 포트 80 -> 8880으로 교체하라( 웹서비스 포트 변경시 /etc/services 에서도 변경 해줘야 함)
# iptables -R INPUT 2 -p tcp --dport 8880 -j ACCEPT
10) domain-access_log 파일에 있는 모든 ip의 모든 접속 포트를 막아라(DOS공격 방어시 사용)
# cat domain-access_log |awk '{print $1}'|sort |uniq |awk '{print "iptables -A INPUT -s "$1" -j DROP"}'|/bin/bash
출처: https://linuxstory1.tistory.com/entry/iptables-기본-명령어-및-옵션-명령어 [Linux 세상속으로]
iptables 정책 순서
모든 방화벽은 순차적으로 실행된다. 즉 먼저 등록한 규칙의 효력이 유효하기 때문에 등록 순서가 매우 중요하다.
따라서 먼저 특정 포트를 열어주는 규칙을 먼저 정의하고, 이외에 다른 모든 패킷을 거부하는 규칙을 등록해야한다. 모든 패킷을 거부하는 규칙을 가장 먼저 선언하면 그 뒤에 어떤 포트를 열어주는 규칙을 아무리 정의해도 모두 무효하다.
References
'기술 > Linux' 카테고리의 다른 글
Linux/Java/VSCode) Gradle -> ERROR: JAVA_HOME is set to an invalid directory: 해결 (0) | 2021.08.23 |
---|---|
Linux/vscode) vscode로 remote 환경 연동, Error: EACCES: permission denied 에러 해결 (0) | 2021.07.09 |
리눅스/Ubuntu) 80포트 8080으로 포워딩 하기 (0) | 2021.06.30 |
리눅스/Ubuntu) Huge page 관련 실험 과정 (0) | 2021.04.13 |
리눅스/Linux) Ubuntu THP 활성화 / 비활성화 ~/transparent_hugepage/enabled (0) | 2021.04.13 |