리눅스 iptables: 두 판 사이의 차이
IT위키
편집 요약 없음 |
편집 요약 없음 |
||
(사용자 7명의 중간 판 10개는 보이지 않습니다) | |||
13번째 줄: | 13번째 줄: | ||
===액션(Action)=== | ===액션(Action)=== | ||
* -A : APPEND : 정책 추가 | * -A: APPEND: 정책 추가 | ||
* -I : INSERT : 정책 삽입 | * -I: INSERT: 정책 삽입 | ||
* -D : DELETE : 정책 삭제 | * -D: DELETE: 정책 삭제 | ||
* -R : REPLACE : 정책 교체 | * -R: REPLACE: 정책 교체 | ||
* -F : FLUSH : 모든 정책 삭제 | * -F: FLUSH: 모든 정책 삭제 | ||
* -P : POLICY : 기본 정책을 설정 | * -P: POLICY: 기본 정책을 설정 | ||
* -L : LIST : 정책 나열 | * -L: LIST: 정책 나열 | ||
===체인(Chain)=== | ===체인(Chain)=== | ||
29번째 줄: | 29번째 줄: | ||
=== 매치(Match) === | === 매치(Match) === | ||
* -s : 출발지 매칭. 도메인, IP 주소, 넷마스크 값을 이용하여 표기(––source, ––src) | * -s: 출발지 매칭. 도메인, IP 주소, 넷마스크 값을 이용하여 표기(––source, ––src) | ||
* -d : 목적지 매칭. 도메인, IP 주소, 넷마스크 값을 이용하여 표기(––destination, ––dst) | * -d: 목적지 매칭. 도메인, IP 주소, 넷마스크 값을 이용하여 표기(––destination, ––dst) | ||
* -p : 프로토콜과 매칭. TCP, UDP, ICMP 와 같은 이름을 사용하고 대소문자는 구분하지 않음 | * -p: 프로토콜과 매칭. TCP, UDP, ICMP 와 같은 이름을 사용하고 대소문자는 구분하지 않음 | ||
* -i : 입력 인터페이스와 매칭(––in-interface) | * -i: 입력 인터페이스와 매칭(––in-interface) | ||
* -o : 출력 인터페이스와 매칭(––out-interface) | * -o: 출력 인터페이스와 매칭(––out-interface) | ||
* -j : 매치되는 패킷을 어떻게 처리할지 지정 (--jump) | * -j: 매치되는 패킷을 어떻게 처리할지 지정 (--jump) | ||
== | == 타깃(target) == | ||
패킷이 규칙과 일치할 때 취하는 동작을 지정한다. | 패킷이 규칙과 일치할 때 취하는 동작을 지정한다. | ||
* ACCEPT : 패킷을 허용한다. | * ACCEPT: 패킷을 허용한다. | ||
* DROP : 패킷을 버린다(패킷이 전송된 적이 없던 것처럼) | * DROP: 패킷을 버린다(패킷이 전송된 적이 없던 것처럼) | ||
* REJECT : 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송한다. | * REJECT: 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송한다.(icmp-port-unreachable) | ||
* LOG : 패킷을 syslog에 기록한다. | * LOG: 패킷을 syslog에 기록한다. | ||
* SNAT --to [주소] : 소스 IP를 [변환(NAT)|NAT]한다. | * SNAT --to [주소]: 소스 IP를 [변환(NAT)|NAT]한다. | ||
* DNAT --to [주소] : 목적지 IP를 변환(NAT)한다. | * DNAT --to [주소]: 목적지 IP를 변환(NAT)한다. | ||
* RETURN : 호출 체인 내에서 패킷 처리를 계속한다. | * RETURN: 호출 체인 내에서 패킷 처리를 계속한다. | ||
== 정책 열람·저장·반영 == | == 정책 열람·저장·반영 == | ||
53번째 줄: | 53번째 줄: | ||
또는 | 또는 | ||
# cat /etc/sysconfig/iptables | # cat /etc/sysconfig/iptables | ||
</pre> | |||
* 차단 횟수 및 byte 수 포함하여 보기 | |||
<pre class="shell"> | |||
# iptables -L -nvx | |||
</pre> | </pre> | ||
* 저장 | * 저장 | ||
<pre class= | <pre class="shell"> | ||
# service iptables save | # service iptables save | ||
또는 | |||
# iptables-save | |||
</pre> | </pre> | ||
66번째 줄: | 73번째 줄: | ||
</pre> | </pre> | ||
* '''정책을 추가한 다음 | * '''정책을 추가한 다음 save만 하면 된다. 서비스를 restart할 필요는 없다.''' | ||
== 예제 == | == 예제 == | ||
* 192.168.10. | |||
<pre class= | === 특정 IP 및 IP 대역 차단 === | ||
# iptables -A INPUT 192.168.10.22 -j DROP | (참고) IDS/IPS나 WAF로부터 악성 공격을 일삼는 IP를 차단하는 경우 C 클래스 대역을 통째로 차단해주는 것을 권장한다. (특히 해외 IP인 경우) | ||
* 차단 정책 적용 후 iptables-save를 꼭 해야 함을 명심하자 | |||
'''단순 차단 예제''' | |||
* 192.168.10.22로부터 들어오는 패킷들은 차단하는 정책을 추가<ref>http://q.fran.kr/문제/2748 리눅스마스터 1급 1501 필기 기출문제</ref> | |||
<pre class="shell"> | |||
# iptables -A INPUT -s 192.168.10.22 -j DROP | |||
또는 | |||
# iptables -I INPUT -s 192.168.10.22 -j DROP | |||
</pre> | |||
* 192.168.10. 대역으로부터 들어오는 패킷들은 차단하는 정책을 추가 | |||
<pre class="shell"> | |||
# iptables -A INPUT -s 192.168.10.0/24 -j DROP | |||
또는 | |||
# iptables -I INPUT -s 192.168.10.0/24 -j DROP | |||
</pre> | </pre> | ||
<pre class= | |||
# iptables - | * 차단 정책 추가 시 코멘트(주석)를 추가해서 기록을 남겨주는 것이 좋다. | ||
<pre class="shell"> | |||
# iptables -A INPUT -s 192.168.10.0/24 -j DROP -m comment --comment "bruteforce ip 20240516" | |||
</pre> | </pre> | ||
* | * 앞단에 방화벽이나 LB가 있는 경우 X-Forwarded-For IP를 기준으로 해야 하는 경우도 있다. | ||
<pre class= | <pre class="shell"> | ||
# iptables -A INPUT | # iptables -A INPUT -m string --string "x-forwarded-for: 111.222.333.444" --algo bm --icase -j DROP | ||
</pre> | </pre> | ||
<pre class= | |||
# iptables - | * X-Forwarded-For를 쓸 때 대역으로 차단하고 싶다면 여기선 서브넷이 아닌 일부 IP만 적어야 한다. 문자열 일치 기준으로 검사하기 때문 | ||
<pre class="shell"> | |||
# iptables -A INPUT -m string --string "x-forwarded-for: 111.222.333" --algo bm --icase -j DROP | |||
</pre> | </pre> | ||
=== 기본 차단, 인터페이스별 포워딩 === | |||
* '''예제 조건'''<ref>http://q.fran.kr/문제/6515 리눅스마스터 1급 1501 실기 기출문제</ref> | * '''예제 조건'''<ref>http://q.fran.kr/문제/6515 리눅스마스터 1급 1501 실기 기출문제</ref> | ||
** 패킷은 거부 메시지 없이 무조건 거절한다. (DROP) | ** 패킷은 거부 메시지 없이 무조건 거절한다. (DROP) | ||
109번째 줄: | 137번째 줄: | ||
# iptables -A INPUT -i lo -j ACCEPT | # iptables -A INPUT -i lo -j ACCEPT | ||
# iptables -A INPUT -p tcp --dport 22:23 -j ACCEPT | # iptables -A INPUT -p tcp --dport 22:23 -j ACCEPT | ||
# iptables -P INPUT | # iptables -P INPUT DROP | ||
</pre> | </pre> | ||
115번째 줄: | 143번째 줄: | ||
** 서버에서 외부로는 ping 테스트가 되고 외부에서 서버쪽으로는 ping 테스트가 되지 않도록 한다. | ** 서버에서 외부로는 ping 테스트가 되고 외부에서 서버쪽으로는 ping 테스트가 되지 않도록 한다. | ||
** iptables 명령어를 수행하는 서버의 IP는 192.168.10.1이다. | ** iptables 명령어를 수행하는 서버의 IP는 192.168.10.1이다. | ||
** INPUT 체인의 기본 정책은 | ** INPUT 체인의 기본 정책은 DROP이다. | ||
**# 프로토콜은 icmp이며 icmp echo request 패킷이 외부로 나가는 것에 대해 허용한다. | **# 프로토콜은 icmp이며 icmp echo request 패킷이 외부로 나가는 것에 대해 허용한다. | ||
**# 프로토콜은 icmp이며 외부에서 들어오는 icmp echo reply 패킷에 대해서 허용한다. | **# 프로토콜은 icmp이며 외부에서 들어오는 icmp echo reply 패킷에 대해서 허용한다. | ||
123번째 줄: | 151번째 줄: | ||
# 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 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 | # iptables –A INPUT -p icmp --icmp-type destination-unreachable -s 0/0 –d 192.168.10.1 -j ACCEPT | ||
</pre> | |||
* '''예제 조건''' | |||
** 로드 밸런서나 프록시 등을 통해 들어온 경우X-Forwarded-For을 사용하여 차단 | |||
** String을 기반으로 차단 규칙 설정 | |||
<pre class="shell"> | |||
# iptables -I INPUT -p tcp --dport 80 -m string --string "X-Forwarded-For: 111.222.111.222" --algo bm -j DROP | |||
</pre> | </pre> | ||
* '''예제 조건'''<ref>http://q.fran.kr/문제/2963 리눅스마스터 1급 1601 필기 기출문제</ref> | * '''예제 조건'''<ref>http://q.fran.kr/문제/2963 리눅스마스터 1급 1601 필기 기출문제</ref> | ||
** 대상 프로토콜 SSH | ** 대상 프로토콜 SSH | ||
** 같은 IP 주소에서 60초 동안에 15번 이상 접속을 시도하면 | ** 같은 IP 주소에서 60초 동안에 15번 이상 접속을 시도하면 DROP시키는 정책을 추가 | ||
<pre class='shell'> | <pre class='shell'> | ||
# iptables -A SSH -p udp --dport 22 -m recent --update--seconds 60 --hitcount 15 -j drop | # iptables -A SSH -p udp --dport 22 -m recent --update--seconds 60 --hitcount 15 -j drop | ||
141번째 줄: | 176번째 줄: | ||
iptables -D INPUT [번호] | iptables -D INPUT [번호] | ||
</pre> | </pre> | ||
== 참고 문헌 == |
2024년 5월 20일 (월) 00:16 판
개요
리눅스의 패킷 필터링(Packet Filtering) 도구로서 방화벽 구성이나 NAT(Network Address Translation)에 사용된다.
사용법
# iptables [-t 테이블] [액션] [체인] [매치] [-j 타겟]
테이블(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: 호출 체인 내에서 패킷 처리를 계속한다.
정책 열람·저장·반영
- 보기
# iptables -L 또는 # cat /etc/sysconfig/iptables
- 차단 횟수 및 byte 수 포함하여 보기
# iptables -L -nvx
- 저장
# service iptables save 또는 # iptables-save
- 저장 & 불러오기
# iptables-save > firewall.sh # iptables-restore < firewall.sh
- 정책을 추가한 다음 save만 하면 된다. 서비스를 restart할 필요는 없다.
예제
특정 IP 및 IP 대역 차단
(참고) IDS/IPS나 WAF로부터 악성 공격을 일삼는 IP를 차단하는 경우 C 클래스 대역을 통째로 차단해주는 것을 권장한다. (특히 해외 IP인 경우)
- 차단 정책 적용 후 iptables-save를 꼭 해야 함을 명심하자
단순 차단 예제
- 192.168.10.22로부터 들어오는 패킷들은 차단하는 정책을 추가[1]
# iptables -A INPUT -s 192.168.10.22 -j DROP 또는 # iptables -I INPUT -s 192.168.10.22 -j DROP
- 192.168.10. 대역으로부터 들어오는 패킷들은 차단하는 정책을 추가
# iptables -A INPUT -s 192.168.10.0/24 -j DROP 또는 # iptables -I INPUT -s 192.168.10.0/24 -j DROP
- 차단 정책 추가 시 코멘트(주석)를 추가해서 기록을 남겨주는 것이 좋다.
# iptables -A INPUT -s 192.168.10.0/24 -j DROP -m comment --comment "bruteforce ip 20240516"
- 앞단에 방화벽이나 LB가 있는 경우 X-Forwarded-For IP를 기준으로 해야 하는 경우도 있다.
# iptables -A INPUT -m string --string "x-forwarded-for: 111.222.333.444" --algo bm --icase -j DROP
- X-Forwarded-For를 쓸 때 대역으로 차단하고 싶다면 여기선 서브넷이 아닌 일부 IP만 적어야 한다. 문자열 일치 기준으로 검사하기 때문
# iptables -A INPUT -m string --string "x-forwarded-for: 111.222.333" --algo bm --icase -j DROP
기본 차단, 인터페이스별 포워딩
- 예제 조건[2]
- 패킷은 거부 메시지 없이 무조건 거절한다. (DROP)
- 두 번째 이더넷카드(eth1)로 들어오는 패킷인 경우에만 포워딩을 허가한다.
- 어떠한 방화벽도 설정되어 있지 않고 커널에서 포워딩을 허가한 상태이다.
# iptables -P FORWARD DROP # iptables -A FORWARD -i eth1 -j ACCEPT
- 예제 조건[3]
- 해당 시스템에는 이더넷 카드가 두 개가 장착되어 있는데, 첫 번째 이더넷 카드에서 나가는 패킷에 대해 공인 IP 주소인 203.247.40.100을 할당한다.
# iptables –t nat –A POSTROUTING -o eth0 –j SNAT --to 203.247.40.100
- 예제 조건[4]
- 첫 번째로 기존에 설정된 정책을 전부 삭제한다.
- 두 번째로 INPUT 체인에 loopback 인터페이스에 들어오는 모든 패킷에 대해 허용 정책을 추가 한다.
- 세 번째로 INPUT 체인에 프로토콜이 tcp이며 목적지포트가 22번부터 23번 포트인 패킷에 대해 허용 정책을 추가 한다.
- 마지막으로 INPUT 체인에 대한 기본 정책을 거부 메시지 없이 거절로 변경한다.
# iptables -F INPUT # iptables -A INPUT -i lo -j ACCEPT # iptables -A INPUT -p tcp --dport 22:23 -j ACCEPT # iptables -P INPUT DROP
- 예제 조건[5]
- 서버에서 외부로는 ping 테스트가 되고 외부에서 서버쪽으로는 ping 테스트가 되지 않도록 한다.
- iptables 명령어를 수행하는 서버의 IP는 192.168.10.1이다.
- INPUT 체인의 기본 정책은 DROP이다.
- 프로토콜은 icmp이며 icmp echo request 패킷이 외부로 나가는 것에 대해 허용한다.
- 프로토콜은 icmp이며 외부에서 들어오는 icmp echo reply 패킷에 대해서 허용한다.
- 프로토콜은 icmp이며 외부에서 들어오는 icmp destination-unreachable 패킷에 대해서 허용한다.
# 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
- 예제 조건
- 로드 밸런서나 프록시 등을 통해 들어온 경우X-Forwarded-For을 사용하여 차단
- String을 기반으로 차단 규칙 설정
# iptables -I INPUT -p tcp --dport 80 -m string --string "X-Forwarded-For: 111.222.111.222" --algo bm -j DROP
- 예제 조건[6]
- 대상 프로토콜 SSH
- 같은 IP 주소에서 60초 동안에 15번 이상 접속을 시도하면 DROP시키는 정책을 추가
# iptables -A SSH -p udp --dport 22 -m recent --update--seconds 60 --hitcount 15 -j drop
- 삭제
- --line-number 옵션을 통해 정책의 번호를 확인한다.
iptables -L --line-numbers
- -D 옵션을 지정하여 특정 번호의 정책을 삭제한다.
iptables -D INPUT [번호]
참고 문헌
- ↑ http://q.fran.kr/문제/2748 리눅스마스터 1급 1501 필기 기출문제
- ↑ http://q.fran.kr/문제/6515 리눅스마스터 1급 1501 실기 기출문제
- ↑ http://q.fran.kr/문제/6483 리눅스마스터 1급 1602 실기 기출문제
- ↑ http://q.fran.kr/문제/6547 리눅스마스터 1급 1701 실시 기출문제
- ↑ http://q.fran.kr/문제/6499 리눅스마스터 1급 1502 실시 기출문제
- ↑ http://q.fran.kr/문제/2963 리눅스마스터 1급 1601 필기 기출문제