
기본 정책 설정하기
기본 정책이라함은 패킷이 들어올 때 해당 체인의 설정된 룰을 검사하고 매칭되는 룰이 없다면 기본값으로 적용
되는 정책을 말한다. (INPUT으로 들어와서 OUTPUT으로 나감)
좀 더 강력한 정책을 사용할려면 policy DROP으로 설정하면 된다.
policy ACCEPT : 허용할 정책을 열어주고 반드시 마지막에 막아줘야 한다. 해당 룰이 없으면 모두 받아들인다
policy DROP : 모두 막고 필요한 정책을 열어준다. 마지막에 모두 막아줄 필요가 없다.
iptables에 접근을 할 때는 항상 기본 정책을 확인하여 서버의 연결이 끊기는 일을 방지해야 한다
policy ACCEPT : iptables -F 가 가능하다.
policy DROP : iptables -F 는 불가능하다.
형식 : iptables [-t table] -P chain target
-t table : 테이블명을 지정한다. (filter 테이블은 생략이 가능)
-P chain : 기본 정책을 설정할 체인명을 지정한다.
-j target : 타겟을 지정한다.
nft 방화벽 체인 생성
nft flush ruleset
nft add table ip filter
nft add chain ip filter INPUT '{ type filter hook input priority filter; policy accept; }'
nft add chain ip filter FORWARD '{ type filter hook forward priority filter; policy accept; }'
nft add chain ip filter OUTPUT '{ type filter hook output priority filter; policy accept; }'
nft list ruleset
방화벽 룰 추가하기 (-A, --append)
-A, --append 옵션을 이용해서 방화벽 룰을 추가하는 경우
. 기존 방화벽 룰(규칙)의 마지막에 추가된다.
방화벽 룰 1
방화벽 룰 2
방화벽 룰 3
추가되는 위치 (룰의 마지막에 추가된다.) iptables -A ...
[root@firewall ~] # iptables -A INPUT -s 1.1.1.1 -j DROP
filter 테이블의 INPUT 체인만 간략하게 확인한다.
[root@firewall ~] # iptables -S INPUT
-P INPUT ACCEPT
-A INPUT -s 1.1.1.1/32 -j DROP
-A 옵션은 룰을 순서대로 추가한다
[root@firewall ~] # iptables -A INPUT -s 2.2.2.2/32 -j ACCEPT
[root@firewall ~] # iptables -S INPUT
-P INPUT ACCEPT
-A INPUT -s 1.1.1.1/32 -j DROP
-A INPUT -s 2.2.2.2/32 -j ACCEPT
방화벽 룰 삽입하기 (-I)
-A vs -I
. -A: 룰이 추가될 때 마다 밑으로 계속 붙는다.
. -I: 규칙을 지정한 위치 또는 체인의 최상단(기본값)에 삽입한다.
형식:
삽입 형식#1: iptables [-t table] -I chain rule-specification [options] 룰번호가 생략되면 가장 처음으로 추가된다.
삽입 형식#2: iptables [-t table] -I chain rulenum rule-specification [options] 해당 룰번호에 추가되고 한칸씩 밀린다.
룰 번호를 생략하면 룰의 가장 처음으로 등록된다.
. -I INPUT 1 과 동일하다.
# iptables -I INPUT -s 4.4.4.4 -j DROP
룰 번호를 사용하면 룰의 번호에 등록되고 룰 번호에 해당이 되는 룰은 하나씩 밀린다.
. -I INPUT 3 과 동일하다.
# iptables -I INPUT 3 -s 5.5.5.5 -j DROP
방화벽 룰 초기화 (-F)
방화벽의 체인을 삭제하는 것이 아니고 체인에 설정된 모든 룰을 초기화(삭제)한다.
일시적인 것이므로 서버를 재부팅하거나 iptables.service를 재시작 하면 저장된 룰 파일(/etc/sysconfig/iptables)을 다시 읽어서 설정한다.
형식: iptables [-t table] -P chain target [options]
기본 정책에서는 아래 두 가지만 설정이 가능하다.
REJECT, LOG등의 옵션으로 설정할 수 없다.
. ACCEPT: 패킷 허용
. DROP : 패킷 거부
filter의 체인의 룰을 검사하는데 룰 끝까지 매칭되는 룰이 없다면 체인의 기본 정책을 따르게 되어 있다.
. (policy ACCEPT)
- 기본 정책이 ACCEPT 로 설정된 경우에는 룰에 매칭된 것이 없다면 패킷은 모두 ACCEPT 된다.
. (policy DROP)
- 체인의 기본 정책이 DROP 으로 설정된 경우에는 룰에 매칭된 것이 없다면 패킷은 DROP 된다.
- SSH로 서버에 연결되어 있다면 끊어지고 재접속도 모두 거부되므로 접속 자체가 안된다.
- INPUT, OUTPUT의 기본 정책이 DROP으로 설정되어있다면 연결이 끊기지만 FORWARD는 받아서 전달하는 역할이라
DROP을 해도 연결이 끊기진 않는다
방화벽 룰 삭제하기 (-D)
D로 룰을 삭제하는 2가지 방법
. 삭제 방법 1: 룰 형식 그대로 설정하고 A -> D 변경하고 삭제한다.
- 룰 구조가 복잡하면 어렵다는 단점이 있다.
. 삭제 방법 2: 룰 번호로 삭제한다.
- 룰 번호만 알면 간단하게 삭제가 가능하다라는 장점이 있다.
- 형식: -D 체인명 룰번호
# iptables -nL INPUT --line
삭제 방법 1로 삭제한다.
등록: iptables -A INPUT -s 1.1.1.1 -j DROP
삭제: iptables -D INPUT -s 1.1.1.1 -j DROP
삭제 방법 2로 삭제한다
filter.INPUT 체인에 설정된 룰번호 2를 삭제한다
# iptables -D INPUT 2
방화벽 룰 교체하기 (-R)
형식: iptables -R (chain) (rulenum) (rule-specification) [options]
# iptables -nL INPUT --line
# iptables -R INPUT 1 -s 2.2.2.2 -j DROP
방화벽 룰 저장하기
형식: iptables-save > <방화벽 정책 파일명>
/etc/sysconfig/iptables
. 부팅할 때나 방화벽을 재시작할 때 참고하는 방화벽 정책 파일
. iptables-save 명령어는 현재 설정된 방화벽 룰을 화면(stdout)에 출력한다.
. 이 파일에 저장하기 위해서는 리다이렉션 > 을 이용해서 저장한다
iptables-save 명령어를 실행하면 현재 설정되어 있는 방화벽 룰을 모두 stdout 으로 출력한다.
그러므로 리다이렉션 (>) 기호를 이용해서 방화벽 정책 파일에 저장한다.
조심해야 하는 이유는 > (덮어쓰기)이므로 조심해야 한다.
저장하는 파일은 기본 정책 파일인 /etc/sysconfig/iptables 저장하면 부팅할 때나 방화벽을 재시작할 때도 이 파
일을 읽어서 방화벽 룰을 재설정한다.
다른 파일에도 할 수 있지만 부팅할 때 적용되는 파일이 /etc/sysconfig/iptables 이므로 이 파일에 저장한다.
방화벽 룰 설정
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
# iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# iptables -A INPUT -p udp --dport 53 -j ACCEPT <= dport <= 패킷의 목적지 포트가 53인것
# iptables -A INPUT -j DROP <= policy 가 ACCEPT 이므로 마지막 룰에 -j DROP 이 반드시 있어야 한다
방화벽 룰 실행파일에 저장
# iptables-save > /etc/sysconfig/iptables
방화벽 룰 복구하기
형식: iptables-restore <방화벽 정책 파일명>
/etc/sysconfig/iptables 파일의 내용대로 방화벽 룰을 복구한다.
# iptables-restore /etc/sysconfig/iptables
# iptables -nL
방화벽 룰 파일 분석하기
설정 파일의 설명
. #
- 주석을 의미한다.
. *테이블명
- 테이블의 시작
- e.g.) *filter
. COMMIT
- 테이블의 끝
. :INPUT ACCEPT [5624:318251]
- :<체인명> <기본정책> [수신된 패킷의 수:수신된 바이트 수]
- e.g.) INPUT ACCEPT [27905:55100871]
- 27905: 이 숫자는 해당 체인(INPUT)을 통해 수신된 패킷의 총 수를 나타낸다.
- 55100871: 이 숫자는 해당 체인을 통해 수신된 바이트의 총 수를 나타낸다.
- 이 카운트들은 체인이 패킷을 얼마나 많이 처리했는지 보여주는 지표이며
INPUT 체인이 27,905개의 패킷과 총 55,100,871 바이트의 데이터를 처리했음을 의미하며
이 정보를 통해서 네트워크 트래픽의 양을 모니터링하거나 방화벽 규칙의 효과를 평가할 때 유용하게 사
용할 수 있다.
포트 제어하기
| 옵션 | 의미 | 서버 관점 상세 설명 |
| -s | 출발지 IP 주소 / 네트워크 | 서버로 들어오는 패킷의 클라이언트 IP |
| -d | 목적지 IP 주소 / 네트워크 | 서버가 받아야 하는 서버 자신의 IP |
| -p tcp --sport | TCP 출발지 포트 | 클라이언트가 사용한 출발지 TCP 포트 |
| -p tcp --dport | TCP 목적지 포트 | 서버가 제공하는 서비스 포트 (예: 80, 443, 22 등) |
| -p udp --sport | UDP 출발지 포트 | 클라이언트가 사용한 출발지 UDP 포트 |
| -p udp --dport | UDP 목적지 포트 | 서버가 제공하는 UDP 서비스 포트 (예: 53, 123 등) |
포트를 제어할 때는 -p (프로토콜) 옵션을 반드시 함께 사용해야 한다.
서버의 서비스 포트를 제어하기 위해서는 --dport <서비스포트>로 사용해야 한다.
filter.INPUT 체인에 80/tcp 포트를 허용하는 정책을 추가한다.
. iptables -A INPUT -p tcp --dport 80 -j ACCEPT
filter.INPUT 체인에 22/tcp 포트를 허용하는 정책을 추가한다.
. iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# iptables -F
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
| 구분 | --dport (Destination Port) | --sport (Source Port) |
| 의미 | 목적지 포트가 N번인 패킷 허용 | 출발지 포트가 N번인 패킷 허용 |
| 핵심 역할 | 내가 서버일 때 (서비스 제공) | 내가 클라이언트일 때 (서비스 이용) |
| 패킷의 방향 | 외부 유저 → 내 컴퓨터:80 | 외부 서버:80 → 내 컴퓨터 |
| 실제 사례 | 내 컴퓨터에 웹 서버를 돌려 남들이 접속하게 할 때 | 내가 패키지를 다운로드하거나 업데이트할 때 |
패키지 저장소
. 패키지들이 모여있는 사이트가 패키지 저장소이며 패키지 저장소는 도메인주소로 되어 있다.
. DNS 서버에 도메인주소를 알아야 한다.
- DNS 53/udp
- Rocky Linux의 패키지 저장소 주소
- HTTP 80/tcp, HTTPS 443/tcp
저장소 서버에 접속하여 패키지를 요청한다.
나가는 패킷: Source Port: 랜덤 -> Dest Port: 80/443 (TCP)
들어오는 패킷: Source Port: 80/443 (TCP) -> Dest Port: 랜덤
서버가 먼저 외부(DNS, Repo)에 질문을 던지고, 그에 대한 대답(데이터)이 돌아온다.
외부 저장소 서버의 80, 443번 포트와 DNS 서버의 53번 포트에서 출발하여 서버로 들어온다.
패키지를 다운로드 받기 위해서 방화벽에 DNS 서비스와 웹서비스를 추가해야 한다.
# iptables -I INPUT 3 -p udp --sport 53 -j ACCEPT <= DNS에서 서버로 출발
# iptables -I INPUT 3 -p tcp --sport 80 -j ACCEPT
# iptables -I INPUT 3 -p tcp --sport 443 -j ACCEPT
OUTPUT 체인 제어하기
방화벽의 견고한 룰을 설정하기 위해서는 들어오는 inbound 트래픽과 나가는 oubound 트래픽을 제어해야 한다.
방화벽 룰이 INPUT 체인만 설정되어 있으면 반쪽짜리이다.
그러므로 좀 더 견고한 룰을 설정하기 위해서는 OUTPUT 체인도 제어해야 한다.
1. 아파치 웹서버 패키지 설치
http: 아파치 웹서버
mod_ssl: ssl/tls 통신 패키지
# iptables -F
# dnf -y install httpd mod_ssl
# systemctl enable --now httpd.service
2. 방화벽 설정
inbound 트래픽을 filter.INPUT 체인에 등록한다.
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# iptables -A INPUT -j DROP
outbound 트래픽을 filter.OUTPUT 체인에 등록한다.
# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
# iptables -A OUTPUT -j DROP
클라이언트가 서버로 SSH 접속을 한다.
ssh linuxadmin@192.168.100.10
---------> filter.INPUT
[client] ----- [server]
2026/tcp 22/tcp
.1 .10
bb.01 aa.10
+-------------------------- SSH Request Packet ---------------------------+
| |
| L2 L3 L4 L7 |
| Layer 2 Layer 3 Layer 4 Layer 7 |
+----------------+-----------------------+---------------------+-----------+
| src mac: bb.01 | src ip:192.168.100.1 | src port: 2026, tcp | protocol: |
| dst mac: aa.10 | dst ip:192.168.100.10 | dst port: 22, tcp | SSH |
+----------------+-----------------------+---------------------+-----------+
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 DROP all -- 0.0.0.0/0 0.0.0.0/0
[client] ----- [server]
<--------- filter.OUTPUT
2026/tcp 22/tcp
.1 .10
bb.01 aa.10
+-------------------------- SSH Response Packet --------------------------+
| |
| L2 L3 L4 L7 |
| Layer 2 Layer 3 Layer 4 Layer 7 |
+----------------+-----------------------+---------------------+-----------+
| src mac: aa.10 | src ip:192.168.100.10 | src port: 22, tcp | SSH |
| dst mac: bb.01 | dst ip:192.168.100.1 | dst port: 2026, tcp | protocol: |
+----------------+-----------------------+---------------------+-----------+
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:22
2 DROP all -- 0.0.0.0/0 0.0.0.0/0
웹페이지가 보일 수 있게 방화벽을 설정하시오.
방화벽 설정 전
http://192.168.100.10/
Welcome to my server.
방화벽 설정 후
http://192.168.100.10/
<-- 접속이 안된다.
2. 방화벽 현재 룰
# iptables -nL --line
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 DROP all -- 0.0.0.0/0 0.0.0.0/0
... ...
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:22
2 DROP all -- 0.0.0.0/0 0.0.0.0/0
3. 리눅스에 열려있는 포트를 확인한다
[root@firewall ~]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 835/sshd: /usr/sbin
tcp6 0 0 :::443 :::* LISTEN 3159/httpd
tcp6 0 0 :::80 :::* LISTEN 3159/httpd
tcp6 0 0 :::22 :::* LISTEN 835/sshd: /usr/sbin
TCP6: 80 <= HTTP
TCP6: 443 <= HTTPS
4. 막혀있는 HTTP, HTTPS를 방화벽에 등록한다
# iptables -I INPUT 2 -p tcp --dport 443 -j ACCEPT
# iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT
# iptables -I OUTPUT 2 -p tcp --sport 443 -j ACCEPT
# iptables -I OUTPUT 2 -p tcp --sport 80 -j ACCEPT
# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
DROP all -- 0.0.0.0/0 0.0.0.0/0
... ...
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:443
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:80
DROP all -- 0.0.0.0/0 0.0.0.0/0
5. 접속확인
https://192.168.100.10/
http://192.168.100.10/
패키지를 설치하는 방화벽을 설정하시오.
위에서 설정한 방화벽 룰을 패키지를 설치하려고 하면 에러가 발생한다.
그러므로 아래처럼 mc 패키지를 성공적으로 설치하는 것이 목적이다.
INPUT, OUTPUT 체인에 설정해야 한다.
1. DNS[주소 찾기(53)] + HTTP[옛날 방식 접속(80)] + HTTPS[요즘 방식 접속(443)]을 등록한다
# iptables -I INPUT 4 -p udp --sport 53 -j ACCEPT
# iptables -I INPUT 4 -p tcp --sport 80 -j ACCEPT
# iptables -I INPUT 4 -p tcp --sport 443 -j ACCEPT
# iptables -I OUTPUT 4 -p udp --dport 53 -j ACCEPT
# iptables -I OUTPUT 4 -p tcp --dport 80 -j ACCEPT
# iptables -I OUTPUT 4 -p tcp --dport 443 -j ACCEPT
[root@firewall ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:443
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:80
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp spt:53
DROP all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:443
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
DROP all -- 0.0.0.0/0 0.0.0.0/0
서버 입장에서는 외부(80번 포트)에서 출발해서 들어오는 패키지를 INPUT에서 받아야 하므로
INPUT 체인에서 --sport 80을 설정하게 된다.
서버입장에서 외부(80번 포트)를 목적지로 패키지를 요청하러 패킷을 내보내야 하기 때문에
OUTPUT 체인에서 --dport을 설정하게 된다.