반응형
Iptables
- iptables는 Netfilter에서 개발한 리눅스에서 방화벽 정책을 수립할 수 있는 도구로 2001년 리눅스 2.4 커널 배포 시점부터 리눅스의 일부분으로 제공되기 시작하였다. 1
- iptables의 가장 주된 기능은 패킷 필터링으로 들어오고 나가는 IP 패킷에 대하여 제어 기능을 구현할 수 있다.
- 패킷을 검사하고 해당 패킷을 허용할지 차단할지 결정하기 위해서는 특정한 기준이 필요하며 이러한 허용과 차단에 대한 기준을 정책이라고 한다.
table
- iptables에서의 테이블은 패킷 필터링이나 네트워크 주소 변환(NAT, Network Address Translation)과와 같은 iptables에서 제공하는 기능의 큰 범주(category)를 기술하는 용어로써 iptables의 구성요소 정도로 이해할 수 있다.
- 쉽게, iptables에서 table은 iptalbes의 기능을 큰 범주로 구분해 놓은 것이며,
iptables의 기본 테이블은 filter / NAT / magle / raw 테이블이 존재한다.
filter table
- filter 테이블은 iptables의 default 테이블이자 가장 핵심적인 테이블
- 특정 정책(rule)에 따라 패킷을 필터링하거나 허용하는 역할을 맡는다.
때문에 네트워크 방화벽의 정책(rule)을 설정할 때 가장 많이 사용되며 일반적으로 방화벽 정책을 세운다 함은 filter 테이블 정책을 세우는 것으로 이해된다. - 기본적으로 3개의 체인을 가진다.
NAT table
- 네트워크 주소 변환(NAT)에 관한 정책을 설정하는 테이블[foonote] 단 2, NAT테이블은 주소변환만 할 뿐 패킷을 차단하거나 허용하는 필터링 기능은 없다. 필터링과 관련된 정책은 filter 테이블에서 적용한다.[/footnote]
- nat테이블의 저액으로는 방화벽 외부에서 방화벽 내부로 향하는 패킷을 방화벽이 보호하는 내부 네트워크의 주소(사설 IP)로 변환해 주는 기능과, 방화벽 내부 네트워크에서 방화벽을 통해 외부 네트워크로 나갈 때 외부 IP주소(공인 IP)로 변환해 주는 기능으로 구분된다.
raw table
- Netfilter의 연결 추적(Connection Tracking) 시스템과는 독립적으로 동작해야 하는 정책을 적용하고자 할 때 사용되며 NOTRACK 타겟과 함께 사용한다.
- NOTRACK은 특정 패킷에 대하여 conntrack을 하지 않도록 할 때 사용되는 타깃이다. 테이블에서는 적용할 수 없고, -m state --state New와 같은 stateful inspection 정책에는 사용하면 안 된다.
- 서버에 접속 수가 많아져 conntrack_max값이 초과되면 정상적인 패킷도 드롭되는 문제가 발생할 수 있다. 이러한 문제를 완화하기 위해 자주 사용되는 패킷은 conntrack을 거치지 않도록 설정할 수 있는데 이때 사용되는 것이 NOTRACK 타깃이다.
- 예) 80(HTTP)서비스에 대하여 CONNTRACK을 하지 않도록 적용한 정책
iptables -t raw -A INPUT -p tcp --dprot 80 -j NOTRACK
chain
- 패킷이 iptables 내부에서 이동(처리)하는 경로를 나타낸다.
- iptables에는 INPUT / OUTPUT / FORWARD / PREROUTING / POSTROUTING 체인이 존재한다.
- 테이블들은 각자 다른 체인을 가지고 있으며 일반적으로 INPUT, OUTPUT, FORWARD 체인이 가장 많이 사용된다.
INPUT chain
- 방화벽으로 들어오는 패킷(입력 패킷). 즉, 목적지 주소가 방화벽 IP인 모든 패킷
- 커널 내부에서 라우팅 처리를 마친 후 목적지가 방화벽인 패킷에 대한 정책을 설정할 때 사용한다.
OUTPUT chain
- 방화벽에서 나가는 패킷(출력 패킷). 즉, 출발지 주소가 방화벽 IP인 모든 패킷
- 방화벽 자체에서 외부로 나가는 패킷에 적용되는 정책을 설정할 때 사용한다.
FORWARD chain
- 네트워크 간 패킷이 iptables 방화벽을 거쳐서 통신하는 경우
- 출발지 IP나 목적지 IP가 방화벽 IP와는 무관하지만, 방화벽을 거쳐야만 통신할 수 있는 패킷에 대한 정책을 설정할 때 사용된다
macth
- iptables에서 패킷을 처리할 때 패킷이 만족해야 하는 조건을 가리킨다. 즉, 이 조건을 만족시키는 패킷에만 규칙을 적용한다.
target
- 패킷이 조건으로 설정한 규칙과 일치할 때 수행하는 동작
- 조건으로 설정한 규칙과 일치함은 매치에 설정된 모든 내용이 일치함을 의미하며, 수행하는 동작은 패킷을 허용(ACCEPT)하거나 차단(DROP)하는 iptables에서 처리될 최종 행위를 의미한다. 상용 방화벽들은 타겟(target)이라는 용어보다 액션(action)이라는 용어를 사용하고 있다.
- 조건으로 설정한 규칙과 일치함은 매치에 설정된 모든 내용이 일치함을 의미하며, 수행하는 동작은 패킷을 허용(ACCEPT)하거나 차단(DROP)하는 iptables에서 처리될 최종 행위를 의미한다.
iptables 기본 사용법
iptables의 현재 버전 확인(-V, Version)
iptables -V
테이블에 적용된 정책 확인 (-L, --list)
iptables -T [테이블] -L [체인]
filter 테이블의 모든 정책 확인
iptables -t filter -L
nat 테이블의 모든 정책 확인
iptables -t nat -L
filter테이블의 INPUT 체인 정책만 표시
iptables -t filter -L INPUT
filter테이블의 OUTPUT 체인 정책만 표시
iptables -L OUTPUT
nat테이블의 PREROUTING체인 정책만 표시
iptables -t nat -L PREROUTING
firewall 정지
systemctl stop firewalld.service
INPUT 체인의 정책 삭제
iptables -F INPUT
test 체인 생성
Iptables -N test
test체인의 타겟을 ACCEPT로 설정
iptables -A test -j ACCEPT
INPUT체인의 정책 타겟을 test로 지정
iptables -A INPUT -j test
test 체인 삭제
iptables -X test
INPUT테이블에 ACCEPT 정책 설정
iptables -P INPUT ACCEPT
INPUT테이블에 DROP 정책 설정
iptables -P OUTPUT DROP
설정 예시
더보기
1) 방화벽 담당자인 Host PC IP(192.168.0.24)에서만 방화벽으로 ssh 접속이 되어야 한다.(다른 모든 IP에서의 ssh 접속은 차단)
2) 모든 IP에서 방화벽으로 ping이 되어야 한다.
3) 방화벽에서는 외부의 모든 DNS서버로 DNS 쿼리를 할 수 있어야 한다.
4) 각 체인의 기본 정책은 DROP으로 되어 있으며 변경할 수 없다. (fwstart.sh 스크립트 실행)
5) 모든 정책에 대하여 각각 로그를 기록하여야 한다. (로그 이름은 각자 임의로 지정하여 준다.)
INPUT
iptables -A INPUT -s 192.168.0.24 -p tcp --dport 22 -j LOG --log-prefix “ssh_accpet_log”
iptables -A INPUT -s 192.168.0.24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp –dport 22 -j LOG --log-prefix “ssh_drop”
iptables -A INPUT -p tcp –dport 22 -j DROP
iptables -A INPUT -p icmp -j LOG --log-prefix “icmp_accept”
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p udp --sport 53 -j LOG --log-prefix “dns_accpet”
iptables -A INPUT -p udp --sport 53 -j ACEEPT
OUTPUT
iptables -A OUTPUT -d 192.168.0.24 -p tcp --sport 22 -j LOG --log-prefix “ssh_accpet”
iptables -A OUTPUT -d 192.168.0.24 -p tcp --sport 22 -j ACCEPT
iptables -A OUTPUT -p tcp –sport 22 -j LOG --log-prefix “ssh_drop”
iptables -A OUTPUT -p tcp –sport 22 -j DROP
iptables -A OUTPUT -p icmp -j LOG --log-prefix “icmp_accept”
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j LOG --log-prefix “dns_accpet”
iptables -A OUTPUT -p udp --dport 53 -j ACEEPT
--------------------------------------------------------------------------------------------------
INPUT
iptables -A INPUT -s 192.168.0.24 -p tcp --dport 22 -j LOG --log-prefix “ssh_accpet”
iptables -A INPUT -s 192.168.0.24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp –dport 22 -j LOG --log-prefix “ssh_drop”
iptables -A INPUT -p tcp –dport 22 -j DROP
iptables -A INPUT -p icmp -j LOG --log-prefix “icmp_accept”
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED.RELATED -j LOG --log-prefix “accept_input”
iptables -A INPUT -m conntrack --ctstate ESTABLISHED.RELATED -j ACCEPT
OUTPUT
iptables -A OUTPUT -p udp --dport 53 -j LOG --log-prefix “dns_accpet”
iptables -A OUTPUT -p udp --dport 53 -j ACEEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED.RELATED -j LOG --log-prefix “accept_output”
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED.RELATED -j ACCEPT
반응형
'Linux' 카테고리의 다른 글
[Kali Linux] VirtualBox에 Kali Linux 설치 (0) | 2020.02.27 |
---|---|
LILO(Linux Loader) (0) | 2019.10.11 |
Linux Mint (0) | 2019.07.14 |
[File System] ext (EXTended file system) (0) | 2019.07.13 |
리눅스 디렉터리 (0) | 2019.07.07 |
댓글