본문 바로가기
Linux

리눅스 :: VyOS 방화벽 설정 실습

by Emo_clew 2023. 10. 9.
반응형
문제)

VyOS를 통해 다양한 서버를 운영하고자 한다. 
주어진 내부 대역은 10.20.30.0 /23 대역이며 vmnet5,6을 사용한다. VAR과 DB라는 두 개의 내부 Zone과 PUB zone을 통해 다음과 같은 구성을 하고자 한다.
 
1. VAR zone에 varwp라는 호스트네임을 갖는 wordpress 서버를 구성하고, DB zone에는 dbdb라는 이름의 mariadb 데이터베이스 서버 구성을 하고자 한다. wordpress 서비스는 PUB 대역에 제공하며 사용자들은 www.rapa.com으로 접속해야 한다.  
==> www.rapa.com 접속확인
 
2. VAR zone의 bastion이라는 호스트네임을 갖는 서버에 bastion.rapa.com이라는 영문주소로 ssh 접속이 가능하며, 이 서버를 경유하여 DB zone의 dbdb 서버에 ssh로 접속하여야 한다. DB서버는 절대 PUB zone에서의 접속을 허용하지 않는다.
 
==> 방화벽 룰 및 bastion.rapa.com 경유하여 dbdb에 ssh 접속 확인
 
3. bastion 서버는 PUB 대역에 tftp 서비스도 제공한다. 사용자들은 tftp.rapa.com으로 이 서버에 접속할 수 있다.
 
이때 서버의 방화벽은 물론, ZONE기반 방화벽 정책 구성을 통해 반드시 필요한 트래픽만 허용해야 한다.

 

문제 1번을 그림으로 나타내면 위와 같다.

sol - 1)

VMware와 Xshell 환경에서 실습을 진행했다. VyOS는 install image를 입력하고 설치를 진행해 준다.

내부 대역 네트워크 주소 10.20.30.0 /23를 두 개의 네트워크로 서브넷팅 하면 10.20.30.0/24와 10.20.31.0/24로 나뉜다.

인터페이스 정보

eth0 은 211.183.3.252/24, eth1은 10.20.30.252/24, eth2는 10.20.31.252/24로 설정을 해주었고 외부로 나가는 게이트웨이 주소는 211.183.3.2이다.

입력 후에는 반영을 시켜주기 위해 commit을 입력한다. ssh 통신을 위해 set service를 통해 포트 번호를 22번으로 설정해 주었다. 

대역대 이름 설정

eth0,1,2번의 이름을 위와 같이 입력하고 commit. sh int 명령어를 통해 인터페이스 정보를 보면 다음과 같다.

sh int 결과화면

○VyOS설정 

내부대역에 wordpress 서버 및 mariadb 서버를 만들기 위한 패키기 설치가 필요한데 외부와 통신이 안 되는 상황이므로 포트 포워딩 개념을 이용한 PAT를 통해 외부와 통신이 되게 만들어 줄 것이다.

외부로 통신하기 위한 PAT 설정 화면
rule1 outbound 동작을 통해 외부와 통신

VAR zone은 rule2로 설정하여 위와 동일한 과정으로 외부와 통신이 가능하다.

wordpress서버 외부와 통신 가능
패키지 설치 화면

그다음 필요한 패키지들을 설치 해준 뒤 http 데몬을 활성화시켜준다.

80번 포트 열어주기

wordpress 웹서버를 통해 통신하기 위해서 http 포트인 80번 포트를 열어주고 반영시켜준다.

set nat destination rule 10 inbound-interface eth0
set nat destination rule 10 translation 10.20.30.100
set nat destination rule 10 translation address 10.20.30.100

set nat destinaton rule 10 destination port 80

set nat destination rule 10 protocol tcp
commit

으로 port 80번을 이용하여 웹서버에 대한 DNAT설정을 해주면 다음과 같이 접속이 잘되는 것을 확인할 수 있지만

이것은 host-connection을 통해 접속되는 것이고 문제에서 의도하는 것은 VyOS 인터페이스 eth0을 통해 접속되는 것을 원한다.

host-connection( .1) 을 통해 웹서버 접속. 문제에서 의도한 바가 아니다.

host-connection을 해제하면 정상적으로 접속되던 웹서버가 접속이 되지 않음을 확인할 수 있다.

host-connetction 해제

host-connection으로 생긴 가상의. 1 주소로 흘러들어 가서 웹서버에 접속되는 현상을 막기 위해 host-connetion 박스에 체크를 해제해 준다.

Vyos를 통한 연결. DNAT 설정

DNAT를 사용하기 때문에 여기에서는 inbound-interface는 eth0으로 동일하다. 

mariadb 서버가 있는 곳을 destination으로 지정해 준다면 rule 20을 통해 포트는 22번(ssh)으로 지정해 주었고 통신 방식은 프로토콜 tcp와 udp 중 신뢰성 있는 통신인 tcp를 채택했으며 destination으로 갈 때 주소를 10.20.31.80으로 변한다(translation address)는 의미이다.

이때 VyOS는 xshell과 통신하기 위해 ssh 포트를 222번으로 지정해 주자. ( mariadb 포트를 22번으로 했기 때문에 VyOS 기존 포트 22번에서 222번으로 변경. set service ssh port 222. 이러면 222번으로 xshell과 통신이 가능하다.)

웹서버도 마찬가지로 rule 2222번으로 설정하였고 inbound는 eth0을 통과하며 destination으로 변환될 주소는 10.20.30.100이며 통신 프로토콜은 tcp를 따른다. destination port는 2222로 DNAT를 해주었다. commit으로 반영 잊지 말자!

DNAT port

이렇게 VyOS의 기본적인 설정들은 끝났고 PUB, VAR, DB zone을 나눠본다.

○ 방화벽 설정

VAR_TO_DB

 

VAR에서 DB 존으로 가고 DB로부터만 응답을 받기 위해서는 mysql포트인 3306번 포트만 허용해 주면 된다.

rule 10을 통해 3306 포트와 함께 DB로 가게 되고 rule 15(state established, related)를 통해 DB와 관련된 통신을 하고 싶다.

DB_TO_VAR

DB에서 VAR로 가는 방향은 deny 해준다. DB에서 VAR 방향은 DB 관련 정보만 주면 되기 때문에 위와 같이 state established, related를 rule 20을 통해 지정해 주었다.

set zone-policy를 통해 zone에서 zone으로 이동하는 설정을 다 마치고 다면 반영시켜 주는 것을 잊지 말자!

PUB_T0_VAR

rule 30을 통해 PUB에서 VAR로 갈 때는 웹서버 동작을 시키기 위한 것이 목적이므로 destination port는 80번이다.

rule 35를 통해 PUB에서 송신한 정보중 port 80번을 통해 http와 관련된 정보만 수신하고 싶으므로 state established, related 설정을 해준 다음 zone-policy 설정을 반영시켜 준다.

VAR_TO_PUB

VAR에 있는 wordpress 서버는 외부 PUB으로 나가서 통신을 해야 하므로 rule 40을 통해 전부 열어주고 반영시켜 준다.

그다음 DNS 설정 및 VAR에 있는 wordpress 서버에서 관련 패키지 설치 및 설정과 DB존의 dbdb서버의 mariadb설정 및 패키지 설치를 진행해 준다. 자세한 내용은 추후에 포스팅을 할 예정이다. 

○ DNS 서버 설정

 1  systemctl stop firewalld
    2  systemctl disable firewalld
    3  vi /etc/selinux/config
    4  init 6
    5  firewall-cmd --permanent --add-service=dns   -> DNS 포트설정(53) ,서비스 활성화
    6  systemctl enable firewalld
    7  firewall-cmd --permanent --add-service=dns
    8  systecmctl status firewalld
    9  systemctl status firewalld
   10  systemctl start firewalld
   11  systemctl unmask firewalld
   12  systemctl restart firewalld
   13  systemctl enable firewalld    =>방화벽 활성화
   14  firewall-cmd --permanent --add-service=dns
   15  firewall-cmd --reload
   16  getenforce
   17  vi /var/named/rapa.com.db 
   18  systemctl restart network
   19  systemctl restart named
   20  clear
   21  systemctl status named
   22  init 6
   23  getenforce
   24  yum -y install bing bind-uils
   25  yum -y install bing bind-utils
   26  vi /etc/named.conf
   27  ls /var/named
   28  yum -y install bind bind-utils
   29  vi /etc/named.conf
   30  vi /etc/named.rfc1912.zones   ==> 존파일 설정
   31  vi /var/named/rapa.com.db
   32  name-checkzone rapa.com /var/named/rapa.com.db
   33  named-checkzone rapa.com /var/named/rapa.com.db
   34  systemctl enable --now named   ==> 변경사항 반영 named파일
   35  cat /etc/resolv.conf
   36  systemctl restart network
   37  cat /etc/resolv.conf
   38  systemctl enable --now named    ==> 변경사항 반영 named파일
   39  vi /var/named/rapa.com.db
   40  nslookup
   41  vi /etc/sysconfig/network-scripts/ifcfg-ens32
   42  systemctl restart network
   43  cat /etc/resolv.conf
   44  firewall-cmd --permanent --add-port=53/tcp   ==> dns 포트 활성화
   45  vi /etc/named.conf
   46  vi /etc/named.rfc1912.zones 
   47  vi /var/named
   48  vi /var/named/rapa.com.db
   49  systemctl enable --now named
   50  vi /var/named/rapa.com.db
   51  systemctl restart named
   52  vi /var/named/rapa.com.db
   53  systemctl restart named
   54  vi /var/named/rapa.com.db
   55  vi /var/named/rapa.com.db 
   56  systemctl restart named

DNS서버는 외부에 둔다! 211.183.3.53/24

웹서버 접속화면

 

sol-2,3)

bastion 서버로 향하는 DNAT설정을 해준다. PUB 대역에서 destination port를 233으로 지정해줬다.

tftp는 protocol 방식을 udp로 따른다! set nat destination rule 4000 protocol udp

translation port를 통해 포트 233을 통해 들어오게 되면 해석을 포트 69(tftp)로 하게 되고 이는 아이피 주소를 10.20.30.10으로 보겠다는 의미이다. 그러니 bastion 서버를 xshell로 ssh 접속을 하게 만들고 싶을 때는 아이피 주소는 211.183.3.252에 포트 번호는 233으로 하면 정상적으로 작동한다. ( 포트 233으로 설정해도 해석은 69번으로 하게 되어 목적지까지 도착하게 된다.)

정상적으로 접속됌
mint client에서의 접속 성공 화면

그다음으로 bastion 서버를 경유해서 db와 통신이 가능한지 확인하는 과정은 다음과 같다.

dbdb서버는 DNS를 통해 따로 도메인명을 지정해주지 않았으므로 'ssh root@ip주소' 명령어를 통해 접속이 가능한지 확인을 해야 하고 정상적으로 접속이 가능함을 확인할 수 있다!

그다음 3번 문제는 tftp 관련 사항을 확인하는 것인데 tftp에 대한 자세한 내용 또한 추후에 포스팅할 예정이다.

tftp 또한 정상적으로 작동됨을 확인할 수 있다.

#모든 과정에서 selinux = disabled 상태이다. sentenforce0 으로 셀리눅스는 꺼두자!

반응형

'Linux' 카테고리의 다른 글

리눅스 :: VPN(Virtual Private Network) 동작 원리와 실습  (0) 2023.10.10

댓글