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
'리눅스' 카테고리의 다른 글
[리눅스] 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 |
댓글