2022. 11. 24. 17:30ㆍ리눅스(Linux)
Iptables이란?
- Iptables란 Linux 운영체제에서 특정 IP주소에 대한 OS의 동작을 정의해 놓는 Kernel 프로그램이다.
- 기본 User Level의 명령이지만, 동작 자체는 Kernel 단계에서 packet을 Filtering 하며 동작하게 된다.
- Linux kernel은 기본적으로 "netfilter" 기능이 존재하며, 우리가 iptables를 사용하는 것은 실제로는 "netfilter"를 정의하는 행위가 된다.
- Packet의 기본 구조는 Packet의 정보를 담고 있는 Header와 실제 packet의 내용이 담겨있는 Data로 구분된다, iptables는 Packet의 Header를 검사하여 Filtering을 진행 한다.
- Iptables의 기본구조 ( "Table" -> "Chain" -> "Rule" ) 형식으로 구성
- 주로 사용되는 Table은 Filter Table, NAT Table 2가지를 사용한다.
$ Iptables Table의 종류
Filter Table
- 실제 packet Filtering을 적용하는 Table, rule에 따라서 packet을 허용 혹은 차단하는 역할을 진행한다. ( INPUT, OUTPUT, FORWARD 3가지 Chain을 갖는다 )
- INPUT은 외부에서 방화벽으로 들어오는 packet을 담당하며, OUTPUT은 방화벽에서 나가는 packet을 담당한다.
- FORWARD는 방화벽으로 들어오는 packet이 아닌, 방화벽 내부에 있는 또 다른 서버로 향하는 packet을 담당하여 Filtering을 진행한다.
- INPUT, OUTPUT은 한대의 Linux Server에서 방화벽 과 다른 Service를 동시에 운영할 때 사용되고, FORWARD는 방화벽과 Service를 운영하는 Server가 다를 때 사용된다.
Nat Table
- NAT 테이블은 Packet을 Filtering 하거나 특성을 변환하는 기능은 없다, 단지 방화벽으로 향하는 packet을 방화벽이 보호하는 내부 네트워크의 다른 주소로 Forwarding 하거나 방화벽 내부 네트워크에서 방화벽을 통해 외부 네트워크로 나갈 때 다른 주소로 변환시켜 주는 역할을 한다.
- NAT Table은 POSTROUTING , PREROUTING 2가지 Chain을 주로 사용한다.
- POSTROUTING은 Source NAT (SNAT) Target 과 매칭되어 내부 네트워크에서 방화벽을 통해 외부로 나갈 때 사용, PREROUTI은 Destination NAT (DNAT) Target 과 매칭되어 주로 외부에서 방화벽 내부 서버로 향하는 packet을 방화벽이 보호하는 내부서버로 Forwarding 할 때 사용
- POSTROUTING은 사무실 등에서 사설IP를 사용하면서 하나의 공인 IP로 인터넷을 공유하고자 할 때, PREROUTING은 사설 IP 를 이용한 서버를 운영하면서 외부로 Service 할 때 사용
Mangle Table
- 자주 사용되지는 않지만 packet의 TTL이나 TOS 값을 변경 할 때 사용된다. ( 즉, packet의 특성을 변경할 때 사용되는 Table )
- Mangle Table은 PREROUTING 과 OUTPUT 2가지 Chain으로 이루어져 있다, PREROUTING 방화벽으로 들어오는 packet에 대해 변경하고, OUTPUT은 내부에서 생성된 packet이 방화벽을 통해 나갈 때 변경한다.
Raw Table
- Filter 테이블의 Connection Tracking ( 연결추적 ) 기능을 좀더 자세히 다룰 때 사용된다.
- 특정 네트워크는 연결 추적에서 제외 하는 설정이 가능하며 conntrack 모듈 ( 연결추적 모듈 )보다 우선순위를 가진다.
$ Iptables 명령어 사용 형식
- 기본 사용형식 ( "iptables [ -t table ] 명령어 [ Match option ] [ target ]" )
- 테이블명은 생략이 가능하며, 생략 시 "filter Table이 기본값"으로 설정 된다.
- iptables 작업시에는 반드시 "대소문자"를 구분하여 설정한다.
- iptables는 "명령어, 설정파일" 설정 2가지 형식으로 룰을 정의 할 수 있다.
- 명령어에 의한 룰설정은 "즉시적용", 설정파일을 이용 한 경우에는 "서비스를 반드시 재 시작"을 진행한다.
$ 명령어의 종류
- iptables에서 룰을 추가하거나 삭제 수정 등의 작업을 수행 할 명령어를 정의한다.
-A ( --append ) : 새로운 규칙을 추가한다. ( "여러 개의 룰 중 가장 마지막 라인에 추가" )
-D ( --delete ) : 규칙을 삭제한다.
-I ( --insert ) : 새로운 규칙을 삽입한다. ( "여러 개의 룰 중 가장 처음 라인에 추가" )
-L ( --list ) : 규칙을 출력한다.
-F ( --flush ) : chain으로부터 규칙을 모두 삭제한다.
-P ( --policy ) : 기본정책을 변경한다.
-Z ( --zero ) : 모든 chain의 Packet과 바이트 카운터 값을 0 으로 만든다.
-N ( --new ) : 새로운 chain을 만든다.
-X ( --delete-chain ) : chain을 삭제한다.
-C ( --check ) : Packet을 테스트한다.
-R ( --replace ) : 새로운 규칙으로 교체한다.
$ Match Option
- iptables에서 Packet을 처리 할 때 만족해야 하는 조건을 지정한다.
--source ( -s ) : 출발지 IP주소나 네트워크와의 Match
--destination ( -d ) : 목적지 ip주소나 네트워크와의 Match
--sport / --dport : 출발지 포트/목적지 포트를 Match
--protocol ( -p ) : 특정 프로토콜과의 Match ( "tcp, udp, icmp, !tcp = tcp가 아닌 나머지 프로토콜지정" )
--in-interface ( -i ) : 들어오는 Interface ( "시스템에 여러 개의 인터페이스가 존재할때만 사용" )
--out-interface ( -o ) : 나가는 Interface ( "시스템에 여러 개의 인터페이스가 존재할때만 사용" )
--tcp ( flag ) : TCP 6개의 Flag를 지정하여 Match ( "SYN, ACK, FIN, PSH, URG, RST" )
- 비정상적인 패킷을 필터링 할 때 주로 사용
- flag 지정 외의 ALL, NONE등의 옵션도 사용이 가능하다.
- "--syn" 옵션의 경우 따로 사용도 가능하다.
--icmp-type ( ICMP Type & code ) : ICMP의 상태코드 및 Type을 지정하여 Match
- echo-request, echo-reply 등의 타입과 상태코드를 지정 한다.
--match ( -m ) : 특정 모듈과의 Match
--limit ( Option ) : 지정한 시간 동안 최대 Match 횟수를 정의 한다.
- 서비스 거부 공격을 어느정도 방어 할 수 있다. ( "하드웨어 성능이 좋을 경우에만 해당" )
- 지정 시간 옵션 : /second, /minute, /hour, /day
- "--limit-burst" 옵션을 정의하여 초당, 분당, 시간당, 하루당 등에 매치될 수 있는 패킷의 수를 결정할 수 있다.
- EX : -m limit --limit 5/m --limit-burst 10 -j LOG ( 10개 까지는 로그에 바로 기록, 이후에는 5분에 한 번씩 로그를 남긴다. )
- EX : -m limit --limit 5/m --limit-burst 5 -j DROP ( 5분내의 5번째까지는 버리고, 이후에는 5분에 한번씩 버린다. )
--state : 연결 상태와의 Match
- NEW : 새로운 연결을 요청하는 packet
- ESTABLISHED : 기존 연결의 일부인 packet
- RELATED : 기존 연결에 속하지만 새로운 연결을 요청하는 packet, ( EX : FTP 접속포트는 21번, 데이터 전송 포트는 20번 혹은 1024번 이상의 랜덤 포트인 경우가 해당 된다 )
- INVALID : 연결 추적 표에서 어디 연결에도 속하지 않은 packet
- EX : -m state --state RELATED
--string : 애플리케이션 계층 데이터 바이트 순서와의 Match
--comment : Kernel 메모리 내의 규칙과 연계되는 최대 256바이트 주석
--fragment ( -f ) : 두 번째 이후의 조각에 대해서 규칙을 명시한다.
--table ( -t ) : 처리될 테이블
--jump ( -j ) : 규칙에 맞는 Packet을 어떻게 처리할 것인가를 명시한다.
$ Target
- iptables는 Packet이 Match Option과 일치 할 때 취할 동작을 Target에서 정의한다.
ACCEPT : Packet을 허용한다.
DROP : Packet을 거부한다. ( "응답 메시지를 전송하지 않는다" )
REJECT : Packet을 거부하고 이와 동시에 적절한 응답 Packet을 전송 한다. ( "응답 메시지를 전송" )
LOG : Packet을 syslog에 기록한다
$ IPTABLES 정책적용 실습
- 모든 테이블에 모든 체인 정책 초기화 후 작업 진행 (NAT, Filter)
- SSL 및 DNS는 정책만 적용 후 실테스트는 진행하지 않는다
- 그 외 나머지는 테스트를 정상적으로 정책이 적용이 되었는지 확인
- 4번, 5번의 경우 Match Option을 참조하여 설정
- 기본 필터 정책의 경우 DROP으로 설정 후 작업진행
1. NAT(POSTROUTING)설정 및 XP에서 BT로 SSL(443) / SSH(22) 허용
- BackTrack SSH 시작 : root@bt:~# service ssh start
- BackTrack SSH Key 설정 : root@bt:~# sshd-generate
2. XP에서 BT로 ssh접속 연결은 허용, 반대로 XP로 접속은 안되게 설정
3. XP에서 외부 DNS ( "168.126.63.1" ) 서비스 가능하도록 설정
4. icmp로 통신하는 내용을 5번째 까지는 로그로 남기고, 이후에는 1분에 하나씩 로그남기게 설정
5. icmp로 통신 시 5번까지는 차단, 이후에는 1분에 하나씩 막도록 설정
# iptables -t filter -L
- iptable 확인, chain부분만 잘 확인하면 성공
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere anywhere udp dpt:domain
ACCEPT tcp -- anywhere anywhere tcp dpt:domain
ACCEPT udp -- anywhere anywhere udp dpt:bootps
ACCEPT tcp -- anywhere anywhere tcp dpt:bootps
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere
INPUT_direct all -- anywhere anywhere
INPUT_ZONES all -- anywhere anywhere
DROP all -- anywhere anywhere ctstate INVALID
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
# iptables -t filter -D INPUT 5
- 5라인에 input 지우겠다.
# iptables -F
- iptables 초기화
# iptables -t nat -F
- nat 테이블 초기화
iptables -L
- 라우팅테이블 확인
iptables -t filter -L
- 필터라는 이름의 라우팅테이블 확인.
iptables -t filter -L --line
- 필터라는 라우팅테이블 번호매겨서 출력.
iptables -t filter -D INPUT 5
- 필터라는 테이블에 input5번째줄 삭제.
iptables -t nat -F
- nat테이블 -F옵션으로 초기화
iptables -t nat -A POSTROUTING -s 192.168.206.0/24 -o ens34 -j MASQUERADE
- iptables에 192.168.206.0/24 출발하면 ens34 인터페이스카드로 보내는 라우팅정보 입력
# iptables -A INPUT -s 192.168.206.0/24 -p icmp --icmp-type echo-request -j ACCEPT
- input 체인에 206.0대역의 icmp 요청을 허용
# iptables -A OUTPUT -d 192.168.206.0/24 -p icmp --icmp-type echo-reply -j ACCEPT
- output 체인에 206.0대역의 icmp 응답을 허용
# iptables -A FORWARD -s 192.168.206.0/24 -p tcp --dport 80 -j ACCEPT
- 192.168.206.0/24 대역대로 오는 tcp 80번 포트 허용
# iptables -A FORWARD -d 192.168.206.0/24 -p tcp --sport 80 -j ACCEPT
- 192.168.206.0/24 대역대로 가는 tcp 80번 포트 허용
# vi ./myfirewall.sh
#!/bin/bash
iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp --sport 80 -j ACCEPT
iptables -A FORWARD -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -p tcp --sport 22 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/m --limit-burst 5 -j LOG
- limit burst(limit 적용되기 전까지 5횟수 log기록 남기고) limit정책(1분의 1개 주기)로 log기록 남기겠다.
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
- input체인에 에코 request 허용
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
- output체인에 에코 reply 허용
# chmod +x ./myfirewall.sh
# ./myfirewall.sh
'리눅스(Linux)' 카테고리의 다른 글
[Centos 7] 네트워크 명령어(ifconfig, Network Manager, route, netstat, IP Binding) (0) | 2022.11.24 |
---|---|
[Centos 7] Linux Firewalld(방화벽) (0) | 2022.11.24 |
web 보안 솔루션 (0) | 2022.11.24 |
Hostnamectl & Systemctl (0) | 2022.11.24 |
[Centos 7] Linux Kernel 관리 (0) | 2022.11.24 |