네트워크 - 실습 2

jsbak·2023년 2월 28일
0

Cloud

목록 보기
3/59

VM 변화

  • CentOS7_XFCE ➡ VM 선택 우클릭 설정 ➡ 이름 WEB01_SAMBA로 변경 ➡ 네트워크 ➡ 네트워크 어댑터 2 사용 X ➡ 네트워크 어댑터 1, 내부네트워크 (이름 vSwitch)

  • CentOS7_Minimal ➡ WEB02_NFS, 역시 네트워크 수정
  • CentOS7_Minimal 1 ➡ DNS_DB, 역시 네트워크 변경

VM 추가 - NAT 게이트 웨이

  • cf. NAT GW 역할은 NIC(LAN Card) 가 두개 이상!

가상 시스템 가져오기

  • 파일 ➡ 가상 시스템 가져오기 ➡ 파일 선택(CentOS7_Minimal.ova) ➡ 다음 ➡ 이름 변경(CentOS7_Minimal ➡ NAT-GW_DHCP_HAProxy) ➡ 가져오기
  • 설정 ➡ 네트워크 ➡ 어댑터 1, 브릿지 및 랜카드 MAC 주소 새로 ➡ 어댑터 2, 내부 네트워크(vSwitch) 및 랜카드 MAC 주소 새로

  • 혹시 모르니 다른 VM 네트워크 랜카드 MAC 변경 하기
  • 게이트 웨이 주소는 1번이나 254번을 준다.
  • GW VM 시작 ➡ ip a192.168.0.126 같은(enp0s3) HOST와 같은 대역인지 아이피 확인
    • MobaXterm ssh-copy-id -i .ssh/id_rsa root@192.168.0.126 - 공개키 넘기기 ➡ /etc/ssh/sshd_config 파일에서 PasswordAuthentication 을 no로 설정해서 키 인증 방식으로 변경 ➡ systemctl restart sshd ➡ 키인증 방식으로 변경됨.
  • MobaXterm 에서 SSH 설정(공개키 설정 포함) ➡ Bookmark setting ➡ Session Name 변경 192.168.0.126 (NAT-GW) ➡ 접속 ➡ yum update -y
  • NAT 에서 WEB01~2의 부하분산의 역할도 수행할 예정

6. DB서버(Database Management System; MariaDB) - AWS RDS - 완전 관리형 서비스

  • MariaDB는 오픈 소스의 관계형 데이터베이스 관리 시스템(RDBMS)입니다. MySQL과 동일한 소스 코드를 기반으로 하며, GPL v2 라이선스를 따릅니다. 오라클 소유의 현재 불확실한 MySQL의 라이선스 상태에 반발하여 만들어졌습니다.
  • AWS와의 차이 : 완전 관리형 여부
    • 완전 관리형: 자동 백업, 💨 프로젝트로 넣어보기?
      • 직접 구현시 : crontab 쉘 스크립트 작성
    • 고가용성(High Availability)
    • 자동조정(디스크 크기, Auto Scaling)
      • 직접 구현 불가능

MariaDB 서버 구축

  • * repo = repository
  • 10.4 버전의 centos7용 mariadb
  • CentOS가 관리하는 저장소가 아닌 경우 직접 저장소를 설정해준다.

repository 설정

# MariaDB 를 설치하기 위한 저장소 설정
\# vi /etc/yum.repos.d/MariaDB.repo

# /etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

# repo 설정한 MariaDB 패키지 설치
\# yum install -y MariaDB 
# MariaDB 패키지 설치 확인
\# rpm -qa | grep MariaDB

\# mariadb --version # mariadb 버전 확인

\# systemctl enable --now mariadb

# 초기 root password 정의, 보안 관련 부분 세팅
\# mysql_secure_installation
---------------------------------------------------
Enter
Y
Y
password 8자 이상
Y 익명 사용자 제거하겠냐?
y root계정? 관련 원격 허용 하겠냐? 로컬은 허용하나 원격은 안된다.
y 테스트 데이터 베이스 제거할래?
y 권한 테이블 다시 불러올래? privilege

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] y
Enabled successfully!
Reloading privilege tables..
 ... Success!


You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.
# 익명 사용자 제거하겠냐?
Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.
# root계정? 관련 원격 허용 하겠냐? 로컬은 허용하나 원격은 안된다.
Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.
# 테스트 데이터 베이스 제거할래?
Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
# 권한 테이블 다시 불러올래? privilege
Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
---------------------------------------------------
  • 변경 내역 적용
    \# systemctl restart mariadb
  • 3306 포트 확인
    \# ss -ant # 3306 포트 확인하기
  • root 계정으로 패스워드 입력으로 mysql DBMS 접속
    \# mysql -u root -p
  • 유저생성
    • %: 모든 호스트를 의미(외부접속), localhost: 로컬에서만 접속 가능한지
    • kosa0220: 패스워드
      > CREATE USER 'kosa'@'%' IDENTIFIED BY 'kosa0220';
  • wordpress 데이터베이스가 없으면 생성
    > CREATE DATABASE IF NOT EXISTS wordpress;
  • 유저 권한 설정
    • GRANT ALL PRIVILEGES: 모든 권한을 줌.
    • ON 데이터베이스.테이블, *(모든테이블)
    • TO kosa 유저, %(모든 호스트)에서 접속
  \> GRANT ALL PRIVILEGES ON wordpress.* TO 'kosa'@'%';
  quit
  • 방화벽에 서비스 허용 등록하기
#firewall-cmd --permanent --add-port=3306/tcp
\# firewall-cmd --permanent --add-service=mysql
\# firewall-cmd --reload

클라이언트

\# yum install mysql -y

\# mysql -h 192.168.56.120 -u kosa -p
  • Ubuntu
$ sudo apt update
$ sudo apt install -y mysql-client
$ mysql -V
$ mysql -h ns.bakjisu.shop -u kosa -p

간단한 mariadb 설치 방법

\# yum install -y mariadb-server
\# systemctl enable --now mariadb

# root Password 정의
\# mysql_secure_installation

리눅스 네트워크

NAT GW 네트워크 구성도

Router (IP 공유기; AWS VPC NAT GateWay)

  • 네트워크 주소 변환(NAT; Network Address Translation)은 컴퓨터 네트워킹에서 쓰이는 용어로서, IP 패킷의 TCP/UDP 포트 숫자와 소스 및 목적지의 IP 주소 등을 재기록하면서 라우터를 통해 네트워크 트래픽을 주고 받는 기술을 말합니다.
  • NAT를 이용하는 이유는 대개 사설 네트워크에 속한 여러 개의 호스트가 하나의 공인 IP 주소를 사용하여 인터넷에 접속하기 위함입니다. 많은 네트워크 관리자들이 NAT를 편리한 기법이라고 보고 널리 사용하고 있습니다.
    • 공인IP = Public IP
    • 사설IP = Private IP (RFC1918-사설IP 규정)
      • 10.0.0.0 ~ 10.255.255.255
      • 172.16.0.0 ~ 172.31.255.255
      • 192.168.0.0 ~ 192.168.255.255

강의실 네트워크

  • Public Subnet (공유기에 셋팅 된 대역)
    192.168.0.0/24 - 네트워크 영역: 24비트, 호스트 영역: 8비트
    192.168.0.0 ~ 192.168.0.255 (256개 IP - 2개 = 254개)
    192.168.0.0 네트워크 주소(시작 IP)
    192.168.0.255 브로드캐스팅 주소(마지막 IP)
  • Private Subnet
    172.31.0.0/24
    172.31.0.0 ~ 172.31.0.255 (256개 IP - 2개 = 254개)- 1개(게이트웨이 주소) = 253
    • 기본으로 사용되는 2개, 이 두개를 제외하고 Host ID 로 사용 및 게이트웨이 주소
      • 172.31.0.0 네트워크 주소(시작 IP)
      • 172.31.0.255 브로드캐스팅 주소(마지막 IP)
      • 게이트웨이 주소 1개

NAT 설정

  • cf. vi 전체 라인 지우기 : ggdG
  • cf. 명령어 자동 완성 : yum install -y bash-completion ➡ 로그아웃(exit) ➡ 재 로그인
# hostname 변경
\# hostnamectl set-hostname nat

\# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

#  네트워크 매니저는 네트워크의 기능이다. 
# CentOS 7 까지는 둘다 있는데 CentOS 8,9는 네트워크 매니저만 존재한다.
# ggdG: 전체 라인 지우기
## /etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE=Ethernet
BOOTPROTO=none # dhcp 유동, none 수동/고정
NAME=enp0s3
DEVICE=enp0s3
ONBOOT=yes
IPADDR=192.168.0.126 # 본인의 IP로 변경
NETMASK=255.255.255.0 # IP에 .../24 줄 수 있으나 마스크 설정
GATEWAY=192.168.0.1
DNS1=8.8.8.8
DNS2=8.8.4.4

\# vi /etc/sysconfig/network-scripts/ifcfg-enp0s8

# 자기 자신이 게이트웨이라 게이트웨이 설정이 없다. 
## /etc/sysconfig/network-scripts/ifcfg-enp0s8
TYPE=Ethernet
BOOTPROTO=none
NAME=enp0s8
DEVICE=enp0s8
ONBOOT=yes
IPADDR=172.31.0.1
NETMASK=255.255.255.0

# network 기능을 가지고 세팅 했기 때문에 network 서비스를 재시작(네트워크 매니저 X)
\# systemctl restart network

# enp0s8의 ip가 172.31.0.1 로 설정된 것을 볼 수 있다.
\# ip a 

# 방화벽 데몬의 상태 확인 (구. iptables)
# 방화벽이지만 CentOS에서 NAT와 Port Forward의 기능을 수행
\# systemctl status firewalld 
\# firewall-cmd --get-active-zone
#----------------------------------
public
  interfaces: enp0s3 enp0s8
#----------------------------------

--- 방화벽 설정으로 LAN 내부와 외부 나누기 ---
# connection.zone 존을 각각 외부/내부로 나누겠다.
\# nmcli c mod enp0s3 connection.zone external
\# nmcli c mod enp0s8 connection.zone internal

# 변경 확인
\# firewall-cmd --get-active-zone 
#-------------------------------------------
internal
  interfaces: enp0s8
external
  interfaces: enp0s3
#-------------------------------------------

\# setenforce 0 # 임시종료 SELinux 

# SELinux 비활성화 enforcing ➡ disbled
\# vi /etc/sysconfig/selinux 

❌ (구) 리눅스 시스템 라우터로 설정

# ip_forward: ip 전달 ➡ 라우팅!
\# sysctl -w net.ipv4.ip_forward=1 # 리눅스 시스템을 라우터로 만드는 셋팅
--- 출력 net.ipv4.ip_forward=1

\# sysctl -p # 설정 저장
\# cat /proc/sys/net/ipv4/ip_forward
#----------------------------------
1
#----------------------------------

리눅스 시스템 라우터로 설정

  • ip_forward
    • sysctl 명령으로 수행시 재부팅하면 변경이 취소되는 경우가 있음.
  • ip_forward : 라우팅
\# vi /etc/sysctl.conf
-----------------------------------------
net.ipv4.ip_forward=1
-----------------------------------------

# 재부팅 풀리는지 아닌지 확인
reboot

설정이 잘 되어있나 확인하기

# cat /proc/sys/net/ipv4/ip_forward

❌ 없는 부분, 다른부분에 나옴

  • 포트포워딩 DHCP 부분에서 같이
    • permanent: 영구적으로
    • 외부 아이피로(zone=external) --add-forward-port=port=139 들어오면 proto=tcp:toport=139:toaddr=172.31.0.101 으로 보내라
\# firewall-cmd --permanent --zone=external --add-forward-port=port=139:proto=tcp:toport=139:toaddr=172.31.0.101
\# firewall-cmd --permanent --zone=external --add-forward-port=port=445:proto=tcp:toport=445:toaddr=172.31.0.101
\# firewall-cmd --reload

2. DHCP 설정(NAT-GW 에 설정)

  • 동적 호스트 구성 프로토콜(Dynamic Host Configuration Protocol, DHCP)은 호스트 IP 구성 관리를 단순화하는 IP 표준입니다.
  • 동적 호스트 구성 프로토콜 표준에서는 DHCP 서버를 사용하여 IP 주소 및 관련된 기타 구성 세부 정보를 네트워크의 DHCP 사용 클라이언트에게 동적으로 할당하는 방법을 제공합니다.
\# yum install dhcp -y
\# vi /etc/dhcp/dhcpd.conf
-------------------------------------------------
# /etc/dhcp/dhcpd.conf 수정
# 네임서버의 동적 업데이트, 요즘에는 많이 쓰지 않음.
# 동적으로 DNS 서버를 이용할 때 설정
ddns-update-style interim;
subnet 172.31.0.0 netmask 255.255.255.0 { # 서버의 마스크
# = 172.31.0.0/24 # 172, 31, 0 세자리 고정이라는 의미
option routers 172.31.0.1; # 내부 VM 들이 통해야할 라우터, 즉 NAT-GW 를 설정
option subnet-mask 255.255.255.0; # 클라이언트들이 알게될 마스크

# 1~254 번, 즉 253개중에서 100번~110번 까지만 사용하겠다.
range dynamic-bootp 172.31.0.100 172.31.0.110; # 범위 설정

# 클라이언트들에게 알려줄 도메인 서버, 일단 아래꺼만 나중에 DNS 설정후 아래꺼처럼 DNS 설정
option domain-name-servers 8.8.8.8, 8.8.4.4;
# option domain-name-servers 172.31.0.102, 8.8.8.8, 8.8.4.4;

# lease 임대
# 할당된 ip를 2시간 동안 안쓴다면 회수
# 최대 12시간 동안 임대
default-lease-time 7200; 
max-lease-time 86400;
}
-------------------------------------------------

dhcp 데몬 활성화

\# systemctl enable --now dhcpd
  • 순서대로 VM 부팅 ➡ ip a로 확인 ➡ ping
  • 순서대로 안키면 ip 순서는 다를 수 있음
  • 각각 확인해서 ip 체크해두기
    WEB01_SAMBA 172.31.0.100
    WEB02_NFS 172.31.0.101
    DNS_DATABASE 172.31.0.102

포워딩: (139, 445 SAMBA, SSH 등)

# SAMBA의 139(NetBIOS), 445(SMB) 포트
\# firewall-cmd --permanent --zone=external --add-forward-port=port=139:proto=tcp:toport=139:toaddr=172.31.0.100
\# firewall-cmd --permanent --zone=external --add-forward-port=port=445:proto=tcp:toport=445:toaddr=172.31.0.100
# WEB01의 SSH 포트
\# firewall-cmd --permanent --zone=external --add-forward-port=port=2201:proto=tcp:toport=22:toaddr=172.31.0.100
# WEB02의 SSH 포트
\# firewall-cmd --permanent --zone=external --add-forward-port=port=2202:proto=tcp:toport=22:toaddr=172.31.0.101
# DB의 SSH 포트
\# firewall-cmd --permanent --zone=external --add-forward-port=port=2203:proto=tcp:toport=22:toaddr=172.31.0.102
\# firewall-cmd --reload

# WEB01, WEB02 HTTP 포트 
\# firewall-cmd --permanent --zone=external --add-forward-port=port=8001:proto=tcp:toport=80:toaddr=172.31.0.100
\# firewall-cmd --permanent --zone=external --add-forward-port=port=8002:proto=tcp:toport=80:toaddr=172.31.0.101
\# firewall-cmd --reload
  • 윈도우에서 확인

지난 시간 포트 충돌

  • nat-gw는 445, 139 포트 사용하지 않음. (즉, 포트 사용 가능, 포트포워딩 ⭕)

  • host win10를 이용했을 때는 win10이 445, 139를 이미 이용하기 때문에 포트 충돌
    - netstat -a: net-네트워크, stat-상태, a-ALL

  • WEB01 SSH 설정

    • ssh 설정(아래 그림) ➡ hostname 변경 hostnamectl set-hostname web01; exit (로그아웃) ➡ 로그인
    • 나머지 WEB02, DNS SSH 설정
      • 이름만 WEB02, DNS 로 설정, 호스트네임도 변경(web02, dns)
  • 포워드 정보 확인

    • firewall-cmd --list-all --zone=external
    • --zone=external : 외부 옵션
  • 포워드 정보 지우는 방법

    • add 대신 remove
\# firewall-cmd --permanent --zone=external --remove-forward-port=port=139:proto=tcp:toport=139:toaddr=172.31.0.100
\# firewall-cmd --permanent --zone=external --remove-forward-port=port=445:proto=tcp:toport=445:toaddr=172.31.0.100
# WEB01의 SSH 포트
\# firewall-cmd --permanent --zone=external --remove-forward-port=port=2201:proto=tcp:toport=22:toaddr=172.31.0.100
# WEB02의 SSH 포트
\# firewall-cmd --permanent --zone=external --remove-forward-port=port=2202:proto=tcp:toport=22:toaddr=172.31.0.101
# DB의 SSH 포트
\# firewall-cmd --permanent --zone=external --remove-forward-port=port=2203:proto=tcp:toport=22:toaddr=172.31.0.102
# WEB01, WEB02 HTTP 포트 
\# firewall-cmd --permanent --zone=external --remove-forward-port=port=8001:proto=tcp:toport=80:toaddr=172.31.0.100
\# firewall-cmd --permanent --zone=external --remove-forward-port=port=8002:proto=tcp:toport=80:toaddr=172.31.0.101
\# firewall-cmd --reload

\# cp authorized_keys authorized_keys.pub
\# ssh-copy-id -i authorized_keys.pub root@172.31.0.101
\# chmod 400 my-key.pem
\# ssh -i my-key.pem root@172.31.0.101

192.168.0.85:221 -> 172.31.0.101:22(WEB01)
192.168.0.85:222 -> 172.31.0.100:22(WEB02)
192.168.0.85:223 -> 172.31.0.102:22(DNS)

ssh -i my-key.pem root@192.168.0.85
ssh -p 221 -i my-key.pem root@192.168.0.85
ssh -p 222 -i my-key.pem root@192.168.0.85
ssh -p 223 -i my-key.pem root@192.168.0.85

@@ 포트포워딩
# firewall-cmd --permanent --zone=external --add-forward-port=port=221:proto=tcp:toport=22:toaddr=172.31.0.101
# firewall-cmd --permanent --zone=external --add-forward-port=port=222:proto=tcp:toport=22:toaddr=172.31.0.100
# firewall-cmd --permanent --zone=external --add-forward-port=port=223:proto=tcp:toport=22:toaddr=172.31.0.102
# firewall-cmd --reload
# firewall-cmd --list-all --zone=external

3. DNS - AWS Route53

  • 도메인 네임 시스템(Domain Name System, DNS)은 호스트의 도메인 이름을 호스트의 네트워크 주소로 바꾸거나 그 반대의 변환을 수행할 수 있도록 하기 위해 개발되었습니다.
    • 도메인주소 ↔ IP 주소
  • 특정 컴퓨터(또는 네트워크로 연결된 임의의 장치)의 주소를 찾기 위해, 사람이 이해하기 쉬운 도메인 이름을 숫자로 된 식별 번호(IP 주소)로 변환해 줍니다.
  • 도메인 네임 시스템은 흔히 "전화번호부"에 비유됩니다. 인터넷 도메인 주소 체계로서 TCP/IP의 응용에서, www.example.com과 같은 주 컴퓨터의 도메인 이름을 192.168.1.0과 같은 IP 주소로 변환하고 라우팅 정보를 제공하는 분산형 데이터베이스 시스템입니다.
  • ISP(Internet Service Provider: KT, SKB, LGU+, Dreamline ...)
    DNS

DNS 서버 구축

# bind - "버클리 인터넷 네임 도메인"을 의미
\# yum -y install bind bind-chroot bind-utils

# 보통 NS라 부르기 때문에 hostname을 DNS ➡ NS로 변경
hostnamectl set-hostname ns; exit

cp /etc/named.conf /etc/named.conf.bak

ggdG
\# vi /etc/named.conf
----------------------------------------------------------
options {
  # ❗ 53번 포트 : DNS 포트, 포트번호를 바꿀수는 있으나 거의 바꾸지 않음.
  # { ... } 접근에 관한 IP 대역 설정, 끝에 .0 을 생략할 수도 있다.
  # 본인 : 127.0.0.1
  # 192.168.0.0/24 강의실
  # 172.31.0/24 WIN 10 VM 안의 내부망(NAT-GW)
  # 접근제어 : listen-on port 53
        listen-on port 53 { 127.0.0.1; 192.168.0/24; 172.31.0/24; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
  
  # ip를 묻는 작업을 허용할 것이냐?
  # ❗ 서비스를 제공할 IP 대역인지 확인? 위에 설정은 접근에 관한 대역 설정
        allow-query     { localhost; 192.168.0/24; 172.31.0/24; };
   
  # 내부 도메인에 대한 정보를 가지고 있을 것?
  # ❗ forwarders: 외부로 나가는 것은 어떤 외부의 DNS로 물어볼지 설정 
  # 내가만든 DNS를 내부 DNS 서비스를 할 때 외부 인터넷으로 나가야하는 도메인은 어디에다가 물어봐야하냐? 
  # 그래서 구글 DNS 을 적음... (KT, SKT, LGU+, ... 될 수 있다.)
        forwarders { 8.8.8.8; 8.8.4.4; };

        recursion yes;

        dnssec-enable yes;
        dnssec-validation yes;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

# 내부 DNS 서비스를 하려고 할때 호스팅 하려는 도메인 정보 설정
view "internal" {
        zone "." IN {
                type hint;
                file "named.ca";
        };

        include "/etc/named.rfc1912.zones";
        
        # `bakjisu.shop.zones`이 이 경로에 있다라고 정의
        # Route 53에서는 호스팅 영역이라고 한다.
        include "/var/named/bakjisu.shop.zones"; # 호스팅 영역 생성
};
----------------------------------------------------------

zones 파일 설정

\# vi /var/named/bakjisu.shop.zones
----------------------------------------------------------
## 도메인 ➡ IP - 정방향에 대한 정보
zone "bakjisu.shop" IN {

  # type master - 도메인의 서버가 여럿일때 대표(master)가 누구인지 설정
  # master / slave : master가 죽으면 slave 중 하나가 그 역할을 대신
  # 그럼 클러스터를 구성하는가?
        type master; 
        
  # 도메인 레코드 관련 구성 정보 파일
        file "bakjisu.shop.db";
  
  # allow-update: IP 계속 바뀐다면? 주기적으로 확인하여 변경 
  # DDNS의 기능을 할 때
        allow-update { none; };
};


## 도메인 ⬅ IP역방향 정보
zone "0.31.172.in-addr.arpa" IN {
        type master;
        file "0.31.172.in-addr.arpa.db";
        allow-update { none; };
};
----------------------------------------------------------

NS 서비스 설정

  • /var/named/bakjisu.shop.db 수정
\# vi /var/named/bakjisu.shop.db
----------------------------------------------------------
  # TTL: Time-To-Live
  # 캐쉬정보를 86400 초 동안 가지고 있다가 re-fresh (24시간)
  # TTL이 작아서 빈번하다면 정확도 ⬆ 비용 ⬆
$TTL    86400
@       IN      SOA     bakjisu.shop.   root.bakjisu.shop.(
                        2022041401 ; Serial
                        3h         ; Refresh
                        1h         ; Retry
                        1w         ; Expire
                        1h )       ; Minimum

        IN      NS      ns.bakjisu.shop.
        IN      MX 10   ns.bakjisu.shop.
        
# ❗ A: 도메인을 IP로 바꿔주는 부분
# ns/web01/web02 - 서브 도메인
ns      IN      A       172.31.0.102
web01   IN      A       172.31.0.100
web02   IN      A       172.31.0.101
----------------------------------------------------------
* IP LISTIP
WEB01_SAMBA172.31.0.100
WEB02_NFS172.31.0.101
DNS_DATABASE172.31.0.102

역 네이밍 서비스 설정

  • /var/named/0.31.172.in-addr.arpa.db 수정
# IP가 역순이다
\# vi /var/named/0.31.172.in-addr.arpa.db
----------------------------------------------------------
$TTL	86400
@	IN	SOA	bakjisu.shop.	root.bakjisu.shop.(
			2022041401 ; Serial
			3h         ; Refresh
			1h         ; Retry
			1w         ; Expire
                        1h )       ; Minimum

# 102: DNS 172.31.0.102 의 맨 마지막
# PTR: IP 주소 ➡ 호스트 이름(도메인)
#      리버스 도메인시 사용하는 레코드
	IN	NS	ns.bakjisu.shop.
102	IN	PTR	ns.bakjisu.shop.
----------------------------------------------------------

NS 서비스 실행

부팅 서비스 등록 및 방화벽 규칙 허용

  • 부팅 서비스 등록
\# systemctl start named && systemctl enable named
\# systemctl enable --now named
  • NAT-GW 가서 vi /etc/dhcp/dhcpd.conf172.31.0.102 추가

  • 이후 dhcp 데몬 재시작
    systemctl restart dhcpd

  • 방화벽 규칙 허용 (NS HOST)

\# firewall-cmd --permanent --add-service=dns
\# firewall-cmd --reload

NetworkManager 재실행

  • 각각의 VM HOST에 실행, MobaXterm의 MultiExec을 이용해도 된다. (정 중앙)
    \# systemctl restart NetworkManager
  • NAT-GW 는 수동으로 설정해야한다. 안먹힘
    • 아래 그림 처럼 변경
      \# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
  • Ubuntu$ sudo systemctl restart networking
  • Windows Server는 PowerShell 또는 CMD 에서 ipconfig /renew
vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
  • nameserver 서버 정보 확인하기
\# cat /etc/resolv.conf
\# ping web01.bakjisu.shop

DNS 대표적인 레코드

레코드설명예시
❗ SOA1. 마스터/슬레이브
2. 다루는 도메인 버전과 업데이트 시간 간격 등의 정보를 저장하는 레코드
❗❗ A1. 도메인 ➡ IP (변환)예: 호스트 ns.bakjisu.shop의 IPv4 주소는 172.31.0.130
2. 호스트 이름으로 IPv4 주소를 조회할 때 사용하는 레코드
AAAA1. 호스트 이름으로 IPv6 주소를 조회할 때 사용하는 레코드jprs.jp의 IPv6 주소는 2001:218:3001:7::80
PTR1. IP 주소로 호스트 이름을 조회할 때 사용하는 레코드예: 172.31.0.130의 호스트 이름은 ns.bakjisu.shop
2. 리버스 도메인시 사용하는 레코드
❗ NS1. 끝에 꼭 "." 을 붙여야한다.ex) ns.
2. DNS 서버의 호스트 이름 혹은 IP 주소를 저장하는 레코드예: bakjisu.shop의 DNS 서버는 ns.bakjisu.shop
❗ MX1. 메일 익스체인지.예: bakjisu.shop의 메일 서버는 mail.bakjisu.shop
2. 메일 서버 호스트 이름 혹은 IP 주소를 저장하는 레코드
❗❗ CNAME1. 도메인 ↔ 도메인예: www.bakjisu.shop은 ns.bakjisu.shop의 별칭(alias)
2. 호스트 이름의 별칭을 저장하는 레코드

DNS 질의응답 확인하기

  • dig 명령은 DNS 네임서버 구성과 도메인 설정이 완료된후 일반 사용자의 입장에서 설정한 도메인네임에 대한 DNS 질의응답이 정상적으로 이루어지는지 확인 점검시 사용한다
# 도메인 서버의 내용 확인
cat /etc/resolv.conf

# web01에 설치
yum install -y bind-utils
dig A web01.bakjisu.shop # 도메인에 대한 정보가 나온다.
/*
	; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.13 <<>> A web01.bakjisu.shop
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16956
    ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;web01.bakjisu.shop.            IN      A

    ;; ANSWER SECTION:
    web01.bakjisu.shop.     86400   IN      A       172.31.0.100

    ;; AUTHORITY SECTION:
    bakjisu.shop.           86400   IN      NS      ns.bakjisu.shop.

    ;; ADDITIONAL SECTION:
    ns.bakjisu.shop.        86400   IN      A       172.31.0.102

    ;; Query time: 0 msec
    ;; SERVER: 172.31.0.102#53(172.31.0.102)
    ;; WHEN: Fri Mar 03 11:27:01 JST 2023
    ;; MSG SIZE  rcvd: 96
*/

# IP 에 따른 도메인 확인
dig -x 172.31.0.102 # 100 하면 역도메인 확인 불가
/*
	; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.13 <<>> -x 172.31.0.102
  ;; global options: +cmd
  ;; Got answer:
  ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 632
  ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

  ;; OPT PSEUDOSECTION:
  ; EDNS: version: 0, flags:; udp: 4096
  ;; QUESTION SECTION:
  ;102.0.31.172.in-addr.arpa.     IN      PTR

  ;; ANSWER SECTION:
  102.0.31.172.in-addr.arpa. 86400 IN     PTR     ns.bakjisu.shop.

  ;; AUTHORITY SECTION:
  0.31.172.in-addr.arpa.  86400   IN      NS      ns.bakjisu.shop.

  ;; ADDITIONAL SECTION:
  ns.bakjisu.shop.        86400   IN      A       172.31.0.102

  ;; Query time: 0 msec
  ;; SERVER: 172.31.0.102#53(172.31.0.102)
  ;; WHEN: Fri Mar 03 11:28:37 JST 2023
  ;; MSG SIZE  rcvd: 113
*/

4. HAProxy - AWS ELB - 로드밸런서 - 부하분산

  • L4 S/W(Switch, AWS NLB), L7 S/W (AWS ALB)
    • 💦 L4/7 의 차이점을 알아보자 ❗ 💦
    • HAProxy(에이치에이-프록시) 와 AWS ELB의 차이?
  • HAProxy는 여러 서버에 요청을 분산시키는 TCP(L4) 및 HTTP(L7) 기반 애플리케이션을 위한 고가용성(HA: High Availability) 로드 밸런서 및 역방향 프록시를 제공하는 무료 오픈 소스 소프트웨어 입니다.
  • C로 작성되었으며 빠르고 효율적(프로세서 및 메모리 사용 측면에서)으로 유명합니다.

HAProxy 구축

  • NAT-GW 에 설치
\# yum install -y haproxy
\# vi /etc/haproxy/haproxy.cfg
----------------------------------------------------------
  # global: 전사적으로
  # daemon: 백그라운드 실행
global	
    daemon	

  # 프로토콜 TCP/HTTP
  # "http 기반으로 부하 분산을 수행하겠다" 설정
defaults
    mode               http

  # 엔드 유저 접속
  # frontend  http-in : 프론트-엔드 이름을 'http-in' 으로 하겠다.
  # bind *:80 : '묶다'는 의미(접근), 어떤 아이피(호스트)든 80 포트로 들어오는 트래픽을 받겠다.
frontend  http-in
    bind *:80
    acl firefox hdr_sub(User-Agent) Firefox
    acl chrome hdr_sub(User-Agent) Chrome
    default_backend    backend_servers
    use_backend bk_firefox if firefox
    use_backend bk_chrome if chrome

# 서버를 그룹으로 묶어서 우리는 2개 web03(X)
backend backend_servers
    balance            roundrobin
#    cookie  SVID insert indirect nocache maxlife 10s
    server             web01 172.31.0.100:80 cookie w1 check
    server             web02 172.31.0.101:80 cookie w2 check
#    server             web03 172.31.0.103:80 cookie w3 check

backend bk_firefox
    server             web01 172.31.0.100:80
backend bk_chrome
    server             web02 172.31.0.101:80
----------------------------------------------------------
  • 포트 열린 것 확인
    \# firewall-cmd --list-all --zone=external

  • haproxy 활성화
    \# systemctl enable --now haproxy

  • NAT-GW 방화벽 수정하기

# 192.168.0.126, NAT-GW의 80번포트 접속시, 안됨...

\# ss -ant # *:80 포트 번호 확인됨

# NAT-GW 방화벽 허용이 안되어 있어 규칙 설정
# 💥 NAT-GW는 내부/외부 구분되어있어서 외부라고 꼭 넣어주기 💥
\# firewall-cmd --permanent --add-port=80/tcp --zone=external
\# firewall-cmd --reload

# 192.168.0.126 접속!
  • 다른거 SAMBA / NFS 등 포트 및 원래 각각 설정하는 부분 찾아서 변경된 주소로 수정
    • NFS
      • vi /etc/exports : /share 172.31.0.0/24(rw,sync)
      • NFS 사용할 곳에서 : vi /etc/fstab
    • SAMBA
      • 💦 포워딩 확인하기
\# firewall-cmd --permanent --zone=external --remove-forward-port=port=139:proto=tcp:toport=139:toaddr=172.31.0.100
\# firewall-cmd --permanent --zone=external --remove-forward-port=port=445:proto=tcp:toport=445:toaddr=172.31.0.100
\# firewall-cmd --reload

단순 L4 기능

  • 연결 방식
    • round robin, 순차적 연결 방식, 현업 ❌
      • web01/web02 한번씩 연결?
    • least connection, 최소 연결 방식
    • w1, w2 쿠키 이름: 시간 관련 정보를 담고 있음 (TTL 정보)
frontend  http-in
    bind *:80

...
backend backend_servers
	# 부하처리 방식: roundrobin 알고리즘 이용(순차)
    balance            roundrobin
#    cookie  SVID insert indirect nocache maxlife 10s
    server             web01 172.31.0.100:80 cookie w1 check
    server             web02 172.31.0.101:80 cookie w2 check

L7 기능

  • L7에서는 User-Agent를 분석해서 어디서 오는지 확인 가능하다.
  • acl : 접근 제어 목록, Access Control List
  • Trident: IE(인터넷 익스플로러)
...
	# 트래픽을 분석해서 firefox 이름 정의
    # hdr_sub(User-Agent) Firefox 이 조건이 맞으면
    # firefox에 집어넣기
	acl firefox hdr_sub(User-Agent) Firefox
    acl chrome hdr_sub(User-Agent) Chrome
    
    # 사파리나 IE 이면 default_backend로 가라
    default_backend    backend_servers
    
    # 조건이 맞으면 bk_firefox 로 가라
    use_backend  bk_firefox if firefox
    use_backend bk_chrome if chrome
...
backend bk_firefox
    server             web01 172.31.0.100:80
backend bk_chrome
    server             web02 172.31.0.101:80
profile
끄적끄적 쓰는곳

0개의 댓글