리눅스 iptables: Difference between revisions

From CS Wiki
(문서를 비움)
Tag: Blanking
 
(6 intermediate revisions by 3 users not shown)
Line 1: Line 1:
[[분류:리눅스]][[분류:리눅스 프로그램]]
==개요==
리눅스의 패킷 필터링(Packet Filtering) 도구로서 방화벽 구성이나 NAT(Network Address Translation)에 사용된다.


==사용법==
<pre class='shell'>
# iptables  [-t 테이블] [액션] [체인] [매치] [-j 타겟]
</pre>
===테이블(Table)===
* filter, nat, mangle, raw
* 명시하지 않으면 기본적으로 filter이다.
===액션(Action)===
* -A : APPEND : 정책 추가
* -I : INSERT : 정책 삽입
* -D : DELETE : 정책 삭제
* -R : REPLACE : 정책 교체
* -F : FLUSH : 모든 정책 삭제
* -P : POLICY : 기본 정책을 설정
* -L : LIST : 정책 나열
===체인(Chain)===
* INPUT
* OUTPUT
* FORWARD
* PREROUTING
* POSTROUTING
=== 매치(Match) ===
* -s : 출발지 매칭. 도메인, IP 주소, 넷마스크 값을 이용하여 표기(––source, ––src)
* -d : 목적지 매칭. 도메인, IP 주소, 넷마스크 값을 이용하여 표기(––destination, ––dst)
* -p : 프로토콜과 매칭. TCP, UDP, ICMP 와 같은 이름을 사용하고 대소문자는 구분하지 않음
* -i : 입력 인터페이스와 매칭(––in-interface)
* -o : 출력 인터페이스와 매칭(––out-interface)
* -j : 매치되는 패킷을 어떻게 처리할지 지정 (--jump)
== 타겟(target) ==
패킷이 규칙과 일치할 때 취하는 동작을 지정한다.
* ACCEPT : 패킷을 허용한다.
* DROP : 패킷을 버린다(패킷이 전송된 적이 없던 것처럼)
* REJECT : 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송한다.(icmp-port-unreachable)
* LOG : 패킷을 syslog에 기록한다.
* SNAT --to [주소] : 소스 IP를 [변환(NAT)|NAT]한다.
* DNAT --to [주소] : 목적지 IP를 변환(NAT)한다.
* RETURN : 호출 체인 내에서 패킷 처리를 계속한다.
== 정책 열람·저장·반영 ==
* 보기
<pre class='shell'>
# iptables -L
또는
# cat /etc/sysconfig/iptables
</pre>
* 저장
<pre class='shell'>
# service iptables save
</pre>
* 저장 & 불러오기
<pre class='shell'>
# iptables-save > firewall.sh
# iptables-restore < firewall.sh
</pre>
* '''정책을 추가한 다음 재시작이나 다른 조치를 하지 않아도 바로 적용된다.'''
== 예제 ==
* 192.168.10.22로 부터 들어오는 패킷들은 차단하는 정책을 추가<ref>http://q.fran.kr/문제/2748 리눅스마스터 1급 1501 필기 기출문제</ref>
<pre class='shell'>
# iptables -A INPUT 192.168.10.22 -j DROP
또는
# iptables -I INPUT 192.168.10.22 -j DROP
</pre>
* 192.168.10. 대역으로 부터 들어오는 패킷들은 차단하는 정책을 추가
<pre class='shell'>
# iptables -A INPUT 192.168.10.0/24 -j DROP
또는
# iptables -I INPUT 192.168.10.0/24 -j DROP
</pre>
* '''예제 조건'''<ref>http://q.fran.kr/문제/6515 리눅스마스터 1급 1501 실기 기출문제</ref>
** 패킷은 거부 메시지 없이 무조건 거절한다. (DROP)
** 두 번째 이더넷카드(eth1)로 들어오는 패킷인 경우에만 포워딩을 허가한다.
** 어떠한 방화벽도 설정되어 있지 않고 커널에서 포워딩을 허가한 상태이다.
<pre class='shell'>
# iptables -P FORWARD DROP
# iptables -A FORWARD -i eth1 -j ACCEPT
</pre>
* '''예제 조건'''<ref>http://q.fran.kr/문제/6483 리눅스마스터 1급 1602 실기 기출문제</ref>
** 해당 시스템에는 이더넷 카드가 두 개가 장착되어 있는데, 첫 번째 이더넷 카드에서 나가는 패킷에 대해 공인 IP 주소인 203.247.40.100을 할당한다.
<pre class='shell'>
# iptables –t nat –A POSTROUTING -o eth0 –j SNAT --to 203.247.40.100
</pre>
* '''예제 조건'''<ref>http://q.fran.kr/문제/6547 리눅스마스터 1급 1701 실시 기출문제</ref>
** 첫 번째로 기존에 설정된 정책을 전부 삭제한다.
** 두 번째로 INPUT 체인에 loopback 인터페이스에 들어오는 모든 패킷에 대해 허용 정책을 추가 한다.
** 세 번째로 INPUT 체인에 프로토콜이 tcp이며 목적지포트가 22번부터 23번 포트인 패킷에 대해 허용 정책을 추가 한다.
** 마지막으로 INPUT 체인에 대한 기본 정책을 거부 메시지 없이 거절로 변경한다.
<pre class='shell'>
# iptables -F INPUT
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -p tcp --dport 22:23 -j ACCEPT
# iptables -P INPUT DROP
</pre>
* '''예제 조건'''<ref>http://q.fran.kr/문제/6499 리눅스마스터 1급 1502 실시 기출문제</ref>
** 서버에서 외부로는 ping 테스트가 되고 외부에서 서버쪽으로는 ping 테스트가 되지 않도록 한다.
** iptables 명령어를 수행하는 서버의 IP는 192.168.10.1이다.
** INPUT 체인의 기본 정책은 DROP 이다.
**# 프로토콜은 icmp이며 icmp echo request 패킷이 외부로 나가는 것에 대해 허용한다.
**# 프로토콜은 icmp이며 외부에서 들어오는 icmp echo reply 패킷에 대해서 허용한다.
**# 프로토콜은 icmp이며 외부에서 들어오는 icmp destination-unreachable 패킷에 대해서 허용한다.
<pre class='shell'>
# iptables –A INPUT -p icmp --icmp-type echo-request -s 192.168.10.1 –d 0/0 -j ACCEPT
# iptables –A INPUT -p icmp --icmp-type echo-reply -s 0/0 –d 192.168.10.1 -j ACCEPT
# iptables –A INPUT -p icmp --icmp-type destination-unreachable -s 0/0 –d 192.168.10.1 -j ACCEPT
</pre>
* '''예제 조건'''<ref>http://q.fran.kr/문제/2963 리눅스마스터 1급 1601 필기 기출문제</ref>
** 대상 프로토콜 SSH
** 같은 IP 주소에서 60초 동안에 15번 이상 접속을 시도하면 DROP 시키는 정책을 추가
<pre class='shell'>
# iptables -A SSH -p udp --dport 22 -m recent --update--seconds 60 --hitcount 15 -j drop
</pre>
* '''삭제'''
** --line-number 옵션을 통해 정책의 번호를 확인한다.
<pre class='shell'>
iptables -L --line-numbers
</pre>
** -D 옵션을 지정하여 특정 번호의 정책을 삭제한다.
<pre class='shell'>
iptables -D INPUT [번호]
</pre>

Latest revision as of 22:54, 27 June 2024