본문 바로가기
리눅스

[리눅스] iptables

by 깅민 2022. 11. 2.

iptables

패킷 필터링 도구 (Packet Filtering)
방화벽 구성이나 NAT (Network Translation Address) 에 사용

옵션 설명
FILTER -iptables의 기본 테이블
-패킷 필터링
NAT -IP 주소를 변환
-1개의 공인 IP 주소로 여러 대의 컴퓨터를 사용하고자 할 때
-1개의 공인 IP 주소로 여러 대의 서버를 운영하고자 할 때
MANGLE -패킷 데이터를 변경하는 특수 규칙을 적용하는 테이블
-성능 향상을 위해 TOS(Type of Service)를 설정
RAW 넷필터의 연결 추적 하위 시스템과 독립적으로 동작해야 하는 규칙을 설정하는 테이블
SECURITY -리눅스 보안 모듈인 SELinux에 의해 사용되는 MAC(Mandatory Access Control) 네트워크 관련 규칙이 적용
-SECMARK 및 CONNSECMARK 에 의해 활성화된 규칙이 등록
-현재 이 테이블은 FILTER 테이블 다음에 호출, DAC(Discretionary Access Control) 규칙이 MAC 규칙보다 먼저 적용될 수 있다.

iptables의 테이블과 사슬

커널 2.6.34 버전부터 nat 테이블에 INPUT 사슬이 추가
패킷 필터링 및 방화벽 구성 - 기본 테이블인 FILTER의 3개의 사슬에 정책을 설정
다수의 서버 관리
- filter 테이블 및 nat 테이블을 연동해서 사용
- nat 테이블의 prerouting과 postrouting 사슬 -> 커널 내부에서 IP 라우팅 계산 수행 전과 후 패킷 헤더를 수정하기 위해 사용

옵션 설명
사슬 (Chain) 테이블 (Table)
FILTER NAT MANGLE RAW SECURITY
INPUT v v v   v
FORWARD v   v   v
OUTPUT v v v v v
PREROUTING   v v v  
POSTROUTING   v v    

입력패킷 -> nat PREROUTING -> 라우팅결정 -> filter FORWARD -> nat POSTROUTING -> 출력패킷

FILTER 테이블의 사슬 및 기능

INPUT
패킷 필터링 및 방화벽 관련 정책들을 설정하는 사슬
실제적인 접근 통제를 담당하는 역할 수행한다.
커널 내부에서 라우팅 계산을 마친 후, 로컬 리눅스 시스템이 목적지인 패킷 (로컬 소켓이 목적지인 패킷)에 적용된다.

OUTPUT
다른 시스템으로의 접근을 차단할 때 사용하는 사슬
리눅스 시스템 자체가 생성하는 패킷을 제어하는 사슬

FORWARD
리눅스 시스템을 통과하는 패킷을 관리하는 사슬
한 네트워크를 다른 네트워크와 연결하기 위해 iptables 방화벽을 사용 - 두 네트워크 간의 패킷이 방화벽을 통과하는 경우에 사용
사실 IP를 사용하는 시스템의 접근 제어 정책을 설정할 때 사용된다. - NAT 테이블 기반으로 하나의 공인 IP를 여러 대의 사설 IP를 사용하는 시스템들과 공유해서 사용할 경우

iptables [-t table] action chain match [-j target]

테이블의 기본 설정 : Filter
다른 테이블을 지정할 때는 -t옵션을 사용함

action - 사슬을 지정, 설정, 제어할 때 사용함, 주로 -N, -A와 같은 대문자 옵션

chain - 사슬을 명시함 예) INPUT, OUTPUT, 대소문자를 구분

마지막으로 실질적인 룰에 해당하는 매치(match)와 타겟(target)을 지정하면 됨
- 매치는 -d, -p와 같은 소문자 옵션을 사용하여 설정
- 타겟은 -j(--jump)옵션을 사용하여 설정

action

옵션 설명
-N 새로운 사용자 정의 사슬을 만듦
--new-chain
-X 비어 있는 사슬을 제거함
단, 기본 사슬은 제거할 수 없음 (--delet-chain)
-P 사슬의 기본 정책을 설정 (--policy)
-L 현재 사슬의 규칙을 나열함 (--list)
-F 사슬로부터 규칙을 제거함 (--flush)
-Z 사슬 내의 모든 규칙들의 패킷과 바이트의 카운트를 0으로 만듦 (--zero)
-A 사슬에 새로운 규칙을 추가함
해당 사슬의 맨 마지막 규칙으로 등록됨 (--append)
-I 사슬의 규칙을 맨 첫 부분에 삽입함
룰 넘버를 사용하여 특정 부분에 삽입할 수도 있음 (--insert)
-R 사슬의 규칙을 교환함 (--replace)
-D 사슬의 규칙을 제거함 (--delete)

Match

옵션 설명
-s 출발지 IP주소나 네트워크와 매칭, 도메인, IP주소, 넷마스크 값을 이용하여 표기
--source, --src
-d 목적지 IP주소나 네트워크와 매칭, 도메인, IP주소, 넷마스크 값을 이용하여 표기
--destination, --dst
-p 특정 프로토콜과 매칭
TCP, UDP, ICMP와 같은 이름 사용
대소문자는 구분하지 않음
이 옵션을 사용하지 않으면 모든 프로토콜이 대상이 됨
--protocol
-i 입력 인터페이스와 매칭
--in-interface
-o 출력 인터페이스와 매칭
--out-interface
! NOT의 의미로 사용
특정 매칭을 제외할 때 사용
-m 좀 더 세밀하게 제어할 때 사용하는 매칭 옵션
--match
--state 연결 상태와 매칭
INVALID, ESTABLISHED, NEW, RELATED를 사용
--string 특정한 패턴과 매칭

기타옵션

옵션 설명
-n 다른 옵션과 같이 사용
출력 정보를 숫자값으로 표현
--numeric
-v 다른 옵션과 같이 사용
패킷, 바이트수 등을 추가하여 정보를 자세히 출력
--verbose
--line-number 정책 앞에 번호를 붙여 출력
삭제나 삽입할 때 유용함

주요 타겟 (target) (-j, --jump)

옵션 설명
ACCEPT 패킷을 허가하는 것
본래 라우팅대로 진행
DROP 패킷을 거부하는 것
더 이상 어떤 처리도 수행하지 않고 버림
LOG 패킷을 syslog에 전달하여 기록
일반적으로 /var/log/messages에 저장
REJECT 패킷을 버리고 동시에 적당한 응답 패킷을 전달함
예)
TCP인 경우 TCP 재설정 패킷
UDP인 경우 ICMP 포트 도달 불가 메시지 전송
RETURN 호출 사슬 내에서 패킷 처리를 계속 진행

iptables의 설정 규칙 저장
-명령행에서 iptables로 설정한 정책들은 시스템이 재부팅되면 초기화된다.

-해당 정책을 지속적으로 반영하려면 설정 규칙을 저장해야 한다.
관련 명령어를 사용한 저장 방법
스크립트를 사용한 저장 방법
직접 쉘 스크립트를 작성하여 저장하는 방법

관련 명령어 사용

iptables-save


iptables로 설정된 정책을 표준 출력(stdout)에 출력해주는 명령
출력 전환 리다이렉션 기호인 > 와 조합해서 현재 설정된 정책을 파일로 저장할 수 있다.

iptables-save [option]

옵션 설명
-t 특정 테이블에 설정된 정책만 출력
-c 출력되는 정책 앞부분에 패킷수와 바이트를 표시해준다.


현재 설정된 정책을 화면에 출력

iptables-save


NAT 테이블에 설정된 정책만 출력함

iptables-save -t nat


설정된 정책의 앞부분에 관련된 패킷수와 바이트를 함께 출력함

iptables-save > firewall.sh

iptables-restore

iptables의 정책 설정을 반영하는 명령
입력 전환 리다이렉션 기호인 < 를 이용해서 iptables-save로 저장된 파일을 불러들일 때 사용한다.

iptables-restore [option]

옵션 설명
-n 현재 설정된 정책을 초기화하지 않고 추가하는 형식으로 저장 --noflush
-c 출력되는 정책 앞부분에 패킷 수와 바이트를 표시해준다. --counters


firewall.sh에 저장된 정책을 불러들여서 반영

iptables-restore < firewall.sh>

셸 스크립트 사용

사용자가 직접 셸 스크립트를 만들어 저장한 후에 반영하는 방법
다음의 문제점을 해소할 수 있다.
iptables-save 로 저장한 내용들이 직관적이지 못함
불러올 때는 iptables-restore 명령을 사용해야 하는 불편함
해당 파일을 /etc/rc.d/rc.local 파일에 등록하면, 재부팅하더라도 계속적으로 반영시킬 수 있다.

vi /etc/firewall.sh

#! /bin/bash
/sbin/iptables -F // filter table 초기화
/sbin/iptables -t nat -F // nat table 초기화

# 접근 차단
/sbin/iptables -A INPUT -s 192.168.4.20 -j DROp

# NAT 설정
/sbin/iptables -t nat -A PREROUTING -p tcp -d 203.247.50.224 --dport 80 -j DNAT \ --to 192.168.1.2:80

실행 권한 부여 및 실행 예

실행 권한 부여

chmod 755 /etc/firewall.sh

/etc/firewall.sh 를 실행하여 방화벽 정책을 적용

/etc/firewall.sh

부팅 시 적용 예

재부팅 후에도 계속 반영되도록 설정

echo "/etc/firewall.sh" >> /etc/rc.d/rc.local

chmod a+x /etc/firewall.sh

iptables에서 NAT의 분류 및 설정

iptables에서 NAT의 구분
SNAT (Source NAT) 공인 IP 주소 1개로 다수의 컴퓨터가 인터넷 접속이 가능하도록 하는 경우
DNAT (Destination) 1개의 공인 IP주소로 다수의 서버를 운영하는 경우

SNAT (Source NAT)

-패킷의 소스 주소인 발신지를 변경한다는 의미
-예) 방화벽 내부의 사설 IP주소를 사용하는 192.168.1.2인 컴퓨터가 www.ihd.or.kr과과 같은 웹 사이트를 방문하기 위해서는 공인 IP주소가 필요하다. - SNAT 정책을 설정하여 방화벽을 통과할 때 공인 IP 주소가 부여되도록 설정한다.
-SNAT는 라우팅 경로가 결정된 이후에 설정된다고 하여 NAT테이블의 POSTROUTING 사슬에 정책 설정을 한다.

eth0 장치를 통해 나가는 패킷에 203.247.50.3번 주소를 부여함.

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 203.247.50.3

eth0 장치를 통해 나가는 패킷에 203.247.50.3번 부터 203.247.50.7번 사이의 주소를 부여함

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 203.247.50.3-203.247.50.7

eth0 장치를 통해 나가는 패킷에 대해 할당된 공인 IP주소를 부여함
MASQUERADE는 유동 IP주소를 사용하는 경우에 설정함

iptables -t nat POSTROUTING -o eth0 -j MASQUERADE

DNAT (Destination NAT)

패킷의 도착지 주소를 변경한다는 의미
패킷의 목적지 주소가 먼저 변경되고, 그 변경된 주소로 새로운 라우팅 경로를 찾는다
라우팅 이전 단계에서 작용된다고 하여 NAT타입의 PREROUTING 사슬에 정책을 설정한다.

목적지 주소 203.247.50.3 의 80번 포트인 경우에 192.168.1.11의 80번 포트로 연결함

iptables -A PREROUTING -t nat -p tcp -d 203.247.50.3 --dport 80 -j DNAT --to 192.168.1.11:80

목적지 주소 203.247.50.3 의 25번 포트인 경우에 192.168.1.12의 25번 포트로 연결함

iptables -A PREROUTING -t nat -p tcp -d 203.247.50.3 --dport 25 -j DNAT --to 192.168.1.12:25

목적지 주소 203.247.50.3 의 53번 포트인 경우에 192.168.1.10의 53번 포트로 연결함

iptables -A PREROUTING -t nat -p udp -d 203.247.50.3 --dport 53 -j DNAT --to 192.168.1.10:53




1602
16. 다음은 하나의 공인 IP 주소를 공유해서 다수의 컴퓨터의 인터넷 사용이 가능하도록 설정하는 과정이다. ( 괄호 ) 안에 알맞은 내용을 적으시오.

# iptables –t ( ① ) –A ( ② ) ( ③ ) eth0 –j ( ④ ) --to 203.247.40.100

조 건
- 해당 시스템에는 이더넷 카드가 두 개가 장착되어 있는데, 첫 번째 이더넷 카드에서 나가는 패킷에 대해 공인 IP 주소인 203.247.40.100을 할당한다.

1. nat
2. POSTROUTING
3. -o
4. SNAT


2201

1. -L
2. -nL
3. -vL
4. -L INPUT
5. -t nat -L
6. -L INPUT --line-number(s)

정답
1. -F
2. -P
3. DROP
4. -A
5. -j ACCEPT


2002

1. nat
2. PREROUTING
3. tcp
4.--dport 80
5. DNAT
6. 192.168.0.4:80

1. iptables-save
2. >
3. -F
4. iptables-restore
5. <

1. --dport
2. 22
3. ACCEPT
4. 20:30
5. DROP


2102

1. nat
2. POSTROUTING
3. -o
4. SNAT


2001

1. iptables-save
2. >
3. -F
4. iptables-restore
5. <
6. -L 또는 --list -S 또는 --list-rules


1902

1. -F
2. -P
3. DROP
4. -A
5. -j ACCEPT


1802

1. -t nat -A POSTROUTING
2. -j SNAT
3. -t nat -A PREROUTING
4. -j DNAT





참고
https://starrykss.tistory.com/1815





'리눅스' 카테고리의 다른 글

[리눅스] NFS 서버  (0) 2022.11.04
[리눅스] 디스크 쿼터 Disk Quota, fstab, quotacheck...  (0) 2022.11.03
[리눅스] DNS 설정  (0) 2022.11.02
[리눅스] 아파치(apache) 웹 설정, httpd.conf  (0) 2022.11.01
[리눅스] sendmail  (0) 2022.10.30

댓글