ி 개요
기본 방화벽
이며, 타 방화벽보다 빠르고 트래픽도 적다.iptables에서 방화벽 규칙을 세우고,
패킷 필터링 기능은 리눅스 커널 내에
"netfilter" 프레임워크
가 담당한다.ி 구조
총 4개의 테이블
로 구성된다. filter
패킷을 통제하는 역할
을 한다.➽ 체인(Chain)
체인은
table의 하위 개념
으로 정해진 규칙에 따라서 패킷의 흐름을 제어
한다. filter
에는 기본적으로 세가지 체인이 있다. INPUT
, OUTPUT
, FORWARD
INPUT
은 방화벽으로 들어오는 패킷, OUTPUT
은 방화벽에서 나가는 패킷이다. FORWARD
는 방화벽을 통과하는 패킷인데,외부에서 받은 패킷을 다른 네트워크로 전달하는 기능이다. 라우터를 생각해보자.
데이터는 항상 라우터로 전송되지만 실제로는
라우터 자체로 보내지는 경우는 거의 없고 거쳐가기만 한다.
즉 내부의 다른 서버에서 방화벽을 통해 외부로 나가는 패킷을 필터링한다.
그 외에
POSTROUTING 체인
, PREROUTING 체인
이 있다.iptables의 체인에서 룰 설정을 할 때 가장 중요한 것은
순서
다.앞 쪽 체인 룰이 우선순위가 높다.
만약 A 패킷을 거부하는 룰이 먼저 등록되있으면 그 이후에 A 패킷 허용룰을 작성해도 맨 앞에 등록된 룰 때문에 무력화된다.
따라서 허용하는 정책을 먼저 넣어야한다.
만약 패킷 규칙이 없다면
기본 정책
이 적용된다.기본 정책은
policy ACCEPT
, policy DROP
으로 설정하며, 기본 값은 DROP이다. nat
nat에서 자주 사용하는 체인은 두 가지가 있다.
POSTROUTING 체인
은 Source NAT(SNAT)
타겟과 매칭되어 내부 네트워크에서 방화벽을 통해 외부로 나갈 때 사용한다.쉽게 말해 내부 ip에서 외부 ip로 바꿔주는 역할이며,
하나의 공인 IP를 통해 사설 대역을 만드는 공유기의 용도로도 사용할 수 있다.
PREROUTING 체인
은 Destination NAT(DNAT)
타겟과 매칭되어 주로 외부에서 방화벽 내부 서버로 향하는 패킷을 포워딩 할 때 사용한다.사설 ip로 서버를 운영하면서 외부로 서비스 하고자 할 때 사용한다.
mangle
TTL
이나 TOS(Type of Service : 패킷전송 우선순위)
값을 변경하거나 매칭할 때 사용한다. mangle
에서 자주 사용하는 체인은 PREROUTING
, OUTPUT
이다. PREROUTING 체인
은 라우팅 경로가 결정되기 전에 방화벽으로 들어오는 패킷을 변경하거나 매칭한다. OUTPUT 체인
은 내부에서 생성된 패킷이 방화벽을 통해 나갈 때 변경하거나 매칭한다.ி 설치
설치여부 확인
# rpm -qa | grep iptables
설치
# yum install -y iptables
부팅 시 자동 실행
# chkconfig iptables on
iptables 시작
# service iptables start
ி 문법
iptables
테이블
, 체인
, 규칙
, 정책
명령어
-A (--append)
- 새 규칙 추가 -I (--insert)
- 새 규칙 삽입(최상위에 규칙 추가됨) -R (--replace)
- 새 규칙으로 교체 -D (--delete)
- 규칙 삭제 -L (--list)
- 규칙 출력 -F (--flush)
- 체인으로부터 규칙을 모두 제거 -N (--new)
- 새 체인 생성 -X (--delete-chain)
- 체인 삭제 -P (--policy)
- 기본정책 변경 -C (--check)
- 패킷을 테스트한다. -Z (--zero)
- 모든 체인의 패킷과 바이트 카운터 값을 0으로 만든다. 매치(match)
-t(table)
- 처리될 테이블 -p(protocol)
- 프로토콜명 또는 포트번호 -s(source)
- 출발지 -d(destination)
- 목적지 -i(in-interface)
- 입력 인터페이스 -o(out-interface)
- 출력 인터페이스 -j(jump)
- 패킷 통제 여부 -y(syn)
- 접속 요청 패킷인 SYN 패킷 미허용 -f(fragment)
- 두 번째 이후의 조각에 대해 규칙을 명시한다. -m(--match)
- 특정 모듈과의 매치(요청 시 자동 응답) --state
- 연결 상태와의 매칭 타겟(target)
ACCEPT
- 패킷 수용 DROP
- 패킷 드롭 REJECT
- 패킷을 드롭한 뒤 응답 LOG
- 패킷 기록 RETURN
- 호출 체인 내에서 패킷 처리 지속 연결 추적(Connection Tracking)
연결 정보
를 상태 테이블에 기록한다.연결된 상태의 패킷은 패턴 검사를 수행하지 않아서 부하가 줄고,
연결을 감시하고 제한하기 때문에 연결된 상태인 것처럼 위조한 패킷을 차단할 수 있다.
NEW
- 패킷이 새로 연결된 상태 ESTABLISHED
- 패킷이 기존에 연결된 상태 RELATED
- 이미 연결된 패킷과 연관성이 있는 상태 INVALID
- 연결 여부가 확인이 안되는 상태ி 실습
초기 설정
centos 6은 iptables를 기본 방화벽으로 쓰고
centos 7버전은 기본 방화벽을 firewalld로 사용한다.
필자가 실습한 환경은 centos 6 버전이다.
IP Forwarding
기능을 사용하려면 옵션을 활성화 해야한다.➽ 임시적으로 활성화 하려면 다음 명령을 입력한다.
# echo 1 > /proc/sys/net/ipv4/ip_forward
➽ 영구적으로 활성화 하려면 다음 명령을 입력한다.
# vi /etc/sysctl.conf에서 net.ipv4.ip_forward 값을 1로 변경한다.
# sysctl -p /etc/sysctl.conf - 변경사항 적용
➽ 편의를 위해 iptables 초기 스크립트를 만들어놓는다.
# 규칙 초기화
iptables -F
# 기본 정책 설정
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
... 규칙 입력 ...
# 설정 저장 및 방화벽 재시작
service iptables save
service iptables restart
방화벽 설정 백업
# iptables-save > 190927.rules
➽ 방화벽 설정 복구
# iptables-restore < 190927.rules
문법 예시
➽ 적용 상태 확인
iptables -nvL
➽ 특정 IP 차단
iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP
➽ 특정 포트 허용
iptables -A INPUT -p tcp --dport xxxx ACCEPT
➽ 모든 포트 차단
iptables -A INPUT -p tcp --dport 0:65535 -j DROP
➽ 루프백 허용
iptables -A INPUT -i lo -j ACCEPT
➽ 내부 네트워크 접속
iptables -A INPUT -s 192.168.0.0/24 -d 192.168.0.0/24 -j ACCEPT
iptables -A OUTPUT -s 192.168.0.0/24 -d 192.168.0.0/24 -j ACCEPT
➽ http를 https로 전환
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 443
➽ FTP 포트 허용
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp –-sport 21 -j ACCEPT
➽ MAC 주소 제어
iptables -A INPUT -s xxx.xxx.xxx.xxx -m mac --mac-source xx:xx:xx:xx:xx:xx -j ACCEPT
➽ 내부 및 외부 네트워크간 인터넷 허용
iptables -A FORWARD -i eth0 -j ACCEPT
iptables -A FORWARD -o eth0 -j ACCEPT
iptables -n nat -A POSTROUTING -o eth1 -j masquerade
3번 째 줄에
masquerade
는 eth1에서 나가는 ip를 사용한다.즉 NIC 카드의 IP를 사용하겠다는 뜻이다.
➽ 주소 변경
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to xxx.xxx.xxx.xxx
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to xxx.xxx.xxx.xxx-xxx.xxx.xxx.xxx
➽ 목적지에 도달하지 못한 패킷 허용
iptables -A INPUT -i eth0 -p icmp --icmp-type 3 -j ACCEPT
➽ 조각난 패킷 차단
iptables -A INPUT -f -j DROP
➽ NULL 패킷 차단
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
➽ 연결상태가 ESTABLISHED, RELATED인 패킷을 허용
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
➽ 통신규약에서 벗어난 비정상적인 패킷을 로깅하고 차단
iptables -I FORWARD 1 -m conntrack --ctstate INVALID -j LOG --log-prefix "INVALID_DROP"
iptables -I FORWARD 2 -m conntrack --ctstate INVALID -j DROP
➽ 임계치 차단(1초에 10회 트래픽 발생시 드랍)
iptables -A INPUT -p tcp --dport 80 -m limit --limit 10/s -j DROP
문제
문제1
1-1) 모든 PC에서 방화벽 eth0,eth1,eth2 중에 eth1과 eth2로
ping을 허용하고 로그를 남긴다.
1-2) 방화벽 eth0으로 ping이 들어오면 그에 대한 로그가 기록 되어야 하며,
해당 패킷은 차단 되어야 한다.
1-3) 방화벽 담당자($admin)만 방화벽으로 ssh 접속이 되어야 한다.
1-4) 방화벽에 ssh 접속이 실패했을 때 로그가 기록 되어야 한다.
문제2
2-1) hacker PC($hacker) 에서 사무실 PC($WPC)로 ping이 되도록 한다.
2-2) 사무실PC($WPC) <---> Server($server)로만 ssh접속가능
2-3) 모든 사용자는 web 서버(192.168.136.200)로 홈페이지 접속이 되도록 한다.
port 80,443(HTTP,HTTPS)
2-4) 모든 사용자가 server($server)를 이용해서 메일 보내기 / 받기가 가능하도록 한다.
2-5) [사무실 PC와 Server]($WPC_SV)는 yum install이 가능하도록 한다.
1-1) 모든 PC에서 방화벽 eth1, eth2 ip로 ping이 되어야 한다. / 로그기록
iptables -A INPUT ! -i eth0 -p icmp -j LOG --log-prefix "icmp_accept"
iptables -A INPUT ! -i eth0 -p icmp -j ACCEPT
iptables -A OUTPUT ! -o eth0 -p icmp -j ACCEPT
1-2) 방화벽 eth0 ip로 ping이 들어오면 그에 대한 로그가 기록 되어야 하며, 해당 패킷은
차단 되어야 한다.
iptables -A INPUT -i eth0 -p icmp -j LOG --log-prefix "icmp_drop"
iptables -A INPUT -i eth0 -p icmp -j DROP
1-3) 방화벽 담당자($admin)에서만 방화벽으로 ssh접속이 되어야한다.
iptables -A INPUT -s $admin -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -d $admin -p tcp --sport 22 -j ACCEPT
1-4) 방화벽에 ssh 접속이 실패했을 때 그에 대한 로그가 기록 되어야 한다.
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "ssh-drop "
2-1) hacker PC($hacker) 에서 사무실 PC($WPC) 로 ping이 되도록 한다.
hacker ----------------------FW------------------------->사무실PC
iptables -A FORWARD -s $hacker -d $WPC -p icmp -j ACCEPT
iptables -A FORWARD -s $hacker -d $WPC -p icmp -j ACCEPT
ipatbles -A FORWARD -m conntrack --ctstate ESTABLISHEd -j ACCEPT
2-2) 사무실PC($WPC) <---> Server($server)로만 ssh접속가능
iptables -A FORWARD -s $WPC -d $server -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -s $server -d $WPC -p tcp --dport 22 -j ACCEPT
2-3) 모든사용자는 web 서버(192.168.136.200)로 홈페이지 접속이 되도록한다.
iptables -A FORWARD -d 192.168.136.200 -p tcp -m multiport -dport 80,443
-j ACCEPT
2-4) 모든 사용자가 Server($server)를 이용해서 메일 보내기 / 메일 받기가가능하도록 하자.(smtp/pop3/imap 로그 기록)
<유형1>
any -------------------- FW ---------------->Server 25
iptables -A FORWARD -d $server -p tcp --dport 25 -j ACCEPT
iptables -A FORWARD -s $server -p tcp --sport 25 -j ACCEPT
any<------------------- FW ---------------- Server 25
any ------------------- FW ---------------->Server 110
iptables -A FORWARD -d $server -p tcp --dport 110 -j ACCEPT
iptables -A FORWARD -s $server -p tcp --sport 110 -j ACCEPT
any<------------------ FW ---------------- Server 110
any ------------------- FW ---------------->Server 143
iptables -A FORWARD -d $server -p tcp --dport 143 -j ACCEPT
iptables -A FORWARD -s $server -p tcp --sport 143 -j ACCEPT
any<------------------ FW ---------------- Server 143
<유형2>
iptables -A FORWARD -s $server -p tcp -m multiport --sport 25,110,143 -j ACCEPT
iptables -A FORWARD -d $server -p tcp -m multiport --dport 25,110,143 -j ACCEPT
메일 서버에서
systemctl stop firewalld
nc -l -p n ( n번 포트를 열고 기다린다)
2-5) [사무실 PC와 Server]($WPC_SV)는 yum install이 가능하도록 하자.
먼저 방화벽에서는 외부의 DNS서버로 네임쿼리가 가능하도록 해야한다.
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED -j ACCEPTiptables -A FORWARD -s $WPC_SV -d 8.8.8.8 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -s $WPC_SV -d 0.0.0.0/0 -p tcp --dport 80 -j ACCEPT
'OS-서버 > 리눅스-유닉스' 카테고리의 다른 글
리눅스 웹 서버 https 설정하기 (1) | 2020.04.27 |
---|---|
VMware 오류 - Vmware Player and Device/Credential Guard are not compatible. (2) | 2020.04.22 |
리눅스 로그 (0) | 2019.06.14 |
리눅스 파일 권한 (0) | 2019.06.13 |
리눅스 디렉터리 (0) | 2019.06.12 |