본문 바로가기
Development(Web, Server, Cloud)/Cloud : 정리

1. 클라우드와 가상화를 위한 리눅스 7.0 : VMWare 네트워크, CentOS7, vi, disk, 사용자와 그룹, 추가적인 작업, DNS서버, 웹서버, NFS서버, 클라우드 가상화, KVM, Docker, SELinux

by tonyhan18 2022. 1. 18.
728x90

0. 작성은 무조건 실습중심(Starter Pack)

# Starter Pack
yum -y install epel-release
yum install -y vim net-tools curl wget git tree nfs-utils httpd && yum update -y && poweroff
yum install -y squid  # proxy 서버용
yum install -y nfs-utils  # nfs용(기본)
yum install -y haproxy  # load-balaner용
yum install -y httpd  # 클론용(기본)

yum -y install libguestfs libguestfs-utils
yum -y install libvirt qemu-kvm virt-install virt-manager virt-viewer

 

yum install shellcheck
sed -i "s/\r//g" *.sh  #from window
shellcheck *.sh
#!/bin/bash

# Starter Pack
yum install -y vim net-tools curl wget git tree nfs-utils httpd
yum install -y squid  # proxy server
yum install -y nfs-utils  # nfs (basic)
yum install -y haproxy  # load-balaner 
yum install -y httpd  # wev-server (basic)
yum groupinstall "x window system" "gnome desktop environment"  # startx

# alias
echo "alias vi='vim'" >> /.bashrc

# hostname
host_src=localhost
host_dst=lbdns

sed -i "s/${host_src}/${host_dst}/g" /etc/hostname

# ip address
ENS32_src=192.168.8.100
ENS33_src=192.168.1.100
ENS34_src=192.168.2.100

ENS32_dst=192.168.8.100
ENS33_dst=192.168.1.100
ENS34_dst=192.168.2.100

sed -i "s/${ENS32_src}/${ENS32_dst}/g" /etc/sysconfig/network-scripts/ifcfg-ens32
sed -i "s/${ENS33_src}/${ENS33_dst}/g" /etc/sysconfig/network-scripts/ifcfg-ens33
sed -i "s/${ENS34_src}/${ENS34_dst}/g" /etc/sysconfig/network-scripts/ifcfg-ens34

# firewalld
systemctl stop firewalld
systemctl disable firewalld

# SELinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

# last dance
yum update -y && reboot

 

 

1. 리눅스의 역사와 시작

리눅스 역사

- 리눅스 부팅과정

- 1st, 컴퓨터를 켜는 것과 동시에 POST(Power on Self Test) 과정에 의해 우리가 사용하는(리눅스) 시스템이 초기화

- 2nd, 초기화가 되는 동시에 부트 레코드나 하드인 경우엔 MBR(Master Boot Record)을 읽어들인다.

- 3rd, MBR(Master Boot Record)을 읽어들인 뒤 LILO(LInux LOader)가 실행되는데, 이때 만약 디폴트인 리눅스가 로딩되기 전에 Ctrl, Shift, Alt중 하나를 눌으고 있으면, LILO는 부팅할 운영체제를 물어본다.

- 4th, Kernel이 메모리로 로딩되며, 만약 커널이 압축되었다면 압축을 해제하는 과정까지이다.

- 5th, 커널은 하드, 네트워크 어댑터, 플로피 등을 검사하며, 장치 드라이버(Device Driver)를 설정한다. 즉, 하드웨어 부분을 검사하고 장치 드라이버까지 설정한다.

- 6th, 이렇게 하드웨어 설정뒤 리눅스는 프로세서를 보호 모드로 전환시키는데 화면상으로의 변화는 나타나지 않는다.

- 7th, 루트 파일 시스템을 Mount시키는 것인데 루트 파일 시스템은 "rdev"나 LILO에 의해 설정되어 있으며. 파일 시스템의 형태는

자동적으로 검출된다.

- 8th, 커널은 /etc/init를 백그라운로 실행한다. "init"는 "inittab" 파일의 내용에 따라 실행된다.

- 9th, "init"는 /etc 디렉토리 아래의 rc.sysinit를 실행한다.

- 10th, "init"는 /etc/ 디렉토리 아래의 rc.local이나 rc를 실행시킨다.

- 11th, "init" 프로그램은 가상 콘솔을 위해 /etc/gettytabs에 의해 설정된 직렬 라인으로 getty를 실행한다.

- 12th, 계정을 입력한다(ID 와 Password)

- 13th, shell이 작동하고 Bash이면 .bashrc를, tsh면 .profile을 불러들인다.

- 14th, 프롬프트(실행된 shell에 따라 다르지만 $나 #)가 표시된다.

 

 

리눅스 설치 및 네트워크 설정

- NIC(Network Interface Card) 가상화 방법(0112)

NIC(Network Interface Card) 가상화 방법

1. 브릿지 : 진짜 PC의 NIC을 공유해서 사용하는 방식 = 같은 NIC 쓰는 방식

2. NAT : VM들이 가상 NAT에 연결되어 진짜 PC를 타고 인터넷으로 나감

3. Host-Only : VM끼리만 연결된 방식

 

 

- 설치(중요한것만)

 

Virtualize Intel VT-x/EPT or AMD-v/RVI : 가상머신에서 가상화 기술 이용

 

네트워크 옵션에도 Bridged(vSW에 연결) / NAT(자동 NAT 탐색) / Host-only(고립) / Custom(네트워크 선택) 등이 있다.

 

이 부분에서 Base Environment를 뭐로 고를지가 중요

 

 

디스크 선택지는 두가지가 있다.

1. Local Standard Disks : 그냥 컴퓨터에 꽂힌 디스크 쓰는거(클라우드에서는 잘 안씀)

2. Specialized & Network Disks : Storage의 공간(볼륨)을 원격지에 연결하는 방법 -> AWS에서의 EBS(Elastic Block Storage)를 boot disk로 사용한다. 이때 DB 서버를 여러대 두는 것을 보고 Clustering이라고 부른다.

 

Other Storage Options : 파티셔닝 관련이다.

자동으로 하거나 내가 정하는 방법 두가지가 존재한다. 만약 내가 파티션닝을 하고자 한다면 /boot 폴더는 반드시 1GB 이상으로 설정해서 만들어놓자

 

네트워크 카드 중요

왼쪽에서 Automatically connect to this network는 반드시 해놓자

오른쪽에서 VMWare의 Default Gateway는 무조건 192.168.8.2로 해놓자

 

 

- 네트워크 상식

일반 IP : NIC에 할당된 주소

- private IP : 자체적으로 사용하는 IP주소 -> ifconfig.me를 주소창에 검색하면 내가 접속하고 있는 ip(NAT의 ip)가 나온다.

- public IP : ISP에게 비용을 지불하고 공인IP를 하나 할당 받음

- 127.0.0.1 : localhost ip

- x.x.x.0 : ip 문패

- x.x.0.255 : broadcast ip. 작동시 같은 네트워크내에서의 ip들 전체와 통신

- static / dynamic : ip 할당방식들. static은 관리자나 사용자가 ip/subnet mask등을 직접 입력 - 한번 입력시 고정, dynamic은 DHCP가 자동으로 IP 할당

- MAC : NIC제조사에서 부여한 물리적 주소

- 서브넷마스크 : IP 주소의 네트워크 영역과 호스트 영역 구분용

- 기본 게이트웨이(Default Gateway) : 다른 네트워크로 가기 위한 출구 주소(허브 같은거)

- IPv4 : 32bit

- IPv6 : 128bit

 

개발자를 꿈꾸는 프로그래머 :: DHCP란? (tistory.com)

 

- DHCP 작동방식 : 

1) DHCP DIscover : 기계가 브로드캐스팅을 하여 DHCP서버에 DHCP Discover을 보냄

2) DHCP Offer : DHCP서버가 브로드캐스트/유니캐스트로 메시지를 보고 단말에게 쓸 수 있는 ip를 전달함

3) DHCP Request : 단말이 DHCP 서버의 정체와 사용가능한 IP를 알았기에 DHCP 서버에 해당 ip를 쓰겠다고 보냄

4) DHCP Ack : DHCP 서버가 알겠다고 하고 임대기간을 설정해준다.

 

- 클라우드의 IP

- 고정 IP : 클라우드 컴퓨트 서비스의 가상 인스턴스는 IP를 할당 받는다. 보통 IPTime과 같은 기본 게이트웨이가 DHCP를 이용해서 할당해준다. 가상 머신 간 내부 통신만 가능

- 유동 IP : 인터넷에 접속하기 위해 ISP로 부터 할당받은 인터넷 IP가 필요하다. 이게 유동 IP이다.

 

 

- Wireshark

- 패킷조사가능

 

호스트네임, 도메인 네임

- 도메인네임이란 네트워크 상에서 컴퓨터를 식별하는 호스트명을 이야기한다.

- 호스트네임이란 네트워크에 연결된 장치들에게 부여되는 각각의 고유한 이름

 

편의를 위한 추가적인 설정

- yum 관련

- 그룹리스트

```

yum grouplist  # groupinstall로 설치 가능한 리스트를 볼 수 있다.

yum grouplist | grep Server

yum -y groupinstall "Server with GUI" && yum -y update && reboot   # 이걸로 GUI 환경 설치하기

```

 

- 기본 명령어 사용하기 : 환경변수

usr 밑으로 내려가면 사용자가 shell에서 명령어를 실행시 실행될 (date), 해당 명령어를 실행할 수 있는 파일을 $PATH 아래에서 찾게됨. 만약 해당 파일이 있다면 명령어는 정상 실행, 없다면 그런 파일, 명령어를 찾을 수 없다는 결과를 냄. 결국 명령어 파일을 PATH 변수에서 지정한 디렉토리에 위치 시켜야 함.

 

```

mkdir /root/0117 ; cd /root/0117

vi stime ; chmod +x stime

```

이렇게 파일을 만든다음 파일을 환경변수 PATH아래의 경로로 이동시키자.

 

```

PATH=$PATH:/root/0117

stime

```

하면 stime이라고 입력시 PATH에서 파일 경로를 찾아 실행된다.

 

- 시작 메세지 수정

```

cat /etc/motd

```

여기에 시작메세지 넣으면 출력됨

 

기본 명령어 사용하기

 

2. 리눅스 관리

편집기

알아서하기

 

 

디스크 관리

보통 디스크는 sda(물리장치), sda1(sda 파티션 첫번째), sda2(sda 파티션 두번째)에 할당된다. 각 디바이스들은 논리장치인 디렉토리에 마운트되어 사용한다.

해서 마운트 된 정보를 보면 위와같다. sr0는 CD-ROM을 의미하고 마운트 위치는 on 뒤쪽에 있는 /run 부터 시작하는 부분이다. 괄호 친 부분은 속성값이다.

 

- 마운트란

HW를 OS에 인식시키는 작업. 특정 장치를 하나의 디렉토리처럼 사용하기 위한 작업이다. 클라우드나 가상화에서는 물리장치인 CPU, DISK, NIC등을 간단한 단어로 논리장치화하여 vCPU, vDISK, vNIC을 생성한다. 가상화에서는 물리 장치를 간단한 논리장치로 추상화한다. 추상화된 논리 장치를 연결하여 사용하면 이를 가상화라고 부른다.

 

- CD-ROM으로 마운트 체험하기

마운트라는 것이 결국에 모든 물리자원들은 바이너리로 /dev아래에 저장되어 있다. 이것들을 사용할 수 있는 파일형태로 바꾸는 과정을 보고 마운트라고 부른다.

 

```

mount | grep sr0

unmount /dev/sr0

mkdir /mycdrom

mount /dev/sr0 /mycdrom

```

하면 cdrom이 mycdrom 폴더에 마운트된다.

 

 

- 디스크 관리

 

사용하는 디스크의 사이즈가 작을 경우 이를 확장하여 사용할 수 있는 방법으로 물리볼륨을 통합하고 이를 다시 논리볼륨으로 나누어 사용할 수 있다.

 

 

사용자와 그룹 관리

리눅스와 유닉스의 기능으로 MA(MultiAccess)와 MT(Multi-Tasking)이 가능하다.

```

chown user1.dev abc.txt  # 파일의 사용자와 그룹 소유권을 변경할 수 있다.

chmod -R 755 abc.txt  # 파일 권한 변경

```

 

root : 슈퍼 유저

아무 닉넴 : 일반 사용자

```

cat /etc/passwd

sudo

su 유저이름

```

root -> user id

x -> passwd -> /etc/shadow에 암호화되어 담기기 때문에 보이지 않는다.

0 -> uid -> root는 0번 -> 일반사용자는 1000번부터 자동으로 할당됨

0 -> gid -> 그룹 root는 0/일반사용자는 1000

root -> group name

/root -> home dir

/bin/zsh -> 사용하는 쉘

 

- 그룹 추가

```

usermod -aG 그룹

```

 

 

추가적인 작업 관리 

- 링크

link : 바로가기와 같은것

ls -i : i-node 번호 확인가능

- soft link : 윈도우의 바로가기와 같은 기능을 수행함

```

ln -s 파일명 소프트링크파일명

mv 소프트링크파일 /usr/bin

```

/usr/bin으로 소프트링크를 옮기면 새로운 명령어로 사용가능하다.

 

- hard link : 진짜로 파일을 연결해줌. 같은 이름의 복사본.

```

ln 파일명 하드링크파일명

```

 

- sudo

root로만 작업한다면 혹시 모를 root 패스워드 노출, 파일 삭제 등의 위험에 처해질 수 있음. 이 경우 일반 사용자중 관리자를 임명해 해당 사용자에게 루트의 권한을 일시적으로 사용할 수 있도록 해 주는 기능 제공하기

 

권한부여 수정하기

```

visudo /etc/sudoers

```

가서 위와같이 사용자 혹은 그룹을 추가해주어서 권한을 넣어주면  sudo 명령어 사용이 가능해진다.

 

- 트러블 슈팅, 로그파일 확인

애플리케이션의 모든 종류와 서비스, 커널로 부터의 출력 내용이 로그 파일에 포함된다.

```

journalctl

journalctl -- since "2016-02-02 14:30" --until "2016-02-02 15:00"  # 기간설정

journalctl -f  # 실시간

```

 

systemctl restart 시 문제점이 있다면 다음의 명령어를 이용해 상태를 확인하자

```

systemctl status [  ]

journalctl -xe 

```

 

3. 서버 운용

DNS 서버 운용

- 개념(작동방법)

호스트(PC)가 주소창에 http://www.test.com 을 하면?

???

1. 자신의 웹 캐시를 먼저 찾는다.

2. 자신의 hosts 파일을 검색한다 : hosts 파일은 단방향이다. 내가 가는건 상관없는데 상대가 나한테 오는건 못한다. 통신에 참여하는 모든 서버들이 동일한 hosts 파일의 내용을 공유해야한다.

3. DNS 서버를 통해 IP를 찾을 수 있다.

- 자신의 zone 파일 내에 매핑값을 기록해 둔다.

 

예를들어 우리가 인터넷 접속할 때 등록한 8.8.8.8은 구글에서 운영하는 퍼블릭 DNS 서버이다.

4. `.` DNS -> `.com` DNS -> `test.com` DNS의 zone에서 `www.test.com`을 발견하고 load balancer ip를 client의 DNS에게 반환해준다.

5. client DNS의 캐시인 zone에다가 해당 load balancer의 주소를 적어놓고 다음 접속시 해당 정보를 준다.

 

 

- step1 : 기본 DNS 만들기

```

yum -y install bind-utils

nslookup www.google.com

```

bind-utils에 nslookup이 포함됨 실재로는 DNS를 만들기 위해

```

yum -y install bind*

# yum -y install bind bind-chroot

```

위와같이 해서 관련 패키지 모두 설치하는게 더 좋음

 

 

```

vi /etc/hosts

```

위와같이 해놓으면 도메인 이름만 적어도 알아서 ip 찾아서 간다. 여기가 바로 DNS 캐시인 zone이다.

 

```

vi /etc/named.conf

```

 

가보면 위와같이 있는데 우리는 여기에서 127.0.0.1과 localhost를 any로 바꾸어주어서 아무나 들어올 수 있게 해주면 된다.

 

```

systemctl restart named

```

하면 매우 기본적인 DNS가 만들어진다.

 

 

이렇게 만든다음 다른 vm이 우리의 DNS를 통과해서 외부로 접속하는 것이 가능해진다. 위와같이 GATEWAY를 lbdns 주소로 했는데 www.google.com으로  로 ping이 보내지는 것을 확인할 수 있었다.

 

참고로 네트워크 정보를 수정하면 반드시 네트워크를 재시작해야해서

```

systemctl restart network

```

 

 

 

- 실습2 : 기본 DNS 만들기

step1.

```

vi /etc/sysconfig/network-scripts/ifcfg-ens32

```

lbdns에서 위의 파일을 열기, DNS 부분을 아래와 같이 수정하기

DNS를 두개 등록해놓자. 이렇게 하면 처음으로 나의 cache server을 검색해본다.

 

step2.

```

vi /etc/named.conf

```

가장 아래에 다음의 내용을 작성하기

 

dns를 관리하는 master와 slave가 따로 있는데 우리는 일단 master밖에 없다. 이걸 설정해서 만약 내가 다운되면 slave DNS Server가 관리할 것을 말하는 것이다.

내가 test.pri를 관리하는 master 서버라는 것을 알려주는 것이다.

 

```

named-checkconf

```

라고 치면 아무것도 안나온 상태로 DNS 서버가 업데이트된다.

 

step3.

위에서 언급한 DB 내용은 test.pri.db에 등록되어야 하며 기본 경로는 /var/named 이다.

즉, /var/named/test.pri.db 파일을 만들고 test.pri 도메인에 대한 설정을 이곳에 모두 등록하면 된다.

 

```

cd /var/named

touch test.pri.db

```

 

@는 test.pri를 의미한다.

SOA : Start of Authority

IN : Internet

NS : nameservice

www : 누가 www 물어보면 

A : IP 정보를 알려준다.

 

사실 나도 봐도 모르겠다... 이게 모냐

 

step 4.

구성정보 확인 후, 네임서버 재실행.

 

```

named-checkzone test.rpi test.pri.db

systemctl restart named

```

해서 OK 나와야 한다.

 

이제한번 WEB2로 DNS가 잘 작동하는지 해보자

 

??????????????????

 

 

실무상황 : aws에서 서버를 하나 만들었다. 해당 서버의 IP주소는 211.5.6.7이다. 해당 서버에 웹 서비스를 생성했고 외부에서 클라이언트들이 접속할 수 있도록 도메인과 연결하라.

 

 

도메인 - aws 연결하기

이걸가지고가서

내이름.keduitXXXX.site를 만들자

 

 

 

 

 

웹 서버 운용(apache, nginx, httpd)

- 개념 : 웹서버에 접속하는 과정

인터넷을 접속하기 위해 먼저 Gabia의 DNS 서버에 test.com이라는 사이트의 ip 주소를 등록해놓는다.

 

등록하면서 회사 내부 DNS 서버의 IP를 등록한다. 그럼 Gabia의 DNS 서버 zone 파일에 test.com의 정보를 저장해놓는다. 그리고 회사의 zone 파일안에 www서버의 ip 주소가 등록되어 있다. 그런데 test.com이 관리하는 www가 있기 때문에 접속경로가 www.test.com이  이 된다. Client에도 DNS 서버를 설정하는데 이것을 로컬네임서버라고 부른다.(/etc/hosts/).

client에서 서버 검색시

1. 캐시를 검사해서 데이터를 긁어온다.

2. hosts 파일을 검사해서 정보가 있는지 확인한다.

3. DNS에게 검색한다.

4. NAT로 IP를 변환해서 인터넷으로 간다.

5. DNS 내부에(마스터 DNS) 캐시 네임 서버를 검색해서 .com 서버로 간다.

6. .com 서버에서는 naver.com이 있는 것을 확인한다.

7. 정보를 8.8.8.8에게 전달한다.

8. 마스터 DNS는 naver.com DNS로 간다. 

9. DNS 내부 zone안에 있는 www.naver.com을  을 반환해준다.

10. 8.8.8.8은 정보를 캐시에 담는다.

11. 이거를 pc에게 알려주면서 그 정보를 일정기간동안 캐시에 저장하라고 한다.

12. 이제 pc는 해당정보를 캐시를 사용해 접근할 수 있고 8.8.8.8도 해당 정보를 캐시에 가지고 있어서 다른 사용자에게 그 정보를 전달해주면된다.

 

이제 다시 돌아와서

 

1. client는 가지고 있는 ip 주소에 패킷을 보낸다.

2. 패킷 내부에는 보내는 사람과 받는 사람의 ip가 적혀있다.

3. 패킷의 헤더에는 보내는 방법(TCP, UDP)와 보내고 받는 포트도 정해져있다. 이때 보내는 사람의 포트는 1024번 이후의 랜덤 포트를 사용하고 받는 사람은 정해진 포트(80)을 사용한다.

4. 이렇게 설정된 헤더 뒤에 데이터를 붙인다.

5. 데이터 안에는 일단 SYN의 내용이 들어가 있다.

6. three-way-handshaking을 하고 나면 어찌되었든 세션이 만들어진다.

7. 데이터 내부에는 GET이 들어가 있다.

8. 서버에는 index.html등을 포함한 파일들이 포함되어 클라이언트에 뿌려준다.

 

- 설정파일

vi /etc/httpd/conf/httpd.conf

 

- 명령어

```

yum install -y httpd

systemctl start httpd

systemctl restart httpd

systemctl stop httpd

 

systemctl enable httpd

systemctl disable httpd

 

systemctl status httpd

```

 

- 호스트네임 변경

vi /etc/hostname

 

- 접속로그 확인하기

```

cat /var/log/httpd/access_log

```

 

- httpd 접속 경로 설정, 접속 포트 설정

```

gedit /etc/httpd/conf/httpd.conf

```

대충 DirectoryIndex 뒤에 오는거 수정해주면 된다.

대충 Listen으로 시작하는거 바꾸어주면 된다.

 

만약 했는데 접속이 안된다면

```

setenforce 0

systemctl restart httpd

```

해주면 일단은 된다.

 

NFS 서버 운용

- server

vi /etc/exports에서 위와같이 사용할 폴더와 ip 그리고 속성을 작성

rw : read,write

sync : client 데이터 입력을 서버가 확인 및 메세지 전송

async : client 데이터 입력을 서버가 미확인

no_root_squash : 클라이언트의 작업도 root가 한 걸로 인정

```

yum install -y nfs-ufils

systemctl stop firwalld

systemctl disable firwalld

systemctl start nfs-server

```

 

- client

```

mount -t nfs 192.168.8.100:/cloud /test

```

 

- 로그확인

cat /etc/passwd | grep nfsnobody

위에서 알수없는 사용자를 확인할 수 있다.

 

- 마운트 확인

mount | grep nfs

 

- 해당 서버에 마운트 가능한지 확인

showmount -e 192.168.2.103

 

- nfs 서비스 포트번호 확인

vi /etc/rpc 

여기에서 nfs 확인가능

 

- 재부팅 후에도 마운트 유지

1. ~/.bashrc 에 `mount -t nfs 192.168.8.100:/cloud /test` 를 적어놓기

2. /etc/fstab에 새로운 내용 추가

13번째 줄처럼

ip:/공유폴더 /마운트 위치

nfs : filesystem 방식

defaults : 읽고/쓰고/사용 가능

0 : 마운트되어 있는지 점검안함 (1 : 점검함)

0 : 점검순서 0순위

 

 

Proxy 서버 운용

- 개념

SW, HW 적으로 프록시 구현가능. 인터넷으로 client가 나갈려면 먼저 proxy 서버로 간다. client가 명령어를 던지면 proxy 서버는 먼저 대기하다가 proxy서버가 대신나간다.

네이버의 첫번째 화면을 끌고와서 프록시 서버의 캐쉬에 담는다. 그리고 담아온걸 클라이언트에게 제공한다. 그 다음 사용자들에게는 캐쉬에 있는 것을 제공한다. 동일 페이지로 접속을 요구하면 캐시에 담겨있는 데이터를 LAN구간에서 직접 전달하므로 빠른 속도로 데이터 송수신이 가능해진다.

1. 인증 : 클라이언트의 프록시 접속시 인증을 요청

2. 컨텐츠 필터링 : 캐시에 담긴 웹서버 데이터중 일부를 필터링해서 클라이언트에게 제공

3. URL 필터링 : 프록시 내부에 제한된 사이트 작성

 

- 환경 구성

NIC 3개 꽂히고 그 중 2개는 내부망을 위해 DNS랑 게이트웨이 안적음

# Starter Pack
rpm -qa | grep squid
yum install -y vim net-tools curl wget git tree nfs-utils httpd && yum update -y && poweroff
yum install -y squid  # proxy 서버용

환경은 startpack 깔린 centos 한개랑 WIN10한개

 

 

```

vi /etc/squid/squid.conf

```

먼저 localnet은 주석처리해야함. 이거 그냥 열어놓으면 로컬로 연결된 윈도우는 계속 접속 가능함

 

- http 로 접근 관련

```

http_port 1234 transparent  # 1234번 포트 염, Squid가 사용자 요청 바꾸는 거 막음

http_access allow all  # http 접근을 막거나 열 수 있음

```

- http 이외 처리 : Access Control List(ACL) - 사실상 변수임

```

acl localnet src 192.168.0.10  # 이렇게해야 특정 ip만 열 수 있음

acl localnet src 192.168.0.10/30  # 이렇게해야 특정 ip만 열 수 있음

acl Safe_ports port 123  # http 로 접근한게 아닌 123번 포트로도 접근 가능해짐

```

- proxy authentication

```

yum -y install httpd-tools

 

touch /etc/squid/passwd && chown squid /etc/squid/passwd

htpaawd /etc/squid/passwd newuser  # 새로운 유저 추가

```

/etc/squid/squid.conf 에 다음을 추가

```

auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic children 5
auth_param basic realm Squid Basic Authentication
auth_param basic credentialsttl 2 hours
acl auth_users proxy_auth REQUIRED
http_access allow auth_users

```

- Block Websites

```

sudo vi /etc/squid/blocked.acl

--

.facebook.com

.twitter.com

--

sudo vi /etc/squid/squid.conf

acl blocked_websites dstdomain "/etc/squid/blocked.acl"

http_access deny blocked_websites

```

 

Load Balancer(HAProxy)

이제 HAProxy 구성을 해보자

 

이번에도 putty를 이용해 ssh>kex에서 Diffie-Hellman group 14,1을 최상위로 올리어 사용하자

```

vi /etc/haproxy/haproxy.cfg

```

 

lb

```

명령어 모드에서 d G  # 내용이 모두 삭제되었다.

```

global
   log /dev/log local0
   log /dev/log local1 notice
   chroot /var/lib/haproxy
   stats timeout 30s
   user haproxy
   group haproxy
   daemon

defaults
    log global
    mode http  #http에 대해서 트래픽 분배예정 -> FE와 BE 설정 필요
    option httplog
    option dontlognull
    timeout connect 5000  # 서버한테 생존여부를 물어본다. 5초마다(5000)
    timeout client 50000
    timeout server 50000

frontend http_front
    bind *:80  # 80번 포트로 접속하면 
    stats uri /haproxy?stats  
    default_backend http_back  # 이걸 http_back 으로 보내겠다.

backend http_back
    balance roundrobin  # 이 트래픽을 roundrobin으로 처리하겠다.
    server web1 192.168.1.101:80 check   # 여기에다가 서버 ip 입력 # 서버한테 생존여부를 물어본다.
    server web2 192.168.1.102:80 check #"backup"이 붙으면 대기상태로 남는다. 서버1이 죽으면 active로 바뀐다.
    # 만약 죽으면 제외시킨다. 나중에 생존 여부를 받으면 다시 보낸다.

 

저장하고 그 다음 일을 수행하자

 

고가용성 : 클라이언트가 필요로 하는 서비스, 리소스등을 적절한 시간에 즉시 제공해 줄 수 있는가? -> 고가용성은 일반적으로 Active/Standby(Active/Active)를 준비하여 Active가 처리하고 문제가 발생하면 대기중이던 Standby가 이를 이어바3아 Active가 된다. 클라이언트는 Active가 활성화, 비활성화 된 것에는 관심을 둘 필요 없이 서비스를 이용하기만 하면 된다.

 

standby는 두가지가 있다.1. cold standby : 죽었을때 부팅된다.2. hot standby : 전원키고 상시 대기

 

```

systemctl restart haproxy

systemctl enable haproxy

```

lb

주의할 점!!!

LB는 80번 포트로 들어온 웹접속 요청을 자신이 처리하는 것이 아니라 Backend로 포워딩해서 넘겨주어야 한다. 따라서 LB가 웹서비스(tcp/80)를 제공하고 있다면 자신이 그냥 처리를 해 버리므로 절대 웹서비스를 실행해서는 안된다.

 

HAProxy란? (tistory.com)

 

HAProxy란?

HAProxy HAProxy를 공부하기 앞서 로드밸런싱(Load Balancing)을 알아야한다. 로드밸런싱이란? 하나의 서비스에 대한 부하를 여러 서버로 분산하는 것 왜 로드밸런서가 필요할까 위 사진처럼 클라이언트

dev-youngjun.tistory.com

10.5 Load Balancer 만들기 - TheKoguryo's 기술 블로그

 

10.5 Load Balancer 만들기 - TheKoguryo's 기술 블로그

10.5 Load Balancer 만들기 Load Balancer 만들기 OCI 콘솔에서 내비게이션 메뉴를 엽니다. [Core Infrastructure] >> [Networking] >> [Load Balancers] 항목으로 이동합니다. Load Balancers를 생성할 Region과 Compartment를 확인

thekoguryo.github.io

 

보다시피 LB로 접속했는데 서버1 또는 서버2 중 하나가 동작했다.

 

서버에 접속해서 다음을 입력해서

```

tail -1f /var/log/httpd/access_log

```

web1, web2

위와같이 마지막 한줄짜리 접속 로그를 실시간 확인할 수 있다.

 

web1

재접속해보니 첫번쨰 서버에 반응이 왔다.

 

전체 동작 원리

1. 클라이언트가 http://www.test.com 에 접속

2. 클라이언트의 NIC에 저장된 DNS 서버인 8.8.8.8에게 www.test.com  의 주소를 물어본다.

3. DNS 서버는 www.test.com의  의 주소가 192.168.8.100이라고 알려준다.

4. 클라이언트는 192.168.8.100으로 웹접속하면 Load Balancer는 해당 연결을 일시적으로 대기시킨다.

5. backend 서버쪽으로 LB가 연결한다. 첫번째 연결은 BE의 첫번째 서버로 두번째 연결은 두번째 BE 서버로 연결된다.

6. BE에 있는 웹서버에게 index.html 파일을 요청하고 해당 내용을 lb에게 대기하고 있는 클라이언트에게 제공한다.

7. lb로 부터 index.html 내용을 전달받은 클라이언트는 해당 내용을 자신의 브라우저에 띄운다.

 

가용성 동작 상태 확인하기

1. web1의 192.168.1.101을 down 시킨다. ifdown ens33

2. 브라우저에서 웹접속을 계속해서 시도해 본다. 페이지는 정상적으로 연결되어야 한다.

3. 192.168.8.100/haproxy?stats 로 접속하여 session 수를 확인하며 한쪽만 올라가는 것을 확인할 수 있다.

 

 

위와같이 해당 주소로 가보니 접속 세션등의 정보를 확인할 수 있다.

 

그런데 우리는 NFS 가 없을때 서버를 어떻게 업데이트 할 것인가? 이건 git을 이용하면 된다.

 

자 이걸 AWS에 이 짓거리를 해보자

 

 

 

DB(MariaDB)

DB

```

yum -y install mariadb mariadb-server php-mysql -> 필요한거 설치하기

systemctl start mariadb -> mariadb시작

mysql_secure_installation

mysql -u root -p -> 접속

```

 

db 명령어들

```

show databases;

create database testdb;

use testdb;

create table testtbl (

-> id int primary key,

-> name CHAR(30));

show tables; : 이걸로 모든table들을 볼 수 있다.

desc testtbl; : 테이블 내부를 내림차순으로 볼 수 있다.

```

 

쿼리문

```

INSERT INTO testtbl VALUES(1, 'gildong');

INSERT INTO testtbl VALUES(2, "TonyHan");

```

 

DNS(Domain Name System) : IP주소를 알아들을 수 있는 주소로 바꾸어주는 시스템

4. 클라우드와 가상화를 위한 리눅스

클라우드 가상화의 이해

- 하이퍼바이저/가상화/추상화/vNIC

- 하이퍼바이저 : 가상화를 위한 도구로써 물리자원에 접근하여 이를 논리자원으로 추상화하는 작업을 진행하는 도구

- 추상화 : 물리장치인 CPU를 별도의 가상머신에서 사용할 경우 해당 CPU를 하나하나 기능적으로 만들 수는 없다. 대신 vCPU라는 단순한 논리 이름을 이용하면 이 CPU기능을 사용할 수 있게 되는데 이를 추상화라고 한다. 특징으로 확장이나 축소가 가능해진다.

- 가상화 : 논리적인 장치들을 연결시키어서 실재 PC처럼 사용하는 것을 가상화라고 한다.

결국 가상화는 추상화된 논리 장치들을 조합하여 하나의 기능을 완전히 제공할 수 있는 기능적 요소를 제공하는 것.

하이퍼바이저가 NIC에게 요청해서 vSW를 만든다.(VMNet 1-8) 마치 NIC의 일부분을 잘라낸것과 비슷하다. 이때 vSW별로 기능이 다르다. 이때VMnet8번이랑 연결한 머신들은 서로 NAT를 통해서 통신이 가능해진다.

 

bridge, NAT와 Host-Only의 차이점은 무엇일까?

1. bridged : 실제 PC와 동일한 네트워크에 연결된상태. 외부와 직접 통신가능

2. NAT(NIC 공유) : 네트워크로 나갈때 NAT를 거쳐 주소가 변환된 상태로 네트워크에 연결된 상태. 외부와 직접 통신 불가능

3. host-only(isolated) : 외부와 통신이 아예안됨. 같은 vNIC으로 연결된 것들끼리는 통신 가능

 

???? 다시 들어야할듯

 

 

트래픽 포워딩

VM이 호스트를 통해 외부와 통신이 되도록 하고자 한다면 반드시 1로 설정되어 있어야 한다.

이걸 안해놓아서 CentOS위의 VM이 네트워크 통신을 못하는 경우가 생길 수 있음.

 

```

cat /proc/sys/net/ipv4/ip_forward

```

0 또는 1

1 : 외부에서 나한테 접근하는거 허용

0 : 외부에서 나한테 접근하는거 거부

 

NTP

system clock을 동기화하는 것

 

NTP(Network Time Protocol) 서버가 있어서 모든 서버의 시간을 동기화 시킨다.

 

```

yum -y install chrony

systemctl start chronyd

systemctl status chronyd 

```

 

DNS

```

cat /etc/resolv.conf

```

하면 DNS를 확인할 수 있다. 여기에다가 DNS를 적어도 되지만 보통 ipconfig 파일을 수정한다.

 

리눅스 인프라 가상화 : KVM(libguestfs, virt)

# 필수프로그램
yum -y install libguestfs libguestfs-utils
yum -y install libvirt qemu-kvm virt-install virt-manager virt-viewer

# 설정
## 이미지에 암호 설정
virt-customize -a CentOS7.pwd.qcow2 --root-password password:test123
## 접근 권한 설정
vi /etc/libvirt/qemu.conf

#실행
systemctl start libvirtd ; systemctl enable libvirtd


# 네트워크
## 네트워크 정보 확인
virsh domifaddr 가상머신이름 
## ip 만 확인
vmip=$(virsh domifaddr $vmname | grep ipv4 | gawk '{print $4}' | gawk -F/ '{print $1}')
## 네트워크 끄기/재실행
virsh net-destroy default
virsh net-start default


# 만들기
virt-install --name $vmname --vcpus $vmcpu --ram $vmram --network network:default 
--disk ${vmname}.qcow2 --os-type linux --os-variant rhel7 --import --noautoconsole > /dev/null

# 생성된거 확인
virsh list --all

 

 

 

 

 

 

 

리눅스 인프라 가상화 : Docker

 

 

 

AppA. fail2ban

AppB. firewall

네트워크 QoS “대기시간·지터를 줄이자” - 데이터넷 (datanet.co.kr)

- 방화벽은 두개가 있다고 한다. 처음들어올때는 웹 방화벽 그리고 서버안쪽 방화벽이다.

- 방화벽이 늘어나면 속도가 준다. 그러면 병목현상이 생기며 latency(대역폭 포화), jitter(대기시간 변동) 이 늘어난다.

- 해결방법은 bandwidth를 늘리는 방법이 있다. 혹은 서버를 scale out하는 방법도 있다. 보통 scale out으로 처리하고 서버가 많아지면 load balancer을 사용한다.

 

```

systemctl start firewalld  #지금실행

systemctl enable firewalld  #자동실행

systemctl status firewalld  #상태확인

firewall-cmd --zone=public --list-all  #열린 포트확인가능
firewall-cmd --list-ports  #열린 포트만확인가능

firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=8888/tcp

firewall-cmd --reload  #이걸 해야 적용된다.

systemctl restart firewalld  #firewall 재실행

```

AppC. Docker를 이용한 XE 게시판 구축

AppD. NIC 설명/이름 변경, 네트워크 설정

- NIC 설명

위와같이 ls ifcfg-*라고하면 여러가지가 뜬다.

ens로 시작하는 것은 인터넷카드이다.

lo(loopback interface) - 논리(가상) - 자기자신 - 127.0.0.1(localhost) - 만약 ping 127.0.0.1이 가능하다면 해당 서버 또는 PC는 TCP/IP 프로토콜이 정상적으로 동작한다는 것을 의미함. 결국 loopback은 테스트용 가상 인터페이스이다.

 

- 네트워크/데몬 서비스

어떠한 서비스를 운영하기 위해서는 필수적으로 데몬을 사용한다. httpd도 httpd.conf를 읽어들일 데몬이 있기에 실행이 가능하다.

네트워크도 데몬이 있다. network라고 부른다. 네트워크 설정을 바꾸었다면 얘를 껏다켜야한다. 방법은 아래에 나와있다.

 

인터페이스에 IP 주소를 등록하는 방법

1. 영구적인 방법 : 파일자체를 수정하여 고정적으로 주소를 사용하는 방법

2. 임시 방법 : 재부팅전까지 지정한 주소를 사용할 수 있다.

-> ifconfig eth0 192.168.1.111 netmask 255.255.255.0

 

- 네트워크 끄고/키기(0110)

systemctl restart network

ifdown ens32
ifup ens32

네트워크 속성 적용하기

 

 

- NIC 이름 변경

```

vi /etc/default/grup

```

 들어가서 GRUB_CMDLINE 뒤쪽에 net.ifnames=0 biosdevname

아마 net interface names = 0, bios device name = 0

NIC이 꼽힌곳에 따라서 이름바꾸는 거 안하겠다. 바이오스의 이름에 따라서 결정하는 것도 안하겠다. 사용자가 정한 이름데로 하겠다는 의미이다.

 

그럼 이제부터는 ens32, ens33으로 처리되던 NIC이 내가 정한 이름으로 정할 수 있음

```

cd /etc/sysconfig/network-scripts

mv ifcfg-ens32 ifcfg-eth0

```

위와같이 9가지가 가장 중요하다

 

 

 

 

ip 도 바꾸어 주었다.

ONBOOT : 여기에 적힌 인터페이스를 활성화하겠냐는 건데 yes로 해야 사용가능해진다.

```

grub2-mkconfig -o /boot/grub2/grub.cfg

```

하면 네트워크 구성이 완료되었으니 재부팅해서 적용해보자

 

 

- 네트워크 정보 확인하기

```

route 

netstat -r

```

해당 서버에서 통신 가능한 네트워크 정보를 확인할 수 있으며 네트워크별로 어떤 인터페이스를 통해 도달이 가능한지를 확인할 수 있다. 같은 네트워크 망이라면 해당 NIC으로 가면 되고 만약 없다면 default에 적힌 gateway NIC으로 가면된다.

 

 

- 네트워크 접속 정보 확인하기

```

netstat --inet  # 현재 서버로 연결을 했던 타 호스트들의 정보를 확인할 수 있다. 연결을 했을 때 웹/ssh/ftp 등 어떠한 방법으로 접속했는지 여부를 확인할 수 있다.

who  # 현재 서버로 어느 계정이 접속되어 있는지를 확인할 수 있다. 또한 ssh와 같은 방법인지 또는 console로 접속한 것인지 여부도 확인이 가능하다.

```

tty1 : 콘솔연결

pts : 원격접속 -> ip로 접속한 정보 -> root가 어떤 ip로 접속했는지를 알려준다.

 

- 상대 DNS 정보보기

```

dig 도메인 주소

```

하면 위와같이 직접 ip가 나올 수도 도메인 주소가 나올 수도 있다. 중요한건 특정도메인에 대하여 다수의 IP를 설정해야하는 경우 CNAME을 이용하여 여러 이름을 할당하고 이름별로 여러개의 IP 설정도 가능하다

 

 

AppE. 포트포워딩

위와같이 Host port와 Guest Port를 [DHCP Settings] > [NAT Settings] > [Add Network]로 수정할 수 있다.

포트포워딩을 하는 이유는 결국 보안 때문이다.

AppF. SELINUX

CentOS 내부에 존재하며 리소스에 대한 보안만을 전담하는 작은 보안 리눅스

리소스(cpu, ram), 기본포트, 설치기본디렉토리를 바꿀떄는 SELinux를 꺼야함

 

명령어

```

setenforce 1  # 재실행

setenforce 0  # 정지

getenforce   # SELINUX 상태 확인가능

```

SELinux의 모드 설정 -> 이걸 바꿀려면 파일을 직접 수정해야함

vi /etc/selinux/config 에서 수정

- enforcing : 강제

- permissive : 알림

- diable : 멈춤

 

enforcing 상태일때

- setenforce 0 : permissive

- setenforce 1 : enforcing

disable 상태일때

- setenforce 0 : disable

- setenforce 1 : disable

 

AppG. Key-Pair

```

ssh-keygen

```

하면

~/.ssh/id_rsa*

의 키가 생긴다.

 

AppH. SSHD

설정파일

```

vi /etc/ssh/sshd_config

```

 

접속방법

```

ssh -p 20022 -l root 192.168.8.100

ssh -i id_rsa -p 20022 -l root 192.168.8.100

```

 

key-pair

보통 연결할때 key-pair을 이용하는데 접속하는 서버에서는 authorized_keys가 따로 존재한다. 이걸 전송하기 위해 두가지 방법을 쓴다.

 

1. scp id_rsa.pub 192.168.1.103:~/.ssh/authorized_keys

로 ssh로 키를 전달하는 방법

2. 처음부터 복사될 서버에 authorized_keys를 저장해 놓는것

그럼 접근시 그냥

```

ssh -l root 192.168.1.103 ip a | head -3

```

으로 간단하게 접근 가능해짐.

 

AppI. run-level 1을 이용하여 패스워드 변경

1. 재부팅 중 'e' 누르기 -> edit 모드로 들어올 수 있음

2. centos 에 root로 접속해서 ro 뿐 아니라 rw로 바꾸겠다는 의미로 바꾸자. 그외 crashkernel부터 해서 rd.lvm.lv 부분이 남도록 그 중간부분은 지운다. init=/sysroot/bin/sh을 추가해주자.

ctrl + x로 해주면 쉘로 접속한 것을 확인할 수 있다. 

 

3. 패스워드 수정하기

chroot /sysroot로 사용하는 사람을 싱글모드로 진입하게 해주자.

passwd 로 root의 패스워드를 재 설정해주자 패스워드는 모두 test이다.

touch /.autorelabel로 설정한 내용을 SELinux에 반영해주자

exit 한다음 reboot로 재부팅하기

AppZ. 기타 명령어들(SSHD)

- 에러난 곳 찾아내기

journalctl -xe  #에러난 곳 찾아내기

 

- 마운트 확인

mount | grep nfs

 

- 서비스 포트번호 확인

vi /etc/rpc 

여기에서 nfs 확인가능

 

 

728x90