최신판 |
당신의 편집 |
1번째 줄: |
1번째 줄: |
| [[분류:리눅스]][[분류:리눅스 프로그램]]
| |
| ==개요== | | ==개요== |
| 리눅스의 패킷 필터링(Packet Filtering) 도구로서 방화벽 구성이나 NAT(Network Address Translation)에 사용된다. | | 리눅스의 패킷 필터링(Packet Filtering) 도구로서 방화벽 구성이나 NAT(Network Address Translation)에 사용된다. |
|
| |
|
| ==사용법==
| | ==체인(Chain)== |
| <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 | | * INPUT |
| * OUTPUT | | * OUTPUT |
| * FORWARD | | * 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'> | | <pre class='shell'> |
| # iptables -L | | # iptables -L |
| 또는
| |
| # cat /etc/sysconfig/iptables
| |
| </pre> | | </pre> |
|
| |
|
| * 차단 횟수 및 byte 수 포함하여 보기 | | * 정책파일 직접 열기 |
| <pre class="shell"> | | <pre class='shell'> |
| # iptables -L -nvx | | # cat /etc/sysconfig/iptables |
| </pre> | | </pre> |
|
| |
|
| * 저장 | | == 정책 변경 옵션 == |
| <pre class="shell"> | | * -A : ADD : 정책 추가 |
| # service iptables save
| | * -D : DELETE : 정책 삭제 |
| 또는
| | * -R : REPLACE : 규칙 교체 |
| # iptables-save
| | * -F : FLUSH : 모든 규칙 삭제 |
| | ---- |
| | * 예제 : 192.168.10.22로 부터 들어오는 패킷들은 차단하는 정책을 추가<ref>http://q.fran.kr/문제/2748 리눅스마스터 1급 1501 필기 기출문제</ref> |
| | <pre class='shell'> |
| | http://q.fran.kr/문제/2748 |
| </pre> | | </pre> |
|
| |
|
| | == 정책 저장·반영 == |
| * 저장 & 불러오기 | | * 저장 & 불러오기 |
| <pre class='shell'> | | <pre class='shell'> |
72번째 줄: |
34번째 줄: |
| # iptables-restore < firewall.sh | | # iptables-restore < firewall.sh |
| </pre> | | </pre> |
| | | * 저장 |
| * '''정책을 추가한 다음 save만 하면 된다. 서비스를 restart할 필요는 없다.'''
| | <pre class='shell'> |
| | # service iptables save |
| | </pre> |
|
| |
|
| == 예제 == | | == 예제 == |
|
| |
| === 특정 IP 및 IP 대역 차단 ===
| |
| (참고) 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 class="shell">
| |
| # iptables -A INPUT -s 192.168.10.0/24 -j DROP -m comment --comment "bruteforce ip 20240516"
| |
| </pre>
| |
|
| |
| * 앞단에 방화벽이나 LB가 있는 경우 X-Forwarded-For IP를 기준으로 해야 하는 경우도 있다.
| |
| <pre class="shell">
| |
| # iptables -A INPUT -m string --string "x-forwarded-for: 111.222.333.444" --algo bm --icase -j DROP
| |
| </pre>
| |
|
| |
| * 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>
| |
|
| |
| === 기본 차단, 인터페이스별 포워딩 ===
| |
| * '''예제 조건'''<ref>http://q.fran.kr/문제/6515 리눅스마스터 1급 1501 실기 기출문제</ref> | | * '''예제 조건'''<ref>http://q.fran.kr/문제/6515 리눅스마스터 1급 1501 실기 기출문제</ref> |
| ** 패킷은 거부 메시지 없이 무조건 거절한다. (DROP) | | ** 패킷은 거부 메시지 없이 무조건 거절한다. (DROP) |
137번째 줄: |
64번째 줄: |
| # 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 DROP | | # iptables -P INPUT -P |
| </pre> | | </pre> |
|
| |
|
143번째 줄: |
70번째 줄: |
| ** 서버에서 외부로는 ping 테스트가 되고 외부에서 서버쪽으로는 ping 테스트가 되지 않도록 한다. | | ** 서버에서 외부로는 ping 테스트가 되고 외부에서 서버쪽으로는 ping 테스트가 되지 않도록 한다. |
| ** iptables 명령어를 수행하는 서버의 IP는 192.168.10.1이다. | | ** iptables 명령어를 수행하는 서버의 IP는 192.168.10.1이다. |
| ** INPUT 체인의 기본 정책은 DROP이다. | | ** INPUT 체인의 기본 정책은 DROP 이다. |
| **# 프로토콜은 icmp이며 icmp echo request 패킷이 외부로 나가는 것에 대해 허용한다. | | **# 프로토콜은 icmp이며 icmp echo request 패킷이 외부로 나가는 것에 대해 허용한다. |
| **# 프로토콜은 icmp이며 외부에서 들어오는 icmp echo reply 패킷에 대해서 허용한다. | | **# 프로토콜은 icmp이며 외부에서 들어오는 icmp echo reply 패킷에 대해서 허용한다. |
152번째 줄: |
79번째 줄: |
| # 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> | | </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>
| |
|
| |
| * '''예제 조건'''<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>
| |
|
| |
| == 참고 문헌 ==
| |