-
[Linux] iptables 설정서버 2016. 10. 28. 09:45
iptables 세팅을 잘못하면 서버접속을 못하는 상황이 생기므로 신중하게 해야합니다.
iptables 옵션
테이블(tables)
우선 iptables에는 테이블이라는 광범위한 범주가 있는데, 이 테이블은 filter, nat, mangle, raw 같은 4개의 테이블로 구성되며, 이중에서 우리에게 필요한 것은 필터링 규칙을 세우는 filter 테이블입니다.
체인(chain)
iptables에는 filter 테이블에 미리 정의된 세가지의 체인이 존재하는데 이는 INPUT, OUTPUT, FORWARD 입니다. 이 체인들은 어떠한 네트워크 트래픽(IP 패킷)에 대하여 정해진 규칙들을 수행합니다.
가령 들어오는 패킷(INPUT)에 대하여 허용(ACCEPT)할 것인지, 거부(REJECT)할 것인지, 버릴(DROP)것인지를 결정합니다.
- INPUT : 호스트 컴퓨터를 향한 모든 패킷
- OUTPUT : 호스트 컴퓨터에서 발생하는 모든 패킷
- FORWARD : 호스트 컴퓨터가 목적지가 아닌 모든 패킷, 즉 라우터로 사용되는 호스트 컴퓨터를 통과하는 패킷
명령어(commond)
- -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) : 기본정책을 변경.
옵션이 두개인 이유는 룰을 적용받는 순서가 위에서부터 아래로 흐르는 방식이라서 허용 차단 순으로 사용을 해야 하기 때문입니다.
만약 차단 허용 순으로 룰이 만들어진다면 허용 룰은 차단 룰셋에서 버려지므로 적용받지 못하게 됩니다.
따라서 add를 한다면 기존의 다른 룰에 의해서 추가된 룰이 무시될 수도 있습니다. 그럴 땐 -A 대신 -I 를 사용하여 제일 상단에 추가되게 할 수 있습니다.
매치(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) : 특정 모듈과의 매치
타겟(target)
iptables는 패킷이 규칙과 일치할 때 동작을 취하는 타겟을 지원합니다.
- ACCEPT : 패킷을 받아들임.
- DROP : 패킷을 버림(패킷이 전송된 적이 없던 것처럼).
- REJECT : 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송.
- LOG : 패킷을 syslog에 기록.
- RETURN : 호출 체인 내에서 패킷 처리를 지속함.
REJECT는 서비스에 접속하려는 사용자의 액세스를 거부하고 connection refused라는 오류 메시지를 보여주는 반면 DROP은 말 그대로 telnet 사용자에게 어떠한 경고 메시지도 보여주지 않은 채 패킷을 드롭합니다. 관리자의 재량껏 이러한 규칙을 사용할 수 있지만 사용자가 혼란스러워하며 계속해서 접속을 시도하는 것을 방지하려면 REJECT를 사용하는 것이 좋습니다.
연결 추적(Connection Tracking)
iptables는 연결 추적(connection tracking)이라는 방법을 사용하여 내부 네트워크 상 서비스 연결 상태에 따라서 그 연결을 감시하고 제한할 수 있게 해줍니다. 연결 추적 방식은 연결 상태를 표에 저장하기 때문에, 다음과 같은 연결 상태에 따라서 시스템 관리자가 연결을 허용하거나 거부할 수 있습니다.
- NEW : 새로운 연결을 요청하는 패킷, 예, HTTP 요청
- ESTABLISHED : 기존 연결의 일부인 패킷
- RELATED : 기존 연결에 속하지만 새로운 연결을 요청하는 패킷, 예를 들면 접속 포트가 20인 수동 FTP의 경우 전송 포트는 사용되지 않은 1024 이상의 어느 포트라도 사용 가능하다.
- INVALID : 연결 추적표에서 어디 연결에도 속하지 않은 패킷
상태에 기반(stateful)한 iptables 연결 추적 기능은 어느 네트워크 프로토콜에서나 사용 가능합니다. UDP와 같이 상태를 저장하지 않는 (stateless) 프로토콜에서도 사용할 수 있습니다.
적용 상태 확인
$ iptables -nvL
특정 IP 차단
$ iptables -I INPUT -s xxx.xxx.xxx.xxx -j DROP
특정 IP 허용
$ iptables -A INPUT -s xxx.xxx.xxx.xxx -j ACCEPT
특정 포트 차단
$ iptables -A INPUT -p tcp --dport xxxx -j DROP
특정 IP 포트 허용
$ iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx --dport xxxx -j ACCEPT
INPUT 체인에 state 모듈 상태가 NEW이고 프로토콜이 tcp이고 목적지 포트가 2022인 패킷에 대해 허용 추가
$ -A INPUT -p tcp -m state --state NEW -m tcp --dport 2022 -j ACCEPT
적용된 규칙 삭제
$ iptables -D INPUT -p tcp -s xxx.xxx.xxx.xxx --dport xxxx -j ACCEPT
적용된 규칙 전부 삭제
$ iptables --flush
iptables 스크립트 파일
스크립트 파일을 작성해 자주 사용하는 iptables를 작성해 자동으로 실행할 수 있습니다. 여기서부터 예제는 우분투를 기준으로 작성했습니다.
centOS 파일 위치
/etc/sysconfig
우분투 파일 위치
/etc/iptables.rules
iptables 명령어
iptables-save
iptable에 내용을 저장할 수 있습니다. save라는 명령어지만 내부에 저장되지는 않아 output을 다른 파일로 저장해야 합니다.
# /sbin/iptables-save > /etc/iptables.rules
만약 /etc/iptables.rules를 바로 수정했으면 위 명령어는 필요없습니다.
iptables-restore
iptable-sava로 저장된 파일을 불러와서 iptables 내용을 다시 셋팅해줍니다.
$ /sbin/iptables-restore < /etc/iptables.rules
스크립트 예제
#!/bin/bash ========================================= iptables 내용 ----------------------------------------- cat /etc/iptables.rules ========================================= /sbin/iptables-restore < /etc/iptables.rules
위에 내용과 반대로 iptables-sava를 이용하여 반대에 경우도 만듭니다.
우분투 /etc/network/ 폴더를 보면 4개 디렉토리를 확인할 수 있습니다.
- if-down.d
- if-post-down.d
- if-pre-up.d
- if-up.d
if-pre-up.d 폴더에는 iptables-restore 스크립트를 넣어 둡니다. 네트워크가 살아나면서 먼저 if-post-up.d 폴더에 내용을 모두 실행 시킵니다. *넣어 둘때 퍼미션은 755
그리고 반대로 if-post-down에는 iptables-save 스크립트를 넣습니다. 그러면 네트워크가 stop 되기 전에 iptables 내용을 저장합니다.