상태추적 모듈/state 모듈로 SSH 접속 설정/state 모듈로 내부망 웹서버 접속 설정/상태 추척 확인/방화벽 설정 상태 저장/vi 에서 백업파일 생성/방화벽 룰 파일 편집/ntsysv 를 이용한 서비스 실행 (교육 43일차)

SW·2023년 1월 19일
0










실습> 상태 추척 모듈

상태 추적
-m state : 패킷의 상태를 파악하는 모듈
형식 : -m state --state 상태
--state NEW : 새로운 연결 패킷
--state ESTABLISHED : 연결된 상태의 패킷
--state RELATED : FTP 사용 시 연결 패킷
--state INVALID : 깨진 패킷 (연결이 안된 이상한 패킷), 길을 가는데 모르는 사람이 아는척 한다.

200.200.200.3# ls /lib64/xtables/
libxt_state.so

200.200.200.3# iptables -F

상태 추적 모듈을 이용한 방화벽 룰을 설정한다.

상태 추적 모듈을 사용하지 않은 경우
Host OS에서 SSH로 처음 접속할 때 매칭이 된다.
인증을 거치고 로그인한 후 SSH에 연결된 후 ls 명령어로 파일의 리스트를 출력해도 매칭이 된다.
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

(추천) 상태 추적 모듈을 사용한 경우
Host OS에서 SSH로 처음 접속할 때 매칭이 된다.
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT

실습> SSH 접속을 state 모듈로 설정하기

테이블: filter

iptables -F
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -m comment --comment '이미 연결된 패킷'
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT -m comment --comment '처음 접속하는 패킷'
iptables -A INPUT -j DROP

200.200.200.3# iptables -nvL

실습> state 모듈로 SSH 접속 설정하기

1. 방화벽 설정
firewall(200.200.200.3) 에서 설정한다.
[root@firewall ~]# \
iptables -t nat -A PREROUTING -d 200.200.200.101 -j DNAT --to 192.168.102.101\
-m comment --comment '내부망 WEB1로D DNAT 설정'

[root@firewall ~]# \
iptables -t nat -A POSTROUTING -s 192.168.102.101 -j SNAT --to 200.200.200.101 \
-m comment --comment '외부망 200.200.200.101로 SNAT 설정'

2. 방화벽 확인
[root@firewall ~]# iptables -t nat -nL

실습> state 모듈로 내부망 웹서버 접속 설정하기

내부망 웹서버를 제어하기 위해서는 filter/FORWARD 을 설정해야 한다.

1. 방화벽 설정
[root@firewall ~]# iptables -P FORWARD DROP
[root@firewall ~]# iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@firewall ~]# iptables -A FORWARD -m state --state NEW -p tcp --dport 80 -j ACCEPT
[root@firewall ~]# iptables -A FORWARD -m state --state NEW -p tcp --dport 22 -j ACCEPT

2. 방화벽 확인
[root@firewall ~]# iptables -nL

3. 웹 서버 접속
Host OS에서 WEB1 서버로 접속하면 웹 페이지가 잘 보인다.
http://200.200.200.101/
Welcome to 192.168.102.101 server.

실습> 상태 추척 확인하기

/proc/net/nf_conntrack: 상태 추적에 대한 정보가 저장된 가상 파일

1. 웹서버 접속
내부망 WEB1로 접속을 한다.
http://200.200.200.101
Welcome to 192.168.102.101 server.

2. 상태 추적 확인
cat으로 /proc/net/nf_conntrack 을 확인한다.
[root@firewall ~]# cat /proc/net/nf_conntrack
ipv4 2 tcp 6 54 CLOSE_WAIT src=200.200.200.1 dst=200.200.200.101 sport=2419 dport=80 src=192.168.102.101 dst=200.200.200.1 sport=80 dport=2419 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
ipv4 2 tcp 6 299 ESTABLISHED src=200.200.200.1 dst=200.200.200.3 sport=1779 dport=22 src=200.200.200.3 dst=200.200.200.1 sport=22 dport=1779 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
ipv4 2 tcp 6 431963 ESTABLISHED src=200.200.200.1 dst=200.200.200.3 sport=1922 dport=22 src=200.200.200.3 dst=200.200.200.1 sport=22 dport=1922 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
ipv4 2 tcp 6 431989 ESTABLISHED src=200.200.200.1 dst=200.200.200.101 sport=2418 dport=80 src=192.168.102.101 dst=200.200.200.1 sport=80 dport=2418 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2

실습> 방화벽 설정 상태 저장하기

systemctl enable iptables 로 반드시 설정해야 한다.

/etc/sysconfig/iptables: 부팅할 때나 iptables 재시작할 때 룰을 읽어들이는 파일

iptables-save: 현재 방화벽 룰을 화면에 출력하는 명령어
-출력 리다이렉션을 이용해서 파일에 저장한다.
형식: iptables-save > 파일명

iptables-restore: 파일에 저장된 방화벽 룰을 복구하는 명령어
-파이프를 이용해서 복구하기도 한다.
형식:
iptables-restore 파일명 (grep root /etc/passwd)
cat 파일명 | iptables-restore (cat /etc/passwd | grep root)

1. 룰 파일 저장
현재 시간을 설정해서 현재 설정된 방화벽 룰 설정을 /etc/sysconfig/iptables 파일에 저장한다.
[root@firewall ~]# yum -y install rdate
[root@firewall ~]# rdate -s time.bora.net

[root@firewall ~]# sysemctl enable iptables

방화벽 룰 형식을 확인한다.
[root@firewall ~]# iptables-save

# Generated by iptables-save v1.4.21 on Thu Jan 19 10:15:55 2023

*nat
:PREROUTING ACCEPT [57:5138]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [41:2854]
:POSTROUTING ACCEPT [47:3166]
-A PREROUTING -d 200.200.200.101/32 -m comment --comment "내부망 WEB1로 DNAT 설정" -j DNAT --to-destination 192.168.102.101
-A POSTROUTING -s 192.168.102.101/32 -m comment --comment "외부망 200.200.200.101로 SNAT 설정" -j SNAT --to-source 200.200.200.101
COMMIT

# Completed on Thu Jan 19 10:15:55 2023
# Generated by iptables-save v1.4.21 on Thu Jan 19 10:15:55 2023

*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [33:2452]
:OUTPUT ACCEPT [275:24159]
-A INPUT -m state --state RELATED,ESTABLISHED -m comment --comment "이미 연결된 패킷" -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m comment --comment "처음 접속하는 패킷" -j ACCEPT
-A INPUT -j DROP
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A FORWARD -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
COMMIT

# Completed on Thu Jan 19 10:15:55 2023

[root@firewall ~]# iptables-save > /etc/sysconfig/iptables

2. 서버 재부팅
서버를 재부팅해서 방화벽 룰이 잘 올라오는지 확인한다.
방화벽룰을 확인하기 위해서 서버를 재부팅할 필요는 없지만 여기서는 테스트이므로 재부팅한다.
[root@firewall ~]# reboot

3. 방화벽 룰 확인
재부팅 후에 방화벽 룰을 확인해서 잘 올라오면 방화벽이 정상적으로 실행되는 것이다.
[root@firewall ~]# iptables -nL

[root@firewall ~]# iptables -t nat -nL

실습> vi 에서 백업파일 생성하기

[root@firewall ~]# echo 111 > 1.txt
[root@firewall ~]# vi 1.txt
:set backup
:set all

[root@firewall ~]# ll
합계 12
-rw-r--r--. 1 root root 8 1월 19 10:31 1.txt
-rw-r--r--. 1 root root 4 1월 19 10:28 1.txt~
-rw-------. 1 root root 1238 10월 20 10:20 anaconda-ks.cfg
[root@firewall ~]# cat 1.txt~
111
[root@firewall ~]# cat 1.txt
111
222

실습> 방화벽 룰 파일 편집하기

filter 테이블의 기본 정책을 모두 DROP으로 설정한다.

1. 방화벽 설정
:set backup
[root@firewall ~]# vi /etc/sysconfig/iptables

# Generated by iptables-save v1.4.21 on Thu Jan 19 10:19:54 2023

*nat
:PREROUTING ACCEPT [60:5672]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [53:3766]
:POSTROUTING ACCEPT [59:4078]
-A PREROUTING -d 200.200.200.101/32 -m comment --comment "내부망 WEB1로 DNAT 설정" -j DNAT --to-destination 192.168.102.101
-A POSTROUTING -s 192.168.102.101/32 -m comment --comment "외부망 200.200.200.101로 SNAT 설정" -j SNAT --to-source 200.200.200.101
COMMIT

# Completed on Thu Jan 19 10:19:54 2023
# Generated by iptables-save v1.4.21 on Thu Jan 19 10:19:54 2023

*filter
:INPUT DROP [0:0]
:FORWARD DROP [34:2528]
:OUTPUT DROP [319:28403]

###########
## INPUT ##
###########
# 연결되지도 않은 깨진 패킷이 들어오면 로그를 남기고 패킷을 차단한다.

-A INPUT -m state --state INVALID -j LOG --log-prefix "DROP INVALID " --log-ip-options --log-tcp-options
-A INPUT -m state --state INVALID -j DROP
-A INPUT -m state --state RELATED,ESTABLISHED -m comment --comment "이미 연결된 패킷" -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m comment --comment "처음 접속하는 패킷" -j ACCEPT

#############
## FORWARD ##
#############
# 연결되지도 않은 깨진 패킷이 들어오면 로그를 남기고 패킷을 차단한다.

-A FORWARD -m state --state INVALID -j LOG --log-prefix "DROP INVALID " --log-ip-options --log-tcp-options
-A FORWARD -m state --state INVALID -j DROP
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT -m comment --comment https
-A FORWARD -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -m comment --comment http
-A FORWARD -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -m comment --comment ssh

############
## OUTPUT ##
############

-A OUTPUT -m state --state INVALID -j LOG --log-prefix "DROP INVALID " --log-ip-options --log-tcp-options
-A OUTPUT -m state --state INVALID -j DROP
-A OUTPUT -m state --state RELATED,ESTABLISHED -m comment --comment "이미 연결된 패킷" -j ACCEPT
-A OUTPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
-A OUTPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
-A OUTPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT
-A OUTPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
COMMIT

# Completed on Thu Jan 19 10:19:54 2023

2. 방화벽 룰 복구
설정이 완료된 방화벽 파일을 iptables-restore 명령어를 이용해서 방화벽 룰을 복구한다.
[root@firewall ~]# iptables-restore /etc/sysconfig/iptables

3. 방화벽 룰 확인
[root@firewall ~]# iptables -nL

실습> mutiport 모듈

libxt_multiport.so

multiport 형식

multiport 모듈을 사용하지 않은 경우

iptables -F
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 1521 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT

200.200.200.3# iptables -nL INPUT

multiport 모듈을 사용한 경우

iptables -F
iptables -A INPUT -p tcp -m multiport --dports 80,22,20,21,25,1521,3306 -j ACCEPT

200.200.200.3# iptables -nL INPUT

실습> string 모듈 사용하기

모듈명: /lib64/xtables/libxt_string.so

형식:
[root@firewall ~]# iptables -m string -h

모듈 설명:
string 모듈은 애플리케이션(L7) 레이어에 데이터를 볼 수 있는 기능으로
특정 문자열을 허용/거부할 수 있는 기능을 제공한다.

알고리즘:
보이어 무어(Boyer-moore)
-패턴을 뒤에서 부터 (오른쪽에서 왼쪽) 비교하여 탐지

커누스-모리스-프랫 알고리즘(Knuth–Morris–Pratt algorithm)
-문자열 중에 특정 패턴을 찾아내는 문자열 검색 알고리즘의 하나로
주먹구구식 알고리즘에서 불필요한 문자간 비교를 없애기 위해 Next 데이터라고 하는
패턴 정보를 활용하여 검색 시간을 단축하는 방식

지원하는 기능으로 아래 나오는 웹페이지를 제어하면서 웹 문서가 접속이 되는지 접속이 거부되는지 확인한다.

내부망 웹서버의 /hello.html 페이지를 요청하면 거부한다.

1. 방화벽 설정
[root@firewall ~]# iptables -F

2. hello.html 페이지 생성
[root@web1 ~]# cd /var/www/html
[root@web1 html]# vi hello.html

<!--
파일명: hello.html
프로그램 설명: string module test page
작성자: 리눅스마스터넷
작성일: 2023.01.19
-->
<html>
<head>
 <title> WEB#1 Server </title>
 <meta charset=utf-8>
</head>

<body>
<center> Hello my server! </center>
</body>

</html>

2. string 모듈이 적용이 안된 경우
http://200.200.200.101/hello.html
Hello my server!

3. string 모듈이 적용된 경우
[root@firewall ~]# iptables -I FORWARD -p tcp -m tcp --dport 80 -m string --string "GET /hello.html" --algo kmp -j DROP

[root@firewall ~]# iptables -nL FORWARD

방화벽 룰을 등록하고 접속을 하면 접속이 안된다.
이유는 FORWARD 체인의 DROP 룰에 매칭되기 때문이다.
http://200.200.200.101/hello.html
사이트에 연결할 수 없음연결이 재설정되었습니다.
다음 방법을 시도해 보세요.

연결 확인
프록시 및 방화벽 확인
Windows 네트워크 진단 프로그램 실행
ERR_CONNECTION_RESET

실습> string 모듈 사용하기 2

[root@web1 ~]# cd /var/www/html
[root@web1 html]# mkdir admin
[root@web1 html]# cd admin
[root@web1 admin]# echo "관리자 페이지입니다" > index.html

2. string 모듈이 적용이 안된 경우
http://200.200.200.101/admin/
관리자 페이지입니다

3. string 모듈이 적용된 경우
[root@firewall ~]# iptables -F
[root@firewall ~]# iptables -I FORWARD -p tcp -m tcp --dport 80 -m string --string "GET /admin/" --algo kmp -j DROP
[root@firewall ~]# iptables -nL FORWARD

http://200.200.200.101/admin/
사이트에 연결할 수 없음연결이 재설정되었습니다.
다음 방법을 시도해 보세요.

연결 확인
프록시 및 방화벽 확인
Windows 네트워크 진단 프로그램 실행
ERR_CONNECTION_RESET

[root@firewall ~]# iptables -F
[root@firewall ~]# iptables -A FORWARD -s 200.200.200.1 -p tcp -m tcp --dport 80 -m string --string "GET /admin/" --algo kmp -j ACCEPT
[root@firewall ~]# iptables -A FORWARD -p tcp -m tcp --dport 80 -m string --string "GET /admin/" --algo kmp -j DROP
[root@firewall ~]# iptables -nL FORWARD

Host OS에서 관리자 페이지로 접속하면 첫 번째 룰에 매칭되므로 접속이 잘 된다.
http://200.200.200.101/admin/
관리자 페이지입니다

다른 IP주소(200.200.200.22)에서 관리자 페이지로 접속하면 두 번째 룰에 매칭되므로 접속이 거부된다.
200.200.200.22# yum -y install lynx
200.200.200.22# lynx --dump http://200.200.200.101/admin
<-- 접속이 안되고 멈춰있다.

실습> MAC 주소 모듈 사용하기

libxt_mac.so

1. 패키지 설치
net-tools 패키지를 설치해서 arp 명령어로 Host OS의 MAC주소를 확인한다.
[root@firewall ~]# yum -y install net-tools
[root@firewall ~]# arp -n

[root@firewall ~]# iptables -F
[root@firewall ~]# iptables -nL

2. MAC주소 등록 연습
[root@firewall ~]# iptables -A INPUT -m mac --mac-source 00:11:22:33:44:55 -j ACCEPT
[root@firewall ~]# iptables -A INPUT -m mac --mac-source 12:34:56:78:90:aa -j ACCEPT
[root@firewall ~]# iptables -nvL INPUT

[root@firewall ~]# iptables -F INPUT

3. 방화벽 룰 설정
MAC 주소 같이 넣어서 등록한다.
-A INPUT: filter 테이블의 INPUT 체인
-m state --state NEW: 처음 접속의 syn
-p tcp --dport 22: TCP/22 SSH
-s 200.200.200.1: 출발지 IP주소가 200.200.200.1
-m mac --mac-source 00:50:56:C0:00:08: MAC주소는 00:50:56:C0:00:08
-j ACCEPT: 패킷을 허용한다.

[root@firewall ~]# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@firewall ~]# iptables -A INPUT -m state --state NEW -p tcp --dport 22 \
-s 200.200.200.1 -m mac --mac-source <자신의 HostOS의 MAC주소> -j ACCEPT

[root@firewall ~]# iptables -P INPUT DROP

[root@firewall ~]# iptables -nL

4. 서버 접속
cmd 창에서 ssh 접속 파일을 삭제한 후 서버로 접속한다.
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:SZDu0djBoZJPy/0y/susW9KiWsxHX/e/8JQKLhHF8r4.
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: Thu Jan 19 10:51:59 2023 from hostos
[root@firewall ~]# exit

실습> /etc/sysconfig/iptables 분석하기

실습> 현재 룰을 /etc/sysconfig/iptables 파일로 저장하기

[root@firewall ~]# service iptables save
[root@firewall ~]# iptables-save > /etc/sysconfig/iptables

실습> ntsysv 를 이용한 서비스 실행 설정하기

<--
[root@firewall ~]# yum -y install ntsysv
[root@firewall ~]# ntsysv

[root@firewall ~]# systemctl status iptables
● iptables.service - IPv4 firewall with iptables
Loaded: loaded (/usr/lib/systemd/system/iptables.service; enabled; vendor preset: disabled)
Active: active (exited) since 목 2023-01-19 10:21:12 KST; 1h 59min ago
Process: 663 ExecStart=/usr/libexec/iptables/iptables.init start (code=exited, status=0/SUCCESS)
Main PID: 663 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/iptables.service

1월 19 10:21:11 firewall.server.com systemd[1]: Starting IPv4 firewall with iptables...
1월 19 10:21:12 firewall.server.com iptables.init[663]: iptables: Applying firewall rules: [ OK ]
1월 19 10:21:12 firewall.server.com systemd[1]: Started IPv4 firewall with iptables.
Hint: Some lines were ellipsized, use -l to show in full.

profile
정보보안 전문가

0개의 댓글