iptables
Linux 운영 체제에서 방화벽은 netfilter. 어떤 패킷이 들어오고 나갈 수 있는지 결정하는 커널 모듈입니다
iptables 는 netfilter 모듈을 사용하는 Linux OS 방화벽 입니다.
리눅스의 패킷 필터링(Packet Filtering) 도구로서 방화벽 구성이나 NAT(Network Address Translation)에 사용된다.
Action
- -A : APPEND : 정책 추가
- -I : INSERT : 정책 삽입
- -D : DELETE : 정책 삭제
- -R : REPLACE : 정책 교체
- -F : FLUSH : 모든 정책 삭제
- -P : POLICY : 기본 정책을 설정
- -L : LIST : 정책 나열
Chain
- INPUT
- OUTPUT
- FORWARD
- PREROUTING
- POSTROUTING
Match
- -s : 출발지 매칭. 도메인, IP 주소, 넷마스크 값을 이용하여 표기(––source, ––src)
- -d : 목적지 매칭. 도메인, IP 주소, 넷마스크 값을 이용하여 표기(––destination, ––dst)
- -p : 프로토콜과 매칭. TCP, UDP, ICMP 와 같은 이름을 사용하고 대소문자는 구분하지 않음
- -i : 입력 인터페이스와 매칭(––in-interface)
- -o : 출력 인터페이스와 매칭(––out-interface)
- -j : 매치되는 패킷을 어떻게 처리할지 지정 (–jump)
Target
패킷 규칙이 일치할 때 취하는 동작 지정
- ACCEPT : 패킷을 허용한다.
- DROP : 패킷을 버린다(패킷이 전송된 적이 없던 것처럼)
- REJECT : 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송한다.(icmp-port-unreachable)
- LOG : 패킷을 syslog에 기록한다.
- SNAT –to [주소] : 소스 IP를 [변환(NAT)|NAT]한다.
- DNAT –to [주소] : 목적지 IP를 변환(NAT)한다.
- RETURN : 호출 체인 내에서 패킷 처리를 계속한다.
iptables Example
- 잦은 룰 설정, 변경등 관리적인 측면의 효율성을 위해 리눅스 스크립트 형태로 관리
- /root/…/firewall (chmod 755)
- #은 주석
- iptables-save -c > /etc/sysconfig/iptables 현재 룰셋 저장
- iptables-restore < /etc/sysconfig/iptables 룰셋 복구
CentOS, Ubuntu 등 버전업 되면서 OS 방화벽(iptables) 설정 구성을 다른 명령어를 써서 가능하나
개인적으로 스크립트로 처리하는게 가장 효율적이고 편함.
Linux iptables Script 일부
#!/bin/bash
# INPUT Rules
iptables -F
iptables -X
# INPUT Rules
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P INPUT ACCEPT
# Local
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -i eth0 -f -j LOG --log-prefix "ESTABLISHED"
iptables -A INPUT -p tcp -m tcp ! --tcp-flags SYN,ACK,FIN,RST SYN -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 사무실 특정 IP 대역 전체 허용
iptables -A INPUT -s x0.x81.x09.9/32 -j ACCEPT
# SSH 특정 IP만 오픈 허용
iptables -A INPUT -m state --state NEW -m tcp -p TCP -s 10.10x.10.x2/32 --dport 2022 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p TCP -s 10.10x.x.x/32 --dport 2022 -j ACCEPT
# HTTP 특정 IP만 오픈 허용
iptables -A INPUT -m state --state NEW -m tcp -p TCP -s 2x.1x.x5.1x/32 --dport 8008 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p TCP -s 2x.1x.x5.1x/32 --dport 8008 -j ACCEPT
# 특정 어플리케이션 9090 포트 any 오픈
iptables -A INPUT -m state --state NEW -m tcp -p TCP --dport 9090 -j ACCEPT
# grafana API 포트 허용
iptables -A INPUT -m state --state NEW -m tcp -p TCP -s 2x.1x.5x.1x/32 --dport 9000 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p TCP -s 2x.1x.5x.1x/32 --dport 8000 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p TCP -s 1.2x.x7.53/32 --dport 8086 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p TCP -s 2x.1x.5x.1x/32 --dport 3000 -j ACCEPT
# elasticsearch API 포트 허용
iptables -A INPUT -m state --state NEW -m tcp -p TCP -s 1.x.x.41/32 --dport 9200 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p TCP -s 13.204.x.x/32 --dport 8220 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p TCP -s 202.x.x.x/32 --dport 9200 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p TCP -s 202.x.x.x/32 --dport 8220 -j ACCEPT
# kibana 포트 허용
iptables -A INPUT -m state --state NEW -m tcp -p TCP -s 221.x.x.x/32 --dport 5601 -j ACCEPT
# ICMP
#iptables -A INPUT -p ICMP -j ACCEPT
iptables -A INPUT -p ICMP -s 10.100.101.37/32 -j ACCEPT
# DROP Rules
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -p tcp --syn -j REJECT
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
# rule 저장
iptables-save -c > /etc/sysconfig/iptables
#service iptables save