hping3/방화벽 룰 iptables/체인 (교육 41일차)

SW·2023년 1월 17일
0














실습> CentOS 7에서 hping3 설치하기

CentOS 7
[user1@localhost ~]# yum -y install epel-release
[user1@localhost ~]# yum -y install hping3

Rocky Linux 8
[user1@localhost ~]# dnf -y install epel-release
[user1@localhost ~]# dnf -y install hping3

실습> 서버 설정하기

서버 2대를 아래처럼 설정한다.
Server#1: 200.200.200.3
Server#2: 200.200.200.4, 200.200.200.5, 200.200.200.6, 200.200.200.7



실습> iptables 도움말 확인

[user1@localhost ~]# iptables --help
[user1@localhost ~]# man iptables

iptables 명령어 옵션

-P: 방화벽 기본 정책 설정하기 (policy)
-L: 방화벽 룰 확인하기 (list)
-A: 방화벽 룰 추가하기 (append) (룰의 마지막에 추가)
-C: 방화벽 룰 체크하기 (check)
-D: 방화벽 룰 삭제하기 (delete)
-R: 방화벽 룰 수정하기 (replace)
-I: 방화벽 룰 삽입하기 (insert) (룰 번호가 없다면 룰의 가장 처음에 추가)
-I: 방화벽 룰 삽입하기 (insert) (룰 번호가 있다면 그 룰번호에 추가)
-F: 방화벽 룰 초기화하기 (flush)
-S: 방화벽 룰 명령어 출력하기 (list-rules)
-Z: 방화벽 룰 카운트 0으로 초기화하기 (zero)
-N: 사용자 정의 체인 생성하기 (new)
-X: 사용자 정의 체인 삭제하기 (delete-chain)
-E: 사용자 정의 체인 이름 변경하기 (rename-chain)

실습> 방화벽 룰 확인하기 (-L 옵션)

형식:
iptables -L [체인명 [룰번호]][옵션]

테이블명: 소문자
체인명: 대문자

filter 테이블의 체인의 리스트를 확인한다.
-t 테이블명을 생략하면 기본값은 filter 테이블이다.
-t filter 생략 : filter table
-t filter: filter table

filter 테이블을 확인한다.
[user1@localhost ~]# iptables -F
[user1@localhost ~]# iptables -t filter -L
[user1@localhost ~]# iptables -L
[user1@localhost ~]# iptables -L --line
[user1@localhost ~]# iptables -nL
[user1@localhost ~]# iptables -nL --line
[user1@localhost ~]# iptables -nvL
[user1@localhost ~]# iptables -nvL --line

nat 테이블을 확인한다.
[user1@localhost ~]# iptables -t nat -L
[user1@localhost ~]# iptables -t nat -nL
[user1@localhost ~]# iptables -t nat -nvL
[user1@localhost ~]# iptables -t nat -nvL --line

mangle 테이블을 확인한다.
[user1@localhost ~]# iptables -t mangle -L
[user1@localhost ~]# iptables -t mangle -L
[user1@localhost ~]# iptables -t mangle -nvL
[user1@localhost ~]# iptables -t mangle -nvL --line

raw, security는 생략한다.

실습> 방화벽 룰 추가하기 (-A 옵션)

형식:
iptables [-t 테이블명] -A 체인명 룰규칙 [옵션]

-A 로 추가하면 방화벽 룰의 정책은 위에서 부터 아래로 순차적으로 추가된다.

INPUT 체인에 출발지 주소가 1.1.1.1이면 패킷을 거부하는 룰(정책)을 추가한다.
[root@localhost ~]# iptables -A INPUT -s 1.1.1.1 -j DROP

INPUT 체인에 출발지 주소가 2.2.2.2이면 패킷을 허용하는 룰(정책)을 추가한다.
[root@localhost ~]# iptables -A INPUT -s 2.2.2.2 -j ACCEPT

현재 설정된 방화벽 정책(룰)을 확인한다.
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 1.1.1.1 0.0.0.0/0
ACCEPT all -- 2.2.2.2 0.0.0.0/0

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

INPUT 체인에 출발지 주소가 3.3.3.3이면 패킷을 거부하는 룰(정책)을 추가한다.
[root@localhost ~]# iptables -j DROP -A INPUT -s 3.3.3.3
[root@localhost ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 1.1.1.1 0.0.0.0/0
ACCEPT all -- 2.2.2.2 0.0.0.0/0
DROP all -- 3.3.3.3 0.0.0.0/0

실습> 방화벽 룰 체크하기 (-C 옵션)

형식:
iptables [-t 테이블명] -C 체인명 룰규칙 [옵션]

[root@localhost ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 1.1.1.1 0.0.0.0/0
ACCEPT all -- 2.2.2.2 0.0.0.0/0
DROP all -- 3.3.3.3 0.0.0.0/0

[root@localhost ~]# iptables -C INPUT -s 1.1.1.1 -j DROP
[root@localhost ~]# echo $?
0
[root@localhost ~]# iptables -C INPUT -s 1.1.1.1 -j ACCEPT
iptables: Bad rule (does a matching rule exist in that chain?).
[root@localhost ~]# echo $?
1

[root@localhost ~]# iptables -C INPUT -s 1.1.1.1 -j ACCEPT 2> /dev/null
[root@localhost ~]# echo $?
1

실습> 방화벽 룰 삭제하기 (-D 옵션)

형식:
iptables [-t 테이블명] -D 체인명 룰번호 [옵션]

-D로 룰을 삭제하는 2가지 방법
삭제 방법 #1: 룰 형식을 동일하게 설정하고 A -> D 변경하고 삭제한다.
삭제 방법 #2: 룰 번호로 삭제한다.

1. 룰 형식 그대로 삭제
--line-numbers(--line): 룰 번호를 출력하는 옵션
[root@localhost ~]# iptables -nL INPUT --line
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all -- 1.1.1.1 0.0.0.0/0 <-- 삭제 방법 #1로 삭제한다.
2 ACCEPT all -- 2.2.2.2 0.0.0.0/0
3 DROP all -- 3.3.3.3 0.0.0.0/0

[root@localhost ~]# iptables -D INPUT -s 1.1.1.1 -j DROP
[root@localhost ~]# iptables -nL INPUT --line
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 2.2.2.2 0.0.0.0/0
2 DROP all -- 3.3.3.3 0.0.0.0/0

2. 룰 번호로 삭제
[root@localhost ~]# iptables -D INPUT 2
[root@localhost ~]# iptables -nL INPUT --line
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 2.2.2.2 0.0.0.0/0

실습> 방화벽 룰 수정하기 (-R 옵션)

형식:
iptables -R 체인명 룰번호 룰규칙 [옵션]

[root@localhost ~]# iptables -nL --line
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 2.2.2.2 0.0.0.0/0

Chain FORWARD (policy ACCEPT)
num target prot opt source destination

Chain OUTPUT (policy ACCEPT)
num target prot opt source destination

INPUT 체인의 1번 룰번호에 설정된 룰을 ACCEPT -> DROP 으로 변경한다.
[root@localhost ~]# iptables -R INPUT 1 -s 2.2.2.2 -j DROP

[root@localhost ~]# iptables -nL INPUT --line
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all -- 2.2.2.2 0.0.0.0/0 <-- ACCEPT -> DROP 으로 변경되었다.

변경이 완료되면 1번 룰을 삭제한다.
[root@localhost ~]# iptables -D INPUT 1
[root@localhost ~]# iptables -nL --line
Chain INPUT (policy ACCEPT)
num target prot opt source destination

Chain FORWARD (policy ACCEPT)
num target prot opt source destination

Chain OUTPUT (policy ACCEPT)
num target prot opt source destination

실습> 방화벽 룰 삽입하기 (-I 옵션)

형식:
iptables -I 체인명 [룰번호] 룰규칙 [옵션]

-A VS -I

-A 옵션
룰이 추가될 때 가장 마지막에 추가된다.

-I 옵션
룰이 추가될 때 지정한 위치에 추가된다.

형식:
삽입 형식#1: iptables -t 테이블명 -I 체인명 룰 옵션
삽입 형식#2: iptables -t 테이블명 -I 체인명 <룰번호> 룰 옵션

현재 INPUT 체인에는 아무 룰이 존재하지 않는다.
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

룰 3개를 추가한다.
[root@localhost ~]# iptables -A INPUT -s 1.1.1.1 -j DROP
[root@localhost ~]# iptables -A INPUT -s 2.2.2.2 -j DROP
[root@localhost ~]# iptables -A INPUT -s 3.3.3.3 -j DROP

[root@localhost ~]# iptables -nL INPUT --line
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all -- 1.1.1.1 0.0.0.0/0
2 DROP all -- 2.2.2.2 0.0.0.0/0
3 DROP all -- 3.3.3.3 0.0.0.0/0

룰 번호를 생략하면 룰의 가장 처음으로 추가된다.
-I INPUT 1 과 동일하다.
[root@localhost ~]# iptables -I INPUT -s 4.4.4.4 -j DROP
[root@localhost ~]# iptables -nL INPUT --line
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all -- 4.4.4.4 0.0.0.0/0
2 DROP all -- 1.1.1.1 0.0.0.0/0
3 DROP all -- 2.2.2.2 0.0.0.0/0
4 DROP all -- 3.3.3.3 0.0.0.0/0

룰 번호를 추가하면 룰번호 위치로 추가된다.
[root@localhost ~]# iptables -I INPUT 3 -s 5.5.5.5 -j DROP
[root@localhost ~]# iptables -nL INPUT --line
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all -- 4.4.4.4 0.0.0.0/0
2 DROP all -- 1.1.1.1 0.0.0.0/0
3 DROP all -- 5.5.5.5 0.0.0.0/0
4 DROP all -- 2.2.2.2 0.0.0.0/0
5 DROP all -- 3.3.3.3 0.0.0.0/0

실습> 방화벽 룰 초기화 (-F 옵션)

형식:
iptables -F [체인명][옵션]

filter 테이블의 전체 체인에 설정된 룰을 모두 초기화 한다.
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

[root@localhost ~]# iptables -A INPUT -s 1.1.1.1 -j DROP
[root@localhost ~]# iptables -A FORWARD -s 2.2.2.2 -j DROP
[root@localhost ~]# iptables -A OUTPUT -d 3.3.3.3 -j DROP
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 1.1.1.1 0.0.0.0/0

Chain FORWARD (policy ACCEPT)
target prot opt source destination
DROP all -- 2.2.2.2 0.0.0.0/0

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 0.0.0.0/0 3.3.3.3

filter 테이블의 INPUT 체인만 초기화 한다.
[root@localhost ~]# iptables -F INPUT
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination
DROP all -- 2.2.2.2 0.0.0.0/0

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 0.0.0.0/0 3.3.3.3

filter 테이블의 OUTPUT 체인만 초기화 한다.
[root@localhost ~]# iptables -F OUTPUT
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination
DROP all -- 2.2.2.2 0.0.0.0/0

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

filter 테이블의 FORWARD 체인만 초기화 한다.
[root@localhost ~]# iptables -F FORWARD
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

실습> 방화벽 룰 확인하기 (-S 옵션)

형식:
iptables -S [체인명 [룰번호]][옵션]

INPUT
-출발지 IP주소: 1.1.1.1, 1.1.1.2, 1.1.1.3
-타겟: DROP

OUTPUT
-목적지 IP주소: 1.1.1.1, 1.1.1.2, 1.1.1.3
-타겟: DROP

1. INPUT 체인 등록
INPUT 체인에 등록한다.
[root@localhost ~]# iptables -A INPUT -s 1.1.1.1 -j DROP
[root@localhost ~]# iptables -j DROP -A INPUT -s 1.1.1.2
[root@localhost ~]# iptables -s 1.1.1.3 -j DROP -A INPUT

[root@localhost ~]# iptables -nL INPUT --line
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all -- 1.1.1.1 0.0.0.0/0
2 DROP all -- 1.1.1.2 0.0.0.0/0
3 DROP all -- 1.1.1.3 0.0.0.0/0

2. OUTPUT 체인 등록
OUTPUT 체인에 등록한다.
[root@localhost ~]# iptables -A OUTPUT -d 1.1.1.1 -j DROP
[root@localhost ~]# iptables -j DROP -A OUTPUT -d 1.1.1.2
[root@localhost ~]# iptables -d 1.1.1.3 -j DROP -A OUTPUT

3. 등록된 룰 확인
[root@localhost ~]# iptables -nvL --line
Chain INPUT (policy ACCEPT 57 packets, 4152 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 DROP all -- * 1.1.1.1 0.0.0.0/0
2 0 0 DROP all --
1.1.1.2 0.0.0.0/0
3 0 0 DROP all --
* 1.1.1.3 0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 31 packets, 4296 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 DROP all -- * 0.0.0.0/0 1.1.1.1
2 0 0 DROP all --
0.0.0.0/0 1.1.1.2
3 0 0 DROP all --
* 0.0.0.0/0 1.1.1.3

1.1.1.1/32: /32가 들어있으면 단일 IP주소를 의미한다.

[root@localhost ~]# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -s 1.1.1.1/32 -j DROP
-A INPUT -s 1.1.1.2/32 -j DROP
-A INPUT -s 1.1.1.3/32 -j DROP
-A OUTPUT -d 1.1.1.1/32 -j DROP
-A OUTPUT -d 1.1.1.2/32 -j DROP
-A OUTPUT -d 1.1.1.3/32 -j DROP

192.168.1.0/24: 0/24가 들어있으면 네트워크 전체 주소를 의미한다.
[root@localhost ~]# iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
[root@localhost ~]# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -s 1.1.1.1/32 -j DROP
-A INPUT -s 1.1.1.2/32 -j DROP
-A INPUT -s 1.1.1.3/32 -j DROP
-A INPUT -s 192.168.1.0/24 -j ACCEPT
-A OUTPUT -d 1.1.1.1/32 -j DROP
-A OUTPUT -d 1.1.1.2/32 -j DROP
-A OUTPUT -d 1.1.1.3/32 -j DROP

[root@localhost ~]# iptables -nL --line
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all -- 1.1.1.1 0.0.0.0/0
2 DROP all -- 1.1.1.2 0.0.0.0/0
3 DROP all -- 1.1.1.3 0.0.0.0/0
4 ACCEPT all -- 192.168.1.0/24 0.0.0.0/0

Chain FORWARD (policy ACCEPT)
num target prot opt source destination

Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all -- 0.0.0.0/0 1.1.1.1
2 DROP all -- 0.0.0.0/0 1.1.1.2
3 DROP all -- 0.0.0.0/0 1.1.1.3

실습> 방화벽 룰 카운트 0으로 초기화하기 (-Z 옵션)

형식:
iptables -Z [체인명][옵션]

[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 111 packets, 6753 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * 1.1.1.1 0.0.0.0/0
0 0 DROP all --
1.1.1.2 0.0.0.0/0
0 0 DROP all --
1.1.1.3 0.0.0.0/0
0 0 ACCEPT all --
* 192.168.1.0/24 0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 364 packets, 73192 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * 0.0.0.0/0 1.1.1.1
0 0 DROP all --
0.0.0.0/0 1.1.1.2
0 0 DROP all --
* 0.0.0.0/0 1.1.1.3

[root@localhost ~]# hping3 -1 -a 1.1.1.1 -c 1 200.200.200.3
[root@localhost ~]# hping3 -1 -a 1.1.1.2 -c 2 200.200.200.3
[root@localhost ~]# hping3 -1 -a 1.1.1.3 -c 3 200.200.200.3

[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 145 packets, 8973 bytes)
pkts bytes target prot opt in out source destination
1 28 DROP all -- * 1.1.1.1 0.0.0.0/0
2 56 DROP all --
1.1.1.2 0.0.0.0/0
3 84 DROP all --
1.1.1.3 0.0.0.0/0
0 0 ACCEPT all --
* 192.168.1.0/24 0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 91 packets, 11152 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * 0.0.0.0/0 1.1.1.1
0 0 DROP all --
0.0.0.0/0 1.1.1.2
0 0 DROP all --
* 0.0.0.0/0

카운트를 0으로 초기화 한다.
[root@localhost ~]# iptables -Z
[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 6 packets, 364 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * 1.1.1.1 0.0.0.0/0
0 0 DROP all --
1.1.1.2 0.0.0.0/0
0 0 DROP all --
1.1.1.3 0.0.0.0/0
0 0 ACCEPT all --
* 192.168.1.0/24 0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 4 packets, 368 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * 0.0.0.0/0 1.1.1.1
0 0 DROP all --
0.0.0.0/0 1.1.1.2
0 0 DROP all --
* 0.0.0.0/0 1.1.1.3

설정된 방화벽 룰을 초기화 한다.
[root@localhost ~]# iptables -F

실습> 사용자 정의 체인 생성하기 (-N 옵션)

사용자 정의 체인: 사용자가 생성한 체인

사용자 정의 체인 명령어 옵션
-N: 사용자 정의 체인 생성하기 (new)
-X: 사용자 정의 체인 삭제하기 (delete-chain)
-E: 사용자 정의 체인 이름 변경하기 (rename-chain)

사용법:
iptables -N 체인명
iptables -X 체인명
iptables -E 이전체인명 새체인명

사용자 정의 체인 CHAIN1, CHAIN2, CHAIN3을 생성한다.
[root@localhost ~]# iptables -N CHAIN1
[root@localhost ~]# iptables -N CHAIN2
[root@localhost ~]# iptables -N CHAIN3

생성된 사용자 정의 체인을 확인한다.
-Built-in chain: policy 라고 적혀있다.
-사용자 정의 체인: references 라고 적혀있다.
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain CHAIN1 (0 references)
target prot opt source destination

Chain CHAIN2 (0 references)
target prot opt source destination

Chain CHAIN3 (0 references)
target prot opt source destination

실습> 사용자 정의 체인 삭제하기 (-X 옵션)

사용자 정의 체인 명령어 옵션
-N: 사용자 정의 체인 생성하기 (new)
-X: 사용자 정의 체인 삭제하기 (delete-chain)
-E: 사용자 정의 체인 이름 변경하기 (rename-chain)

사용법:
iptables -N 체인명
iptables -X 체인명
iptables -E 이전체인명 새체인명

생성된 사용자 정의 체인 CHAIN1, CHAIN2, CHAIN3을 삭제한다.
[root@localhost ~]# iptables -X CHAIN1
[root@localhost ~]# iptables -X CHAIN2
[root@localhost ~]# iptables -X CHAIN3

삭제된 사용자 정의 체인을 확인한다.
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Built-in chain은 삭제할 수 없기 때문에 Built-in chain을 삭제하면 오류가 발생한다.
[root@localhost ~]# iptables -X INPUT
iptables: Invalid argument. Run `dmesg' for more information.
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

실습> 사용자 정의 체인 생성하기2 (-N 옵션)

사용자 정의 체인 명령어 옵션
-N: 사용자 정의 체인 생성하기 (new)
-X: 사용자 정의 체인 삭제하기 (delete-chain)
-E: 사용자 정의 체인 이름 변경하기 (rename-chain)

사용법:
iptables -N 체인명
iptables -X 체인명
iptables -E 이전체인명 새체인명

생성할 체인명

  • WEBSERVER
  • ACCEPTIP
  • DROPIP
  • ADMINIP

-N 옵션을 이용해서 사용자 정의 체인을 생성한다.
[root@localhost ~]# iptables -N WEBSERVER
[root@localhost ~]# iptables -N ACCEPTIP
[root@localhost ~]# iptables -N DROPIP
[root@localhost ~]# iptables -N ADMINIP

[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain ACCEPTIP (0 references)
target prot opt source destination

Chain ADMINIP (0 references)
target prot opt source destination

Chain DROPIP (0 references)
target prot opt source destination

Chain WEBSERVER (0 references)
target prot opt source destination

실습> 사용자 정의 체인 이름 변경하기 (-E 옵션)

사용자 정의 체인 명령어 옵션
-N: 사용자 정의 체인 생성하기 (new)
-X: 사용자 정의 체인 삭제하기 (delete-chain)
-E: 사용자 정의 체인 이름 변경하기 (rename-chain)

사용법:
iptables -N 체인명
iptables -X 체인명
iptables -E 이전체인명 새체인명

체인명
-WEBSERVER -> WEB
-ACCEPTIP -> ACCEPTIPADDR
-DROPIP -> DROPIPADDR
-ADMINIP -> ADMINIPADDR

[root@localhost ~]# iptables -E WEBSERVER WEB
[root@localhost ~]# iptables -E ACCEPTIP ACCEPTIPADDR
[root@localhost ~]# iptables -E DROPIP DROPIPADDR
[root@localhost ~]# iptables -E ADMINIP ADMINIPADDR

[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain ACCEPTIPADDR (0 references)
target prot opt source destination

Chain ADMINIPADDR (0 references)
target prot opt source destination

Chain DROPIPADDR (0 references)
target prot opt source destination

Chain WEB (0 references)
target prot opt source destination

실습> 사용자 정의 체인 삭제하기 (-X 옵션)

사용자 정의 체인 명령어 옵션
-N: 사용자 정의 체인 생성하기 (new)
-X: 사용자 정의 체인 삭제하기 (delete-chain)
-E: 사용자 정의 체인 이름 변경하기 (rename-chain)

사용법:
iptables -N 체인명
iptables -X 체인명
iptables -E 이전체인명 새체인명

!!! 참고로 사용자 정의 체인을 삭제할 때는 룰이 존재하면 삭제할 수 없다. !!!

-X 옵션을 이용해서 4개의 사용자 정의 체인을 삭제한다.
[root@localhost ~]# iptables -nL | grep refer
Chain ACCEPTIPADDR (0 references)
Chain ADMINIPADDR (0 references)
Chain DROPIPADDR (0 references)
Chain WEB (0 references)

[root@localhost ~]# iptables -R ACCEPTIPADDR 1 -s 1.1.1.1/32 -j ACCEPT
[root@localhost ~]# iptables -nL ACCEPTIPADDR
Chain ACCEPTIPADDR (0 references)
target prot opt source destination
ACCEPT all -- 1.1.1.1 0.0.0.0/0

ACCEPTIPADDR 체인에 방화벽 룰이 설정되어 있기 때문에 삭제가 안된다.
[root@localhost ~]# iptables -X ACCEPTIPADDR
iptables: Directory not empty.

ACCEPTIPADDR 체인에 방화벽 룰을 초기화 한다.
[root@localhost ~]# iptables -F ACCEPTIPADDR
[root@localhost ~]# iptables -nL ACCEPTIPADDR
Chain ACCEPTIPADDR (0 references)
target prot opt source destination

[root@localhost ~]# iptables -X ACCEPTIPADDR
[root@localhost ~]# iptables -X ADMINIPADDR
[root@localhost ~]# iptables -X DROPIPADDR
[root@localhost ~]# iptables -X WEB

[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

실습> IP주소로 룰을 허용하는 경우

1. filter/INPUT 체인 룰 등록
Host OS에서 Server쪽으로 접근할 때 IP주소만 보고 패킷을 허용하고자 할 때 사용한다.
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -A INPUT -s 200.200.200.1 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -j DROP
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 200.200.200.1 0.0.0.0/0
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

2. Host OS에서 접속
Host OS에서 ssh 접속을 하면 방화벽 룰에 ACCEPT로 설정했기 때문에 접속이 허가된다.
C:\Users\user>del C:\Users\user.ssh\known_hosts

C:\Users\user>ssh root@200.200.200.3
The authenticity of host '200.200.200.3 (200.200.200.3)' can't be established.
ECDSA key fingerprint is SHA256:D/f3XEPGyb9xvEX8aWFCinFNmA6J9v4Cm2obVcYhAFI.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '200.200.200.3' (ECDSA) to the list of known hosts.
root@200.200.200.3's password:
Last login: Tue Jan 17 09:18:07 2023 from 200.200.200.1
[root@localhost ~]# exit

  1. 200.200.200.4에서 접속
    200.200.200.4 에서 ssh 접속을 하면 방화벽 룰 마지막에 DROP으로 설정했기 때문에 접속이 거부된다.
    [root@localhost ~]# ssh root@200.200.200.3
    <-- 방화벽에 막혀서 접속할 수 없다.

4. 패킷 확인
[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
171 13383 ACCEPT all -- * 200.200.200.1 0.0.0.0/0
12 1024 DROP all --
* 0.0.0.0/0 0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 83 packets, 10210 bytes)
pkts bytes target prot opt in out source destination

시간이 지나면 200.200.200.4에서 몇번 접속을 해보고 안되면 timed out이 발생되고 접속이 끊어진다.
[root@localhost ~]# ssh root@200.200.200.3
ssh: connect to host 200.200.200.3 port 22: Connection timed out

5. OUTPUT 룰 등록
OUTPUT 체인에도 200.200.200.1이 ssh로 연결될 수 있도록 방화벽 룰을 등록한다.
OUTPUT 체인의 가장 마지막 룰은 DROP으로 설정한다.

[root@localhost ~]# iptables -A OUTPUT -d 200.200.200.1 -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -j DROP
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 200.200.200.1 0.0.0.0/0
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 all -- 0.0.0.0/0 200.200.200.1
DROP all -- 0.0.0.0/0 0.0.0.0/0

6. 방화벽 룰 저장
[root@localhost ~]# iptables-save > iptables.rules

7. 잘못된 방화벽 룰
방화벽 룰이 잘못 설정되면 접속이 끊어진다.
[root@localhost ~]# iptables -F OUTPUT
[root@localhost ~]# iptables -A OUTPUT -s 200.200.200.1 -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -j DROP
Connection closed by foreign host.
Disconnected from remote host(200.200.200.3:22) at 12:49:53.

접속이 끊어진 상태에서 다시 접속을 해도 방화벽 때문에 연결되지 않는다.
C:\Users\user>ssh root@200.200.200.3
ssh: connect to host 200.200.200.3 port 22: Connection timed out

8. 방화벽 룰 해제
콘솔로 접속해서 잘못 설정된 방화벽 룰을 해제한다.
[root@localhost ~]# iptables -F

실습> PORT 주소로 룰 설정하기

형식:
INPUT : -p <프로토콜> --sport <출발지 포트> -j ACCEPT
INPUT : -p <프로토콜> --dport <목적지 포트> -j ACCEPT
OUTPUT : -p <프로토콜> --sport <출발지 포트> -j ACCEPT
OUTPUT : -p <프로토콜> --dport <목적지 포트> -j ACCEPT

1. 방화벽 룰 설정
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -j DROP

[root@localhost ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
DROP all -- 0.0.0.0/0 0.0.0.0/0

2. 접속
C:\Users\user>ssh root@200.200.200.3
root@200.200.200.3's password:
Last login: Tue Jan 17 14:13:04 2023 from 200.200.200.1
[root@localhost ~]# exit
logout
Connection to 200.200.200.3 closed.

실습> PORT 주소로 룰 설정하기

형식:
INPUT : -p <프로토콜> --sport <출발지 포트> -j ACCEPT
INPUT : -p <프로토콜> --dport <목적지 포트> -j ACCEPT
OUTPUT : -p <프로토콜> --sport <출발지 포트> -j ACCEPT
OUTPUT : -p <프로토콜> --dport <목적지 포트> -j ACCEPT

조건:
서버에 웹서비스(http, 80)와 원격접속 서비스(ssh, 22)만 허용하고 나머지는 모두 거부한다.

1. 웹서버 패키지 설치
[user1@localhost ~]# iptables -F
[user1@localhost ~]# yum -y install httpd
[user1@localhost ~]# systemctl start httpd
[user1@localhost ~]# echo Welcome to my webserver. > /var/www/html/index.html

2. 방화벽 룰 설정
fileter/INPUT 체인에 웹서비스(http, 80)와 원격접속 서비스(ssh, 22)만 허용하고
나머지는 모두 거부하는 설정을 한다.
[user1@localhost ~]# iptables -A INPUT -p tcp --dport http -j ACCEPT
[user1@localhost ~]# iptables -A INPUT -p tcp --dport ssh -j ACCEPT
[user1@localhost ~]# iptables -A INPUT -j DROP
[user1@localhost ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
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 dpt:22
DROP all -- 0.0.0.0/0 0.0.0.0/0

fileter/OUTPUT 체인에 웹서비스(http, 80)와 원격접속 서비스(ssh, 22)만 허용하고
나머지는 모두 거부하는 설정을 한다.
[user1@localhost ~]# iptables -A OUTPUT -p tcp --sport http -j ACCEPT
[user1@localhost ~]# iptables -A OUTPUT -p tcp --sport ssh -j ACCEPT
[user1@localhost ~]# iptables -A OUTPUT -j DROP
[user1@localhost ~]# iptables -nL OUTPUT
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
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 spt:22
DROP all -- 0.0.0.0/0 0.0.0.0/0

filter 테이블의 방화벽 전체 룰 설정은 아래와 같다.
[user1@localhost ~]# 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:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
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:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:22
DROP all -- 0.0.0.0/0 0.0.0.0/0

[user1@localhost ~]# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -j DROP
-A OUTPUT -p tcp -m tcp --sport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT
-A OUTPUT -j DROP

방화벽 룰을 httpssh.rules 파일로 저장한다.
[user1@localhost ~]# iptables-save > httpssh.rules

3. 웹서버 접속
Host OS에서 브라우저로 http://200.200.200.3/ 으로 접속하면 접속이 잘된다.

Welcome to my webserver.

Host OS에서 ssh로 접속하면 접속이 잘된다.
C:\Users\user>ssh root@200.200.200.3
root@200.200.200.3's password:
Last login: Tue Jan 17 15:15:55 2023 from 200.200.200.1
[root@localhost ~]# exit

실습> 아래 조건에 맞는 방화벽 설정하기

형식:
INPUT : -p <프로토콜> --sport <출발지 포트> -j ACCEPT
INPUT : -p <프로토콜> --dport <목적지 포트> -j ACCEPT
OUTPUT : -p <프로토콜> --sport <출발지 포트> -j ACCEPT
OUTPUT : -p <프로토콜> --dport <목적지 포트> -j ACCEPT

조건:
1. 방화벽 룰은 filter/INPUT, OUTPUT 모두 설정한다.
2. Client 200.200.200.1
-http 서비스 허용
-ssh 서비스 허용
3. Client 200.200.200.4
-http 서비스 허용
-ssh 서비스 거부
4. filter/INPUT, OUTPUT 체인의 마지막 룰은 모두 거부로 설정한다.

1. 방화벽 룰 설정
설정된 모든 방화벽 룰을 초기화 한다.
[user1@localhost ~]# iptables -F

INPUT 체인에 방화벽 룰을 설정한다.
[user1@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[user1@localhost ~]# iptables -A INPUT -p tcp --dport 22 -s 200.200.200.1 -j ACCEPT
[user1@localhost ~]# iptables -A INPUT -j DROP

OUTPUT 체인에 방화벽 룰을 설정한다.
[user1@localhost ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
[user1@localhost ~]# iptables -A OUTPUT -p tcp --sport 22 -d 200.200.200.1 -j ACCEPT
[user1@localhost ~]# iptables -A OUTPUT -j DROP

설정된 방화벽룰을 httpssh2.rules 파일로 저장한다.
[user1@localhost ~]# iptables-save > httpssh2.rules

2. 방화벽 룰 확인
[user1@localhost ~]# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 200.200.200.1/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -j DROP
-A OUTPUT -p tcp -m tcp --sport 80 -j ACCEPT
-A OUTPUT -d 200.200.200.1/32 -p tcp -m tcp --sport 22 -j ACCEPT
-A OUTPUT -j DROP

[user1@localhost ~]# 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:80
ACCEPT tcp -- 200.200.200.1 0.0.0.0/0 tcp dpt:22
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:80
ACCEPT tcp -- 0.0.0.0/0 200.200.200.1 tcp spt:22
DROP all -- 0.0.0.0/0 0.0.0.0/0

3. 접속 확인
Client 200.200.200.1에서 Server로 접속을 확인한다.
http://200.200.200.3/
Welcome to my webserver.

C:\Users\user>ssh root@200.200.200.3
root@200.200.200.3's password:
Last login: Tue Jan 17 15:46:29 2023 from 200.200.200.1
[root@localhost ~]# exit

Client 200.200.200.4에서 Server로 접속을 확인한다.
[user1@localhost ~]# lynx --dump 200.200.200.3
Welcome to my webserver.

[user1@localhost ~]# ssh root@200.200.200.3
ssh: connect to host 200.200.200.3 port 22: Connection timed out


실습> DNS 트래픽 허용하기

dns query: udp/53

1. 패키지 설치
[user1@localhost ~]# iptables -F
[user1@localhost ~]# yum -y install bind-utils

2. 도메인 주소 질의
naver.com 의 도메인 주소를 DNS 서버에 질의한다.
[user1@localhost ~]# nslookup
'> server <-- server를 입력하고 엔터
Default server: 168.126.63.1
Address: 168.126.63.1#53
Default server: 168.126.63.2
Address: 168.126.63.2#53
'> naver.com <-- naver.com을 입력하고 엔터
Server: 168.126.63.1
Address: 168.126.63.1#53

Non-authoritative answer:
Name: naver.com
Address: 223.130.195.95
Name: naver.com
Address: 223.130.200.104
Name: naver.com
Address: 223.130.195.200
Name: naver.com
Address: 223.130.200.107
'> exit

3. 방화벽 룰 설정
[user1@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[user1@localhost ~]# iptables -A INPUT -j DROP
[user1@localhost ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
[user1@localhost ~]# iptables -A OUTPUT -j DROP

4. 방화벽 룰 확인
[user1@localhost ~]# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -j DROP
-A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT
-A OUTPUT -j DROP

[user1@localhost ~]# 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
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
DROP all -- 0.0.0.0/0 0.0.0.0/0

5. DNS 질의
[user1@localhost ~]# nslookup
'> server
Default server: 168.126.63.1
Address: 168.126.63.1#53
Default server: 168.126.63.2
Address: 168.126.63.2#53
'> daum.net
;; connection timed out; no servers could be reached

방화벽 룰의 설정을 유지하면서 어떤 추가 설정을 해야 daum.net의 IP주소를 받아올 수 있는가?

udp/53 포트 주소를 이용해서 설정한 경우
[user1@localhost ~]# iptables -I OUTPUT -p udp --dport 53 -j ACCEPT
[user1@localhost ~]# iptables -I INPUT -p udp --sport 53 -j ACCEPT
[user1@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp spt:53
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
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 udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:22
DROP all -- 0.0.0.0/0 0.0.0.0/0

[user1@localhost ~]# nslookup
'> server 168.126.63.1
Default server: 168.126.63.1
Address: 168.126.63.1#53
'> daum.net
Server: 168.126.63.1
Address: 168.126.63.1#53

Non-authoritative answer:
Name: daum.net
Address: 121.53.224.15
Name: daum.net
Address: 121.53.105.210
'> exit

DNS Server의 IP주소를 이용해서 설정한 경우
[user1@localhost ~]# iptables -D INPUT 1
[user1@localhost ~]# iptables -D OUTPUT 1
[user1@localhost ~]# iptables -I OUTPUT -d 168.126.63.1 -j ACCEPT
[user1@localhost ~]# iptables -I INPUT -s 168.126.63.1 -j ACCEPT
[user1@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 168.126.63.1 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
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 all -- 0.0.0.0/0 168.126.63.1
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:22
DROP all -- 0.0.0.0/0 0.0.0.0/0
[user1@localhost ~]# nslookup
'> server 168.126.63.1
Default server: 168.126.63.1
Address: 168.126.63.1#53
'> daum.net
Server: 168.126.63.1
Address: 168.126.63.1#53

Non-authoritative answer:
Name: daum.net
Address: 121.53.105.210
Name: daum.net
Address: 121.53.224.15
'> exit

실습> PORT 주소로 룰을 허용하는 경우

C:\Users\user>nslookup
기본 서버: ns.lgdacom.net
Address: 164.124.101.2

'> server 168.126.63.1
기본 서버: kns.kornet.net
Address: 168.126.63.1

'> mirror.kakao.com
서버: kns.kornet.net
Address: 168.126.63.1

권한 없는 응답:
이름: mirror.kakao.com
Address: 113.29.189.165

WWW: tcp/80번

[user1@localhost ~]# lynx --dump linuxmaster.net/ipaddress.html
IP address is 1.xxx.xx.xx.

yum을 이용해서 패키지를 설치하면
DNS/WEB 서비스가 방화벽에서 열려있지 않으면 패키지를 받아올 수 없다.

1. 방화벽 룰 설정
[user1@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[user1@localhost ~]# iptables -A INPUT -j DROP

[user1@localhost ~]# 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
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

2. 패키지 설치
[user1@localhost ~]# yum -y install mc
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
<-- 방화벽의 룰이 설정되어 있지 않으므로 반응이 없다.

^Z
[1]+ Stopped yum -y install mc

[user1@localhost ~]# kill %1

3. 방화벽 룰 추가
패키지 저장소의 도메인주소의 IP주소를 알아오기 위해서는 DNS 쿼리에 사용되는 udp/53번 포트를
filter 테이블의 INPUT 체인에 추가해야 한다.
DNS: udp/53번

[user1@localhost ~]# iptables -I INPUT -p udp --sport 53 -j ACCEPT

패키지 저장소에서 패키지를 다운로드 받기 위해서는 웹서버에 사용되는 tcp/80번 포트를
filter 테이블의 INPUT 체인에 추가해야 한다.
WWW: tcp/80번

[user1@localhost ~]# iptables -I INPUT -p tcp --sport 80 -j ACCEPT
[user1@localhost ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
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
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
DROP all -- 0.0.0.0/0 0.0.0.0/0

4. 패키지 설치
filter 테이블의 INPUT 체인에 출발지 포트에 DNS(udp/53), WWW(tcp/80) 룰을 추가했다면
정상적으로 패키지를 다운로드 받아서 시스템에 설치할 수 있다.
[user1@localhost ~]# yum -y install mc
:
:(생략)
Running transaction
Installing : 1:mc-4.8.7-11.el7.x86_64 1/1
Verifying : 1:mc-4.8.7-11.el7.x86_64 1/1

Installed:
mc.x86_64 1:4.8.7-11.el7

Complete!

실습> ICMP 룰 허용/거부하기

1. 방화벽 설정
[user1@localhost ~]# iptables -F

Server에 방화벽 룰이 설정되지 않았으므로 ping이 잘 된다.
C:\Users\user>ping 200.200.200.3

Pinging 200.200.200.3 with 32 bytes of data:
Reply from 200.200.200.3: bytes=32 time<1ms TTL=64
Reply from 200.200.200.3: bytes=32 time<1ms TTL=64
Reply from 200.200.200.3: bytes=32 time<1ms TTL=64
Reply from 200.200.200.3: bytes=32 time<1ms TTL=64

Ping statistics for 200.200.200.3:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms

--icmp-type 8 옵션을 생략하면 icmp 프로토콜 전체를 의미한다.
[user1@localhost ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP
[user1@localhost ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8

C:\Users\user>ping 200.200.200.3

Pinging 200.200.200.3 with 32 bytes of data:
Request timed out. <-- 첫 번째 패킷
Request timed out. <-- 두 번째 패킷
Request timed out. <-- 세 번째 패킷
Request timed out. <-- 네 번째 패킷

Ping statistics for 200.200.200.3:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

-nvL 옵션을 이용해서 패킷 4개가 DROP 된 것을 확인할 수 있다.
[user1@localhost ~]# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 54 packets, 3340 bytes)
pkts bytes target prot opt in out source destination
4 240 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8

--icmp-type 옵션이 생략되면 icmp 프로토콜의 모든 type이 의미한다.
[user1@localhost ~]# iptables -F
[user1@localhost ~]# iptables -A INPUT -p icmp -j DROP
[user1@localhost ~]# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 8 packets, 488 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0

C:\Users\user>ping 200.200.200.3

Pinging 200.200.200.3 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 200.200.200.3:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

[user1@localhost ~]# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 19 packets, 1168 bytes)
pkts bytes target prot opt in out source destination
4 240 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0

ICMP 도움을 확인한다.
[user1@localhost ~]# iptables -p icmp -h
:
:(생략)
icmp match options:
[!] --icmp-type typename match icmp type
[!] --icmp-type type[/code] (or numeric type or type/code)
Valid ICMP Types:
any
echo-reply (pong)
destination-unreachable
network-unreachable
host-unreachable
protocol-unreachable
port-unreachable
fragmentation-needed
source-route-failed
network-unknown
host-unknown
network-prohibited
host-prohibited
TOS-network-unreachable
TOS-host-unreachable
communication-prohibited
host-precedence-violation
precedence-cutoff
source-quench
redirect
network-redirect
host-redirect
TOS-network-redirect
TOS-host-redirect
echo-request (ping)
router-advertisement
router-solicitation
time-exceeded (ttl-exceeded)
ttl-zero-during-transit
ttl-zero-during-reassembly
parameter-problem
ip-header-bad
required-option-missing
timestamp-request
timestamp-reply
address-mask-request
address-mask-reply

실습> --tcp-flags 옵션

--tcp-flags: TCP 헤더 부분에 flags를 참고한다.

추가하는 형식: -p tcp --tcp-flags ALL SYN

[user1@localhost ~]# iptables -F
[user1@localhost ~]# iptables -A INPUT -s 1.1.1.1 -j DROP
[user1@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT

200.200.200.4에서 200.200.200.3으로 SYN 패킷을 전송한다.
-c 5: count 5개
-p 22: 22번 포트
-S : SYN 패킷
-a 1.1.1.1: 소스 IP주소를 1.1.1.1로 변조
[L2 Ethernet][L3 IP src:1.1.1.1 dst:200.200.200.3][L3 TCP SYN, port:22][L7 SSH]
[user1@localhost ~]# hping3 200.200.200.3 -c 5 -p 22 -S -a 1.1.1.1

200.200.200.3에서 1.1.1.1 부분의 룰을 확인하면 패킷 5개가 count된 것을 볼 수 있다.
[user1@localhost ~]# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 1 packets, 76 bytes)
pkts bytes target prot opt in out source destination
5 200 DROP all -- * 1.1.1.1 0.0.0.0/0
44 2648 ACCEPT tcp --
* 0.0.0.0/0 0.0.0.0/0 tcp dpt:22

[user1@localhost ~]# iptables -I INPUT -p tcp --dport 22 --tcp-flags ALL SYN -j ACCEPT
[user1@localhost ~]# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 flags:0x3F/0x02
5 200 DROP all --
1.1.1.1 0.0.0.0/0
235 13820 ACCEPT tcp --
* 0.0.0.0/0 0.0.0.0/0 tcp dpt:22

TCP 헤더의 flags를 참고한다.

0x3F: TCP flags 부분에 ALL(UAPRSF) 다 합치면 63이 되고 16진수로 0x3F

200.200.200.4에서 200.200.200.3으로 SYN 패킷 3개를 전송한다.
[user1@localhost ~]# hping3 --help |grep SYN
-S --syn set SYN flag
[user1@localhost ~]# hping3 200.200.200.3 -c 3 -p 22 -S -a 1.1.1.1

200.200.200.3에서 패킷을 확인하면 첫 번째 룰에 패킷 3개가 들어온 것을 확인할 수 있다.
[user1@localhost ~]# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 1 packets, 76 bytes)
pkts bytes target prot opt in out source destination
3 120 ACCEPT tcp -- * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 flags:0x3F/0x02
23 920 DROP all --
1.1.1.1 0.0.0.0/0
250 14796 ACCEPT tcp --
* 0.0.0.0/0 0.0.0.0/0 tcp dpt:22

profile
정보보안 전문가

0개의 댓글