이론
DMZ
내부 네트워크에 존재하지만 외부에서 접근할 수 있는 특수한 네트워크 영역을 말한다.
Inbound vs Outbound
Stateful vs Stateless 방화벽
Stateful 방화벽은 패킷을 허용하거나 거부하는 결정을 내리기 전에 패킷이 허용된 연결 상태와 일치하는지 확인한다.
Stateless 방화벽은 단순한 패킷 필터링을 수행하며, 패킷이 네트워크 규칙을 준수하는지 확인한다.
실습
VyOS, DMZ 실습
VyOS 설정
set : 설정
delete : 삭제
ex) nat 설정 전체를 삭제하고 싶다 => delete nat
ex) dnat 설정 전체를 삭제하고 싶다 => delete nat destination
ex) rule 2222 dnat 설정을 지우고 싶다 => delete nat destination rule 2222
sh : 설정값 확인
ex) nat 설정을 보고싶다 => sh nat
ex) dnat 설정을 보고싶다 => sh nat destination
ex) 전체 설정을 보고싶다 => sh
VyOS : 방화벽 기능이 있는 오픈소스 라우터
VyOS를 먼저 설치한다.
conf : 사용자모드 => 프리빌리지(관리자) 모드
gns에서의 do = run
# 관리자 모드 접속
$ conf
# 인터페이스 정보 확인
$ run show int
# 인터페이스 주소 설정.
$ set int eth eth0 add 211.183.3.252/24
# 반영
$ commit
# 통신 확인
$ ping 211.183.3.2
# vyos라는 라우터의 eht0이 vmnet8에 속해있음
# GW 설정
$ set system gateway-address 211.183.3.2
# 반영
$ commit
# 웹 통신 확인
$ ping 8.8.8.8
# ssh-server를 22번 포트로 활성화
$ set service ssh port 22
# xshell로 접속 가능
$ commit
설정을 통해 네트워크 어댑터를 추가한다. (VMnet1, VMnet10)
두개의 영역(zone)을 추가하고 해당 영역에 속해있고 싶다면 인터페이스를 추가하면 된다.
# 이더넷 추가
$ set int eth eth1 add 192.168.1.252/24
$ set int eth eth2 add 172.16.101.252/24
$ commit
$ run sh int
# 설명을 달아준다.
$ set int eth eth2 description DMZ
$ set int eth eth1 description PRIVATE
$ set int eth eth0 description PUBLIC
$ commit
$ run sh int
# 아무 서버나 켜서 vmnet8에 둔 다음 vyos의 eth0과 통신이 되는지 확인한다.
$ ping 211.183.3.252
DMZ-web 설정
<pirvate>
mint를 client로 사용한다.
ip: 192.168.1.100
gw: 192.168.1.252
<DMZ>
CentOS7을 'DMZ-web'이라는 이름으로 생성한다.
ip: 172.16.101.80
gw: 171.16.101.252
vmnet10번 대역 설정: 172.16.101.0
dmz-web에 웹서버를 설치한다.
<VyOS>
현재 통신이 안되는 상황이므로, 통신이 되게끔 구성한다. => PAT
# vyos
# Private 대역의 PAT 설정
$ set nat source rule 1 source address 172.16.101.0/24
$ set nat source rule 1 outbound-interface eth0
$ set nat source rule 1 translation address 211.183.3.252
$ set nat source rule 2 source address 192.168.1.0/24
$ set nat source rule 2 outbound-interface eth0
$ set nat source rule 2 translation address 211.183.3.252
$ commit
# PAT 설정 후 통신 됨
$ ping 211.183.3.2
# dmz-web
# 웹 서버 설치
$ yum -y install httpd
# 웹서버 동작 및 방화벽에 룰 추가
$ systemctl enable --now httpd
$ firewall-cmd --permanent --add-port=80/tcp
$ firewall-cmd --reload
# 민트 웹브라우저에서 웹서버 접속 잘 되는 것을 확인 가능
# 172.16.101.80
# vyos
# 웹 서버에 대한 DNAT 설정
$ set nat destination rule 10 inbound-interface eth0
$ set nat destination rule 10 translation address 172.16.101.80
$ set nat destination rule 10 destination port 80
$ set nat destination rule 10 protocol tcp
$ commit
# 민트 웹브라우저에서 접속 가능 확인
# 211.183.3.252
Port 변경 실습 (DNAT, Port Forward)
명확하게 하기위해 vmware workstation에서 vmnet1 과 vmnet5 의 host-connection을 푼다.
DMZ-web으로 xshell 접속을 가능하게 해보자
1.DMZ-web에 대한 DNAT(port 22 tcp) 설정
$ set nat destination rule 20 destination port 22
$ set nat destination rule 20 protocol tcp
$ set nat destination rule 20 inbound-interface eth0
$ set nat destination rule 20 translation address 172.16.101.80
$ commit
2. VyOS에 대한 ssh접속 포트를 222번으로 변경
$ set service ssh port 222
$ commit
xshell에서 접속 포트를 222번으로 수정
mint로 xshell 접속을 가능하게 해보자. 포트는 2222번, VyOS DNAT 룰은 2222번
$ set destination rule 2222 destination port 2222
$ set nat destination rule 2222 protocol tcp
$ set nat destination rule 2222 translation address 192.168.1.100
$ set nat destination rule 2222 inbound-interface eth0
mint의 ssh 포트 변경
# mint VM
# port의 주석을 풀고 2222로 변경
$ vi /etc/ssh/sshd_config
Port 2222
# 재시작
$ systemctl restart sshd
xshell에서 접속 포트를 2222번으로 수정
포트포워딩의 개념으로 봐도 무방하다. 2222번이면 mint로 보내주고, 80번으로 들어가면 DNAT web으로 보내주고...
DMZ-web 서버에 FTP 서버, TELNET 서버 설정 실습
# dmz-web
# 패키지 설치
$ yum -y install vsftpd telnet-server
# 재시작
$ systemctl restart vsftpd telnet.socket
# 테스트를 위한 클라이언트(명령어) 설치
$ yum -y install ftp telnet
# ftp가 '기능적으로 분제 없음 확인
$ ftp 172.16.101.80
ftp>exit
# 방화벽 허용
$ firewall-cmd --permanent --add-port=20/tcp
$ firewall-cmd --permanent --add-port=21/tcp
$ firewall-cmd --permanent --add-port=23/tcp
$ firewall-cmd --reload
# 셀리눅스 임시 종료
$ setenforce 0
# 민트에서 접속이 잘 되는걸 확인. = 방화벽도 잘 열렸고 가로막고 있는게 아무것도 없다.
# = DNAT만 제대로 해주면 될 것이다.
# mint
# ftp 172.16.101.80
# vyos
# TELNET DNAT 설정
$ set nat destination rule 2323 inbound-interface eth0
$ set nat destination rule 2323 translation addres 172.16.101.80
$ set nat destination rule 2323 protocol tcp
$ set nat destination rule 2323 destination port 23
$ commit
# xshell에서 프로토콜 TELNET으로 텔넷 테스트
# FTP NAT 설정
$ set nat destination rule 2020 inbound-interface eth0
$ set nat destination rule 2020 translation addres 172.16.101.80
$ set nat destination rule 2020 protocol tcp
$ set nat destination rule 2020 destination port 20
$ set nat destination rule 2121 destination port 21
$ set nat destination rule 2121 protocol tcp
$ set nat destination rule 2121 translation addres 172.16.101.80
$ set nat destination rule 2121 inbound-interface eth0
$ commit
# 컴퓨터 명령어 프롬프트에서 확인
# cmd에 ftp 명령어가 있으니 테스트해본다.
# 엄밀히 따지면 211.183.3.0 /24 대역에서 테스트를 해야하나,
# 노트북에서 호스트 커넥션을 통해 211.183.3.0 /24 대역으로 접근이 가능하기때문에 노트북에서 211.183.3.252로 접속해도 괜찮다.
$ ftp 211.183.3.252
ftp>exit
Zone 기반 방화벽 설정 실습
PUBLIC, PRIVATE, DMZ 3개의 존을 구성한다. 구성을 하는 순간 통신이 차단된다.
설정은 vyos 서버에서 하고, dmz-web/mint client에서 확인한다.
# DMZ-web
$ ping 192.168.1.100
방화벽을 구성할때는 방화벽 구성전 - 구성후 각각에 대해 테스트를 한 후 의도에 맞게 방화벽이 설정됐는지를 확인하는게 중요하다. 가령, 방화벽 구성후 통신이 안되는 상황이고 그게 내가 의도했던 바라고 하더라도, 그 전에도 통신이 안됐을 확률도 있기 때문이다. 그래서 존설정 전에 통신이 잘 되는지 확인하는게 중요하다.
# vyos
$ set zone-policy zone public interface eth0
$ set zone-policy zone private interface eth1
$ set zone-policy zone dmz interface eth2
$ commit
# commit을 치는 순간 DMZ-to-PRIVATE 통신이 끊기는걸 확인할 수 있다. (DMZ-web에서 확인)
각 정책을 수립한다. 설정은 vyos 서버에서 한다.
# 1.PRIVATE_TO_DMZ
# 정책 구성
$ set firewall name PRIVATE_TO_DMZ rule 10 action accept
# 정책 반영
$ set zone-policy zone private interface eth1
$ set zone-policy zone dmz interface eth2
$ commit
$ set firewall name PRIVATE_TO_DMZ rule 10 action accept
$ set zone-policy zone dmz from private firewall name PRIVATE_TO_DMZ
내가 만약 밖으로 나가는 트래픽이 허용이 되어있다고 하더라도, 밖에서 안으로 들어오는 정책이 없다면 통신이 안됨. = 융통성이 없다 = stateless firewall
# 2. DMZ_TO_PRIVATE
# DMZ_TO_PRIVATE이라는 이름의 정책을 만들겠다. rule은 20번이고 허용을 하겠다.
$ set firewall name PRIVATE_TO_DMZ rule 20 action accept
# state가 수립(establish) 되었거나 그와 관련된(related) 모든 프로토콜(protocol all)을 허용 하겠다.
# DMZ에서 PRIVATE으로 향하는 정책이긴 하지만, 오로지 PRIVATE에서 DMZ 방향으로 발생하는 트래픽을 배려한 정책.
# 위 두개의 state 정책으로 인해 ‘stateful 방화벽’이 된다.
$ set firewall name PRIVATE_TO_DMZ rule 20 state established enable
$ set firewall name PRIVATE_TO_DMZ rule 20 state related enable
$ set firewall name PRIVATE_TO_DMZ rule 20 protocol all
# 정책 반영
$ set zone-policy zone private from dmz firewall name DMZ_TO_PRIVATE
$ commit
# 반영을 하는 순간 mint에서 dmz-web으로 ping이 간다. (porotocol all을 허용했기 때문)
# mint 서버에서 실행
$ ping 172.16.101.80
# dmz-web에서 mint 핑을 치면 통신이 안된다.
# dmz-web 서버에서 실행
$ ping 192.168.1.100
# 3. PUBLIC_TO_PRIVATE
$ set firewall name PUBLIC_TO_PRIVATE rule 30 action acccept
$ set firewall name PUBLIC_TO_PRIVATE rule 30 state established enable
$ set firewall name PUBLIC_TO_PRIVATE rule 30 state related enable
$ set firewall name PUBLIC_TO_PRIVATE rule 30 protocol all
$ set zone-policy zone private from public firewall name PUBLIC_TO_PRIVATE
# 4. PRIVATE_TO_PUBLIC
$ set firewall name PRIVATE_TO_PUBLIC rule 40 action acccept
$ set zone-policy zone public from private firewall name PRIVATE_TO_PUBLIC
$ commit
# commit을 하는 순간 mint(private존)에서 public으로 통신이 된다.
# 5. PUBLIC_TO_DMZ
$ set firewall name PUBLIC_TO_DMZ rule 50 action acccept
$ set firewall name PUBLIC_TO_DMZ rule 50 protocol tcp
# PUBLIC에서 출발해서 DMZ로 향하는 트래픽에 대해 80,22번 포트를 허용하는 정책
$ set firewall name PUBLIC_TO_DMZ rule 50 destination port 80,22
# DMZ에서 PUBLIC으로 들어온 ‘트래픽을 내보내기 위해 필요한’ 정책.
$ set firewall name PUBLIC_TO_DMZ rule 60 action accept
$ set firewall name PUBLIC_TO_DMZ rule 60 state established enable
$ set firewall name PUBLIC_TO_DMZ rule 60 state established enable
$ set firewall name PUBLIC_TO_DMZ rule 60 protocol all
# commit을 하기전에는 DNAT을 통한 dmz-web서버 접속이 안된다.
# 마찬가지로 dmz-web에서 외부로 핑도 안된다.
# 6. DMZ_TO_PUBLIC
$ set firewall name DMZ_TO_PUBLIC rule 70 action accept
$ set zone-policy zone public from dmz firewall name DMZ_TO_PUBLIC
$ commit
# commit을 하면 dmz-web(DMZ) 에서 public으로 통신이 되는것을 확인 가능하다.
# 마찬가지로 public에서 dmz로 웹접속이 된다.
'🎆 Cloud Practice > 🧪 On-Premise' 카테고리의 다른 글
VPN 서버를 만들어보자 (0) | 2023.10.10 |
---|---|
방화벽을 설정해서 웹과 DB에 접근 가능하도록 해보자 (0) | 2023.09.27 |
Wordpress를 설치하고 MariaDB(MySQL)과 연동해보자 (0) | 2023.09.26 |
Migration이란? (0) | 2023.09.21 |
가상화(전가상화, 반가상화)를 이해해보자 (0) | 2023.09.20 |