iptables
커널의 IP 패킷 필터링 ( Packet Fintering ) 기능을 하는 Netfilter에 규칙을 설정하고 관리하는 도구
'체인(Chain)' 이라고 불리는 방향성을 가진 '규칙(Rule)'을 연결한 테이블(table)이다.
Packet Filtering
네트워크를 통과하는 모든 패킷들은 패킷 헤더에 출발지와 목적지 그리고 어떤 프로토콜을 이용하지에 관한 정보를 담고 있음
이러한 패킷의 헤더 정보를 보고 호스트로 들어오는 패킷 (INPUT)과 나가는 패킷(OUTPUT), 통과하는 패킷(FORWARD)패킷 등을 검사하여 불필요한 패킷이나 잘못된 패킷을 폐기
(DROP) 하고 규칙과 일치하는 패킷만 허용 (ACCEPT) 시키는 기능을 함
INPUT 체인 : 호스트에 들어온 패킷이 통과하는 곳
OUTPUT 체인 : 나가는 패킷이 통과하는 곳
FORWARD 체인 : 다른 호스트로 전달되는 패킷이 통과하는 곳
체인에 필터링 규칙을 추가 시켜두면 각각의 경로를 통과할 때 패킷을 검사할 수 있음
패킷 필터링 설정 순서
> 체인의 기본동작 ( 허용이나 거부)를 설정
> 패킷을 검사할 규칙 ( Rule ) 을 체인에 추가
1) 테이블 ( table )
filter : 패킷 필터링에 사용되는 테이블 (기본값)
nat : 출발지 및 목적지 IP 주소와 포트 번호를 변환하는 NAT에서 사용되는 테이블
mangle : 패킷 헤더의 특별한 갱신에 사용되는 테이블
raw : 연결을 추적하지 않는 패킷의 처리에 사용되는 테이블
2) 옵션 ( option )
-A (--append) : 새로운 규칙을 추가한다.
-D (--delete) : 규칙을 삭제한다.
-C (--check) : 패킷을 테스트한다.
-R (--replace) : 새로운 규칙으로 교체한다
-I (--insert) : 새로운 규칙을 삽입한다.
-L (--list) : 규칙을 출력한다.
-F (--flush) : chain으로부터 규칙을 모두 삭제한다.
-Z (--zero) : 모든 chain의 패킷과 바이트 카운터 값을 0으로 만든다.
-N (--new) : 새로운 chain을 만든다.-X (--delete-chain) : chain을 삭제한다.
-P (--policy) : 기본정책을 변경한다.
3) 매치 ( match )
iptables에서 패킷을 처리할때 만족해야 하는 조건을 가리킨다. 즉, 이 조건을 만족시키는 패킷들만 규칙을 적용한다.
--source (-s) : 출발지 IP주소나 네트워크와의 매칭
--destination (-d) : 목적지 ip주소나 네트워크와의 매칭
--protocol (-p) : 특정 프로토콜과의 매칭
--in-interface (i) : 입력 인테페이스
--out-interface (-o) : 출력 인터페이스
--state : 연결 상태와의 매칭
--string : 애플리케이션 계층 데이터 바이트 순서와의 매칭
--comment : 커널 메모리 내의 규칙과 연계되는 최대 256바이트 주석
--syn (-y) : SYN 패킷을 허용하지 않는다.
--fragment (-f) : 두 번째 이후의 조각에 대해서 규칙을 명시한다.
--table (-t) : 처리될 테이블
--jump (-j) : 규칙에 맞는 패킷을 어떻게 처리할 것인가를 명시한다.
--match (-m) : 특정 모듈과의 매치
4) 타겟(target)
iptables는 패킷이 규칙과 일치할 때 동작을 취하는 타겟을 지원한다.
ACCEPT : 패킷을 받아들인다.
DROP : 패킷을 버린다(패킷이 전송된 적이 없던 것처럼).
REJECT : 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송한다.
LOG : 패킷을 syslog에 기록한다.
RETURN : 호출 체인 내에서 패킷 처리를 계속한다.
REJECT는 서비스에 접속하려는 사용자의 액세스를 거부하고 connection refused라는 오류 메시지를 보여줌
DROP은 말 그대로 telnet 사용자에게 어떠한 경고 메시지도 보여주지 않은 채 패킷을 드롭
5) 연결 추적(Connection Tracking)
iptables는 연결 추적(connection tracking)이라는 방법을 사용하여 내부 네트워크 상 서비스 연결 상태에 따라서 그 연결을 감시하고 제한할 수 있게 해준다. 연결 추적 방식은 연결 상태를 표에 저장하기 때문에, 다음과 같은 연결 상태에 따라서 시스템 관리자가 연결을 허용하거나 거부할 수 있다.
NEW : 새로운 연결을 요청하는 패킷, 예, HTTP 요청
ESTABLISHED : 기존 연결의 일부인 패킷
RELATED : 기존 연결에 속하지만 새로운 연결을 요청하는 패킷, 예를 들면 접속 포트가 20인 수동 FTP의 경우 전송 포트는 사용되지 않은 1024 이상의 어느 포트라도 사용 가능하다.
INVALID : 연결 추적표에서 어디 연결에도 속하지 않은 패킷
상태에 기반(stateful)한 iptables 연결 추적 기능은 어느 네트워크 프로토콜에서나 사용 가능하다. UDP와 같이 상태를 저장하지 않는 (stateless) 프로토콜에서도 사용할 수 있다.
iptables -L // 설정되어 있는 규칙 확인
iptables -nL // -n, --numeric Source 와 Destination의 IP와 포트를 숫자로 출력
iptables -L --line-numbers // --line-numbers 라인번호 + 리스트 형태로 출력, 규칙제거 시 유용
iptables -D INPUT 1 // INPUT체인에 1번라인 규칙 제거
iptables -D INPUT -A INPUT -i lo -j ACCEPT // 규칙 내용 이용 ( 제거하고자 하는 규칙을 모두 작성하는 방식 )
iptables -F // -F,--flush 체인 내의 모든 규칙제거, 방화벽 초기화
규칙 작성 예제
-p tcp TCP 프로토콜
-s 192.168.0.0/24 출발지 IP 주소 192.168.0.0/24
--sport 22 출발지 포트 번호가 22 번 (ssh)
-d 172.17.0.1 목적지 IP 주소 172.17.0.1
--dport 53 목적지 포트번호 53번
기본 설정
1. 기본 정책을 ACCEPT로 변경
iptables -P INPUT ACCEPT
2. 체인에 정의된 모든 규칙 삭제
iptables -F
3. INPUT 체인에 로컬호스트 인터페이스에 들어오는 모든 패킷을 허용 추가
iptables -A INPUT -i lo -j ACCEPT
소프트웨어들이 localhost 와 통신이 되어야 하기에 필요함
4. INPUT 체인에 프로토콜이 tcp이며 목적지 포트가 22번인 패킷에 대해 허용 추가
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT // SSH 접속 허용
5. 설정한 내용 저장
service iptables save
iptables은 위에서 밑으로 읽어내리므로 순서가 매우 중요하다. 하나하나 여러가지 실습을 해보고 익히도록 하자
기본 동작
> 패킷에 대한 동작은 위에서 부터 차례로 각 규칙에 대해 검사하고, 그 규칙과 일치하는 패킷에 대하여 타겟에 지정한 ACCEPT, DROP등을 수행한다.
> 규칙이 일치하고 작업이 수행되면, 그 패킷은 해당 규칙의 결과에 따리 처리하고 체인에서 추가 규칙을 무시한다.
> 패킷이 체인의 모든 규칙과 매치하지 않아 규칙의 바닥에 도달하면 정해진 기본정책(policy)이 수행된다.
> 기본 정책은 policy ACCEPT , policy DROP 으로 설정할 수 있다.
일반적으로 기본정책은 모든 패킷에 대해 DROP을 설정하고 특별히 지정된 포트와 IP주소등에 대해 ACCEPT를 수행하게 만든다.
'Server > Linux' 카테고리의 다른 글
Linux // SAMBA (0) | 2018.04.04 |
---|---|
Linux // FTP (0) | 2018.04.03 |
Linux // NFS (0) | 2018.04.02 |
Linux // DNS (0) | 2018.03.31 |
Linux // DHCP (0) | 2018.03.31 |