728x90
728x170
iptables
- 패킷 필터링(Packet Filtering) 도구
- 방화벽 구성이나 NAT(Network Translation Address)에 사용된다.
(참고) iptables의 구조
더보기
- 커널 2.2 에서 사용되던 ipchains의 사슬(Chain) 구조를 그대로 승계함.
- 4계층 구조의 테이블(Table)을 만들어 사용하여 이름을 iptables라 명명하였음.
- ipchains와 거의 유사하게 사슬에 정책을 설정하여 사용함.
- 하지만, 기능과 역할을 강화하기 위해 테이블로 확장하여 테이블 별로 각각의 사슬을 지정하고 해당 사슬에 정책을 설정하도록 되어 있음.
- 5개의 테이블이 있음.
- FILTER
- iptables의 기본 테이블
- 패킷 필터링을 담당함.
- ipchains 이전 프로그램들은 FILTER 테이블만 가지고 사용되었다고 보면 됨.
- NAT
- Network Address Translation 의 약자
- IP 주소를 변환시키는 역할을 수행함.
- ipchains의 FORWARD 사슬 역할을 확장한 것
- 다음의 경우에 사용됨.
- 1개의 공인 IP 주소로 여러 대의 컴퓨터를 사용하고자 할 때
- 1개의 공인 IP 주소로 여러 대의 서버를 운영하고자 할 때
- MANGLE
- 패킷 데이터를 변경하는 특수 규칙을 적용하는 테이블
- 성능 향상을 위해 TOS(Type of Service)를 설정함.
- RAW
- 넷필터의 연결 추적 하위 시스템과 독립적으로 동작해야 하는 규칙을 설정하는 테이블
- SECURITY
- 리눅스 보안 모듈인 SELinux 에 의해 사용되는 MAC(Mandatory Access Control) 네트워크 관련 규칙이 적용됨.
- SECMARK 및 CONNSECMARK에 의해 활성화된 규칙이 등록됨.
- 현재 이 테이블은 FILTER 테이블 다음에 호출됨.
- DAC(Discretionary Access Control) 규칙이MAC 규칙보다 먼저 적용될 수 있음.
- FILTER
- 각 테이블은 고유한 사슬 집합 을 가지고 있음.
- 사용자가 INPUT_ESTABLISHED나 DMZ_NETWORK와 같은 공통 태그와 관련된 규칙 집합을 만들기 위해 사용자 정의 사슬을 생성할 수 있음.
(참고) iptables의 테이블과 사슬
더보기
- 커널 2.6.34 버전부터 nat 테이블에 INPUT 사슬이 추가됨.
- 패킷 필터링 및 방화벽 구성
- 기본 테이블인 FILTER의 3개의 사슬에 정책을 설정하면 됨.
- 다수의 서버 관리를 할 때
- filter 테이블 및 nat 테이블을 연동해서 사용함.
- NAT 테이블의 PREROUTING과 POSTROUTING 사슬
- 패킷 헤더를 수정하기 위해 사용함.
- 커널 내부에서 IP 라우팅 계산 수행 전과 후
- 패킷 헤더를 수정하기 위해 사용함.
FILTER 테이블의 사슬 및 기능
- INPUT
- 패킷 필터링 및 방화벽 관련 정책들을 설정하는 사슬
- 실제적인 접근 통제를 담당하는 역할을 수행함.
- 커널 내부에서 라우팅 계산을 마친 후, 로컬 리눅스 시스템이 목적지인 패킷(로컬 소켓이 목적지인 패킷)에 적용됨.
- OUTPUT
- 다른 시스템으로의 접근을 차단할 때 사용하는 사슬
- 리눅스 시스템 자체가 생성하는 패킷을 제어하는 사슬
- FORWARD
- 리눅스 시스템을 통과하는 패킷을 관리하는 사슬
- 한 네트워크를 다른 네트워크와 연결하기 위해 iptables 방화벽을 사용
- 두 네트워크 간의 패킷이 방화벽을 통과하는 경우에 사용됨.
- 사설 IP를 사용하는 시스템의 접근 제어 정책을 설정할 때 사용됨.
- NAT 테이블 기반으로, 하나의 공인 IP를 여러 대의 사설 IP를 사용하는 시스템들과 공유해서 사용할 경우
사용법
# iptables [-t table] action chain match [-j target]
- 테이블(Table)의 기본 설정 : Filter
- 다른 테이블을 지정할 때는 -t 옵션을 사용함.
- action
- 사슬을 지정, 설정, 제어할 때 사용함.
- 주로 -N, -A와 같은 대문자 옵션을 사용함.
- chain
- 사슬(Chain)을 명시함.
- 예) INPUT, OUTPUT
- 대소문자를 구분함.
- 사슬(Chain)을 명시함.
- 마지막으로 실질적인 룰에 해당하는 매치(match) 와 타겟(target)을 지정하면 됨.
- 매치는 -d, -p와 같은 소문자 옵션을 사용하여 설정함.
- 타겟은 -j(--jump) 옵션을 사용하여 설정함.
주요 액션(action)
액션 | 설명 |
-N | - 새로운(New) 사용자 정의 사슬을 만듦. - (--new-chain) |
-X | - 비어 있는 사슬을 제거함. - 단, 기본 사슬은 제거할 수 없음. - (--delete-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 재설정(Reset) 패킷 ▶ UDP 인 경우, ICMP 포트 도달 불가(Port Unreachable) 메시지 전송 |
RETURN | 호출 사슬 내에서 패킷 처리를 계속 진행 |
사용 예
예 1
- 기본 테이블인 Filter의 모든 사슬에 설정된 정책 정보 출력
# iptables -L
예 2
- 기본 테이블인 Filter의 모든 사슬에 설정된 정책 정보(포트, 프로토콜 등)를 숫자값으로 출력
# iptables -nL
예 3
- 기본 테이블인 Filter의 모든 사슬에 설정된 정책 정보를 패킷, 바이트 등을 추가하여 자세히 출력
# iptables -vL
예 4
- 기본 테이블인 Filter의 INPUT 사슬에 설정된 정책 정보 출력
# iptables -L INPUT
예 5
- NAT 테이블의 모든 사슬에 설정된 정책 정보 출력
# iptables -t nat -L
예 6
- 기본 테이블인 Filter의 모든 사슬에 설정된 정책을 모두 제거
# iptables -F
예 7
- 기본 테이블인 Filter의 INPUT 사슬에 설정된 정책을 모두 제거
# iptables -F INPUT
예 8
- INPUT 사슬에 발신지가 192.168.12.22 이고, 도착지가 localhost인 패킷을 거부(DROP) 시키는 정책을 추가
# iptables -A INPUT -s 192.168.12.22 -d localhost -j DROP
예 9
- INPUT 사슬에 발신지가 192.168.1.0 인 네트워크 대역에 속한 호스트들을 허가하는 정책을 추가
# iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
예 10
- INPUT 사슬에 발신지가 192.168.5.13 으로부터 들어오는 ICMP 패킷을 거부
# iptables -A INPUT -s 192.168.5.13 -p icmp -j DROP
예 11
- INPUT 사슬에 설정한 관련 정책 삭제
# iptables -D INPUT -s 192.168.5.13 -p icmp -j DROP
예 12
- 기본 테이블인 Filter의 INPUT 사슬에 설정된 정책 정보에 번호를 붙여서 출력
# iptables -L INPUT --line-number
예 13
- INPUT 사슬에 설정한 두 번째 정책 삭제
# iptables -D INPUT 2
예 14
- www.starrykss.org의 웹 사이트의 접속 차단
# iptables -A OUTPUT -p tcp -d www.starrykss.org --dport 80 -o eth0 -j DROP
예 15
- 공인 IP 주소를 사용하여 SNAT를 설정했을 경우에 사설 IP 대역 사용자들의 www.starrykss.org 웹사이트 접속을 차단함.
# iptables -A FORWARD -p tcp -d www.starrykss.org --dport 80 -o eth0 -j DROP
(참고) iptables 를 확장하여 사용하기
더보기
- 리눅스 커널 2.2 의 ipchains는 프로토콜 관련 정책 설정이 단순하였음.
- iptables는 -p 옵션 뒤에 프로토콜을 지정한 뒤, 추가적으로 사용할 수 있는 옵션이 제공됨.
(1) TCP 의 확장
- 먼저 -p tcp로 프로토콜을 지정하고, 추가로 지정할 옵션을 사용함.
- 관련 정보 확인 : iptables -p tcp -h
주요 옵션
- --sport
- 발신지에서의 하나의 포트 또는 포트 범위를 지정
- /etc/services에 기록된 포트 이름을 지정하거나, 포트 번호로 지정할 수 있음.
- 범위는 :를 사용하여 표기
- (--source-port)
- --dport
- 도착지의 포트를 지정하는 것
- 설정 방법 : --sport 옵션과 동일
- (--destination-port)
- --tcp-flags
- TCP flag 를 지정하는 옵션
- SYN, ACK, FIN, RST, URG, PSH, ALL, NONE를 지정할 수 있음.
- --syn
- 다음과 같음.
- --tcp-flags SYN
- RST
- ACK
- FIN SYN
- 다음과 같음.
(2) UDP 의 확장
- 먼저 -p udp로 프로토콜을 지정하고, 추가로 지정할 옵션을 사용함.
- TCP 의 확장 옵션 중, --sport 및 --dport를 지원함.
- 관련 정보 확인 : iptables -p udp -h
(3) ICMP 의 확장
- 먼저 -p icmp로 프로토콜을 지정하고, --icmp-type을 추가 옵션으로 지정함.
- 많이 사용하는 ICMP 타입값
- echo-request(8)
- echo-reply(0)
- destination-unreachable(3)
- 관련 정보 확인 : iptables -p icmp -h
주요 옵션
- --icmp-type : 숫자값 형태의 ICMP 타입값 또는 코드로 지정
(참고) iptables를 이용한 설정 예
더보기
에시 1
- 들어오는 모든 패킷을 거부하고, 192.168.12.22로부터 들어오는 패킷에 대해서만 허가
# iptables -P INPUT DROP
# iptables -A INPUT -s 192.168.12.22 -j ACCEPT
- -P 옵션을 사용해서 INPUT 사슬에 DROP을 지정하면, 기본 접근 정책이 거부로 변경됨.
- 그 후에 허가하려는 호스트를 지정하면 됨.
- -P 옵션을 이용하여 INPUT 사슬의 기본 정책을 DROP으로 설정할 경우
- TCP의 3-Way Handshaking 작업을 수행할 수 없어서 해당 방화벽 시스템에서 외부 관련 서비스 이용 시 차단되므로 주의해야 함.
예시 2
- 들어오는 모든 패킷을 허가하고, 192.168.1.18로 부터 들어오는 모든 패킷에 대해 거부
# iptables -P INPUT ACCEPT
# iptables -A INPUT -s 192.168.1.18 -j DROP
예시 3
- 192.168.4.40에서 들어오는 패킷 중, tcp 프로토콜 관련 패키지만 거부
# iptables -A INPUT -s 192.168.4.40 -p tcp -j DROP
- TCP 기반 서비스인 telnet, ssh 등은 이용할 수 없음.
- 그러나 ping 같은 ICMP 프로토콜을 사용하는 패킷은 허가됨.
예시 4
- 포트 번호가 20번부터 30번까지를 목적지로 들어오는 패킷들은 거부하고, ssh 포트가 22번인 포트만 허용
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# iptables -A INPUT -p tcp --dport 20:30 -j DROP
(참고) iptables 정채 설정 시 주의점
더보기
- iptables에서 중복된 설정이 있을 경우
- 먼저 등록된 것의 설정이 반영됨.
# iptables -A INPUT -p tcp --dport 20:30 -j DROP
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- 위의 순서대로 설정했을 경우, 22번 포트의 접속이 거부되므로 순서 설정에 유의해야 함.
iptables-save
- iptables 로 설정된 정책을 표준 출력(stdout)에 출력해주는 명령
- 출력 전환 리다이렉션 기호인 >와 조합해서 현재 설정된 정책을 파일로 저장할 수 있다.
사용법
# iptables-save [option]
주요 옵션
옵션 | 설명 |
-t | - 특정 테이블에 설정된 정책만 출력함. - (--table) |
-c | - 출력되는 정책 앞부분에 패킷수와 바이트(Byte) 를 표시해줌. - (--counters) |
사용 예
예 1
- 현재 설정된 정책을 화면에 출력함.
# iptables-save
예 2
- NAT 테이블에 설정된 정책만 출력함.
# iptables-save -t nat
예 3
- 설정된 정책의 앞부분에 관련된 패킷수와 바이트(Byte)를 함께 출력함.
# iptables-save -c
예 4
- 현재 설정된 정책을 firewall.sh 로 저장함.
# iptables-save > firewall.sh
iptables-restore
- iptables 의 정책 설정을 반영하는 명령
- 입력 전환 리다이렉션 기호인 <를 이용해서 iptables-save로 저장된 파일을 불러들일 때 사용한다.
사용법
# iptables-restore [option]
주요 옵션
옵션 | 설명 |
-c | - 출력되는 정책 앞부분에 패킷수와 바이트(Byte)를 표시해줌. - (--counters) |
-n | - 현재 설정된 정책을 초기화하지 않고 추가하는 형식으로 저장함. - (--noflush) |
사용 예
예
- firewall.sh 에 저장된 정책을 불러들여서 반영함.
# iptables-restore < firewall.sh>
728x90
그리드형(광고전용)
'System Software > Linux' 카테고리의 다른 글
[리눅스] KVM(Kernel-based Virtual Machine) (0) | 2022.03.18 |
---|---|
[리눅스] vsftpd (0) | 2022.03.17 |
[리눅스] /etc/httpd/conf/httpd.conf (0) | 2022.03.17 |
[리눅스] /etc/fstab (0) | 2022.03.17 |
[리눅스 명령어] ntpq / ntpdate (0) | 2022.03.16 |
[리눅스 명령어] named-checkconf / named-checkzone (0) | 2022.03.16 |
[리눅스 명령어] mailq / sendmail (0) | 2022.03.16 |
[리눅스 명령어] rpcinfo / exportfs / showmount / nfsstat (0) | 2022.03.16 |