티스토리 뷰
IPTables?
이건 무엇이고 어디에 쓰일까?
IPTables는 Netfilter 패킷 필터링 기능의 리눅스 커널 방화벽
이다.
여러 환경에서의 사용
- Android, Linux Deploy
Linux Deploy같은 Andorid 위의 리눅스(chroot환경)에서는 iptables을 사용할 수 없다. chroot기반이어서 iptables 혹은 iptables-persistent가 작동하지 않는다.
- Ubuntu
우분투는 기본적으로 ufw라는 편한 방화벽을 사용하는데, iptables에 규칙을 대신 만들어주는 역할을 하므로, 세밀한 설정이 가능한 iptables를 직접 사용할 것이다.
IPTables의 구조와 동작 방식
iptables는 체인
이라는 규칙을 연결한 테이블
구조를 가진다. 받아들이는 패킷들 하나하나에 대응하는 테이블을 체인에 따라 처리한다.
테이블 안의 체인에서 규칙은 위에서부터 순서대로 참조하며, 일치하면 이후의 규칙은 더 이상 참조하지 않고 패킷을 처리한다.
Ubuntu 기준으로 /etc/iptables 디렉토리 안에 rules.v4와 rules.v6 파일로 나뉘어져 있다.
1. 테이블 (Table)
체인(규칙)을 포함한 전체 그룹이다. 기본 테이블인 filter를 포함하여 nat, mangle, raw가 있다.
iptables는 Filter, Nat, Mangle, Raw 4개의 테이블을 가진다.
- Filter : 기본 테이블, 패킷 필터링
- Nat : Network Address Translation, IP 주소 변환
- Mangle : 패킷 데이터를 변경하는 규칙 혹은 성능 향상을 위한 TOS(Type of Service)
- Raw : 넷필터의 연결 추적 하위 시스템과 독립 동작
2. 체인 (Chain)
일치하는 패킷의 규칙 연결 단위이다. 내장 체인은 INPUT, OUTPUT, FORWARD가 있으며 사용자 정의 체인을 만들 수 있다.
사용자 정의 체인의 예로는 log 체인이 있는데, INPUT에 해당하지 않는 패킷을 log로 기록하는 커스텀 체인이다.
내장 체인 종류
- INPUT : 시스템 외부 -> 시스템 내부
- OUTPUT : 시스템 내부 -> 시스템 외부
- FORWARD : 시스템을 경유하는 패킷, 내부망
3. 룰 (Rule)
커맨드, 파라미터, 타깃으로 구성된 규칙이다.
ex) -A INPUT -i lo -j ACCEPT
-A INPUT
은 커맨드로, Chain을 조작한다.-i lo
는 파라미터로 localhost 연결을 뜻한다.-j ACCEPT
는 일치한 Target의 패킷 통과를 처리한다는 뜻이다.
4. 타깃 (Target)
위의 룰에서 설명한 것처럼 Rule에 일치한 타깃에 대한 처리를 뜻한다.
- ACCEPT : 패킷 허용
- DROP : 패킷 버림 (통지하지 않고 폐기)
- REJECT : 패킷 거절 (통지하고 거부)
IPTables의 사용법
Usage
iptables [Commands] chain [rule-specification] [options]
[Commands]
Commands:
--append -A chain 새로운 규칙 추가
--check -C chain 패킷 테스트
--delete -D chain 규칙 삭제
...
--list -L [chain [rulenum]] 규칙 리스트 출력
...
--new -N chain 사용자 정의 체인 추가사용자 정의 체인 추가
...
# 더 자세한 커맨드는 iptables -h 로 알아보자.
[options]
Options:
--ipv4 -4 Nothing (line is ignored by ip6tables-restore)
--protocol -p proto protocol: by number or name, eg. `tcp'
--source -s address[/mask][...]
source specification
--destination -d address[/mask][...]
destination specification
--in-interface -i input name[+]
network interface name ([+] for wildcard)
--jump -j target
target for rule (may load target extension)
...
--match -m match
extended match (may load extension)
...
--line-numbers print line numbers when listing
# 더 자세한 커맨드는 iptables -h 로 알아보자.
IP 주소
-s {출발지 IP 주소} \[/비트 마스크]
-d {도착지 IP 주소} \[/비트 마스크]
PORT
--sport {출발지 포트}
--dport {도착지 포트}
포트에는 번호 혹은 서비스명(smb, ssh)을 사용한다.
I/F(인터페이스명)
LAN의 인터페이스(eth0, ens32 등)와 루프백(lo), 지정하지 않으면 전부이다.
-i: 패킷이 들어오는 네트워크 인터페이스
-o: 패킷이 나가는 네트워크 인터페이스
프로토콜
-p {프로토콜}
프로토콜:
tcp or 6
udp or 17
icmp or 1
all or 0
(null)
icmp:
--icmp-type {타입}
echo-request: 에코 요청(ping)
echo-reply: 에코 응답
destination-unreachable: 목적지 도착 불가
source-quench: 발신원 송신 제어 요청
redirect: 리다이렉트
연결 추적
-m state --state {상태}
NEW : 새로운 연결 요청 패킷
ESTABLISHED : 이미 형성된 접속의 일부인 패킷
RELATED : 기존 연결에 속하지만 새로운 연결을 요청하는 패킷
(TCP, UDP, ICMP 포함)
타깃 (처리 조작)
REDIRECT : 규칙에 일치하는 패킷의 도착지 포트 변경
LOG: 로그를 남긴다.
--log-level {level} : 레벨에 해당하는 로그를 남긴다.
--log-prefix {prefix} : 프리픽스를 로그 메세지 앞에 붙인다. 29문자까지
--log-tcp-sequence : TCP 시퀀스 번호를 기록한다.
--log-tcp-options : TCP 패킷 헤더의 옵션을 로그에 기록한다.
--log-ip-options : IP 패킷 헤더의 옵션을 기록한다.
'Ubuntu' 카테고리의 다른 글
[NginX] 리버스 프록시 구성하기 (0) | 2021.03.19 |
---|---|
[NginX] 기본 구성 / 경로 (0) | 2021.03.19 |
[IPTables] IPTables로 아이피나 포트를 허용하고 차단해보자 (0) | 2021.03.14 |
[Apache2] Could not reliably determine the server's fully qualified domain name (0) | 2021.01.30 |
[Apache2] Function not implemented: AH00023: Couldn't create the proxy mutex (0) | 2021.01.24 |
[Apache2] 아파치2 구성 / Configuration (0) | 2021.01.24 |
[Ubuntu] Wake On Lan 설정하여 원격 부팅하기 / WOL (2) | 2021.01.17 |