본문 바로가기
Development(Web, Server, Cloud)/22) LINUX - Cloud

cloud13

by tonyhan18 2022. 1. 17.
728x90

- 파이썬

- 쿠버네티스 (가상화 -> 도커 -> 쿠버네티스)

1. 온프레미스 환경(DC 서버위에 직접 설치하는 방법)

2. cloud - private cloud (openstack - 우리는 gcp의 k8s와 같은 서비스를 만들예정)

  - public cloud (gcp, azure, aws)

  - ansible (시작 -> 가상화[KVM]와의 연결)

  - 네트워크 (19 ~ 28일까지 강사 교체 - 오후 4시간 : 기초 - VLAN [VTP] -> 클라우드 환경에서 꼭 알아두어야 할 네트워크 지식, 클라우드를 위한 네트워크 : 네트워크에서의 명령어는 외울 필요 없음)

  - VLAN -> Static Routing -> NAT -> ACL (Access Control List) -> GRE Tunnel, VxLAN(Overlay network), SDN/NFV(OpenvSwitch), MPLS(개념파악)

 

---

 

NetworkManager/firewalld/SELinux

(대충 위와같은 아이콘)

NetworkManager(서비스/데몬이름) -> GUI 환경에서 일반사용자가 무선 wifi를 손쉽게 사용할 수 있도록 자동 연결이 되는 기능을 제공하고 IP 구성등을 손쉽게 설정하고 설정된 내용이 즉시 구성 파일에 적용 -> 데몬 재실행이 일어날 수 있도록 해주는 등의 기능을 제공한다.

 

NetworkManager 중지 및 비활성화

-> systemctl stop NetworkManager

-> systemctl disable NetworkManager

 

IP 등의 네트워크 요소 변경시 파일을 수정하고 systemctl restart network 해야한다

 

방화벽해제

```

systemctl stop firewalld

systemctl disable firewalld

```

 

SELinux : 리눅스 OS 내에서 리소스 등에 대한 보안 만을 전담하는 작은 보안 리눅스

OS -> 리소스(cpu,ram). 기본포트, 설치기본디렉토리 바꿀때는 SELinux를 바꾸어야한다.

- 현재 동작중인 SELinux를 종료하는 것

```

setenforce 1  # 재실행

setenforce 0  # 정지

getenforce   # SELINUX 상태 확인가능

```

SELinux의 모드 설정

enforcing

- setenforce 0 : permissive

- setenforce 1 : enforcing

disable

- setenforce 0 : disable

- setenforce 1 : disable

 

 

- 재실행시 자동으로 활성화되는 것 막고 싶다면?

/etc/selinux/config 파일에서 수정해야 한다.

 

대충 위와같이 SELINUX 부분을 수정하면 된다.

 

 

트래픽 포워딩

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

 

```

cat /proc/sys/net/ipv4/ip_forward

```

0 또는 1

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

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

 

 

1순위로 얘를 확인해보면 나한테 네트워크 접속이 안되는 이유를 확인할 수 있다.

 

쉘은 시스템 프로그램 영역이다. 이곳을 담당하는게 시스템 프로그램이다.

 

커널 : 하드웨어를 제어하기 위한 프로그램

쉘 : 운영 체제에서 제공하는 명령을 실행하는 프로그램 (명령어 해석기, 프로그래밍, 사용자 환경 설정 기능 가능)

 

 

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 파일을 수정한다.

 

편의를 위한 추가적인 설정

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

 

user1 -> sudo systemctl restart network

일반사용자가 시스템, 네트워크 등을 재실행할 수는 없다. 위와 같이 실행하면 root의 권한을 일시적으로 득함. 이 경우 루트는 user1이 맞는지를 확인하기 위해 user1의 패스워드를 요구하지만 이 역시 생략가능

 

사용자는 기본 자신의 이름으로 된 그룹에 속함 이 그룹을 primary group(기본 그룹)이라고 부름. 사용자는 primary group에서 빠져나오거나 해당 그룹을 삭제할 수 없다. 즉, 무조건 사용자는 하나이상의 그룹에 포함되어야 함

 

이때쓰는 명령어가

```

기본그룹 : usermod -g 그룹 유저

추가그룹 : usermod -G 그룹 유저

usermod -aG 그룹 유저

```

위의 상태에서 최종적으로  user1은 sales, dev에만 속한다. 추가그룹을 usermod -aG eng user1 -> eng까지 추가 그룹에 포함됨

 

sudo 에 포함시키기 위해서 /etc/sudoers 에 유저를 포함 시키는게 더 나음

```

usermod -G user1

su user1

systemctl restart network

```

 

위의 경우 root의 패스워드를 입력해야 하므로 보안상 결함이 발생할 수 있다. 따라서 이를 타이프하지 않는 선에서 명령 실행이 가능하도록 해야한다.

 

```

visudo /etc/sudoers

```

 

 

시작 메세지 수정

```

cat /etc/motd

```

여기에 내용 넣으면 됨

 

 

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

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

```

journalctl

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

journalctl -f  # 실시간

```

 

systemctl restart [  ] 했을 때 문제점이 있다면 아래의 두가지 사항을 이용하여 확인가 가능하다

- systemctl status [  ]

- journalctl -xe 

중 하나를 쓰면됨

 

기본 명령어 사용하기

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

 

```

mkdir /root/0117 ; cd /root/0117

vi stime

```

 

```

chmod +x stime

```

 

이렇게 만든 파일을 ./stime으로 하면 실행이 되는데 그냥 바로 쓰기 위해서는 환경변수에 등록해야한다.

1. 해당 파일을 PATH 변수 아래의 경로로 이동시킨다.

2. 해당 파일이 있는 경로 자체를 PATH 변수에 추가해야한다.

 

 

 

 

```

PATH=$PATH:/root/0117

$PATH

stime

```

와 같이 등록하면 PATH를 찾아서 실행하게 된다.

 

 

시작과 종료

init 0 : 런레벨 0 은 종료

1은 단일 사용자 모드

3은 CLI 기반 다중 사용자 모드

5는 GUI기반 다중 사용자 모드

init 6 : 재부팅

 

기본 명령어

ls -a : 숨김파일/디렉토리 포함하여 모두 보여줘라

 

touch : 크기가 "0"인 빈 파일을 만들기 위한 목적

file : 파일의 종류, 포맷 등을 출력

 

find(얘는 중요함)

atime, mtime, ctime

locate, which (검색을 위해 사용된다)

 

2. 리눅스 관리

sed

```

sed -i 's/ / /g' 파일 : (s)수정됨, (g)발견되는 모든거 다 바꾸어줌(-i)

```

 

source 는 바꿀 내용

대충 위와같이 작성해주자 그러면 sed 명령어가 작동하여 내용을 수정할 것이다.개

 

디스크 및 장치 관리

리눅스에서는 물리장치를 사용하기 위해서는 해당 장치를 논리 장치와 연계하여야 사용이 가능하다. 이를 리눅스에서는 "마운트"라 부른다.

클라우드나 가상화에서는 물리장치인 CPU, DISK, NIC등을 간단한 단어로 논리장치화하여 vCPU, vDISK, vNIC을 생성한다. 가상화에서는 물리 장치를 간단한 논리장치로 추상화한다. 추상화된 논리 장치를 연결하여 사용하면 이를 가상화라고 부른다.

 

 

VMnet1번은 자동으로 관리 ip (mgmtip) 192.168.1.1이 할당되어 있다.

이때 자동으로 할당된 ip는 OS에 붙어있는데 이걸 가지고서 192.168.1.10의 vm과 연결되어 있다.

???

보면 VMnet1만 있는게 아니다.  그외에도 VMnet8, VMnet2 도 존재한다.

 

그래서 우리가 vm에 들어가서 VMnet ip를 쓸려고하면 ip 충돌이 일어난다. 

 

virtual network type은 3가지

VirtualNetworking - Libvirt Wiki

 

VirtualNetworking - Libvirt Wiki

Virtual Networking How the virtual networks used by guests work Networking using libvirt is generally fairly simple, and in this section you'll learn the concepts you need to be effective with it. Also please bear in mind that advanced users can change imp

wiki.libvirt.org

1. Bridged

 

2. NAT

외부로 나갈때 공인 ip로 바꾸어 나간다.

이걸 192.168.8.0/24를 사용한다.

 

???

 

kt로부터 나온선을 강의장 공유기로 연결시키었다. 그럼 공유기 앞쪽에 공인 ip가 들어가 있는 상태이다. 그리고 별도의 인터페이스를 실재 switch와 연결시킨다. 그럼 이 스위치에서 하나 따온게 우리가 쓰는 컴퓨터들이다. 이때 우리 컴퓨터의 ip는 10.5.1.x로 정의되어 있다고 하자. 이때 Default Gateway 주소(10.0.0.1)이라는 주소로 컴퓨터가 패킷을 보내서 NAT로 또 변경해서 외부로 내보낸다.

이때 vm이 192.168.8.100으로 정의되어 있다면 얘가 나가기 위한 Default Gateway가 VMware로 정의되어 있다. 192.168.8.2이다. 그래서 vm의 1,2번은 쓰면 안된다.

 

???

 

위와같이 연결되어 있다. 이 상태에서 VMnet8번 192.168.8.1로 나가고 VMnet8은 Default Gateway 192.168.8.2로 가고 DG는 컴퓨터의 NIC을 타고 또 스위치로 간다.

 

 

virbr0가 보인다. 이건 CentOS7부터 적용된 가상네트워크를 위한 가상스위치이며 기본적으로 NAT의 기능이 적용되어 있다. 만약 해당 리눅스내에서 가상화를 활성화시키고 가상머신을 virbr0에 연결하게 되면 해당 가상머신은 192.168.122.X 주소를 DHCP를 통해 자동으로 할당 받고 Host PC의 공인주소 (192.168.8.100)로 변경된 뒤 외부와 통신이 가능하게 된다.

즉 가상화를 위한 브릿지이다.

 

CLF, SAA, DVA, SOA, AWS Certified

 

 

3. Host-only

 

kvm virtual network

위와같이 외부 네트워크와는 단절된 자기들끼리의 네트워크이다. 얘네들은 보통 192.168.1.0/24 를 쓰도록 만든다.

 

 

디스크의 추가

LVM(Logical Volume Manager)

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

 

???

 

3G를 넣는데 sda1에 2G가 남은 경우 sda2에 넣겠지만 sda1에 남은 2G가 아까워진다.

두개의 디스크를 연결하고 가운데 공간을 묶어버리자 그래서 논리적으로 40G짜리를 만들고 공간을 공유해서 파일을 저장하는 것이다. 이것을 리눅스에서는 LVM이라고 부른다.

 

???

 

위와같이 10G 세개를 묶어 30G를 하나만들고 얘를 volume group이라고 부른다. 이렇게 만들걸 다음과 같이 logical volume으로 사용할 수 있다.

1) case1 : 30G 통

2) case2 : 15G 15G

3) case3 : 25G 5G

 

물리볼륨을 볼륨그룹에 포함시킨뒤 원하는 크기로 논리적으로 분할하여 사용할 수 있는 방법

 

- RAID(매우 중요)

두개이상의 디스크를 결합하여 사용할 수 있는 방법으로 FT(Fault Torrance), 디스크 공간 확장, 쓰기 속도 향상 등 다양한 기능을 제공한다. 특히 데이터 손실을 방지해야하는 클라우드 환경에서는 매우 중요한 요소중 하나이다.

 

LVM은 한쪽을 꽉채우고 그다음으로 넘어가는 방식이라면 RAID는 다양한 방법을 제공한다. 그중에서도 가장 많이 쓰는 것은

 

RAID 0동시에 양쪽을 쓰겠다는 뜻이다. 그래서 속도가 두배가 된다. RAID 0 은 strip 방식이라고 부른다. 속도를 빠르게 쓰기가 가능하고 전체 저장공간을 100% 사용한다는 점에서는 매우 유용하나 한쪽이 파괴되면 데이터 복구가 불가능해진다. Fault Tolerance(결함 허용)을 지원하지 않는다. 만약 DC에서 사용한다면 안된다.

 

RAID 1 은 하나의 디스크에 작성된 데이터를 동일하게 다른 디스크에 작성하는 방식이다. 즉 두 디스크가 완벽하게 동일하다. 이를 미러방식이라 부른다. FT를 제공하므로 복구가 가능하지만 공간활용율은 50%가 된다.

 

 

RAID 4는 잘 안쓴다.

 

클라우드에서는 공간활용 능력과 Fault Tolerance가 중요해진다.

 

RAID 5는 공간활용률을 높일 수 있고 FT지원된다.

복귀 bat 파일이 있는데 이걸 이용하기위해 공간의 일부분을 Parity bit로 쓴다. 예를들어 홀수 parity bit라면 행라인의 다른 블록과의 합이 홀수가 되도록 0 또는 1을 패리티 비트로 쓴다. 이렇게 하면 디스크 4개일때는 75%이지만 100개가 되면 99%까지도 높아진다.

하드웨어적인 기법으로 적용한 RAID는 리눅스와 같은 OS에서 구성하는 소프트웨어적인 기법에 비해 월등히 빠른 속도를 제공한다. 이 기능을 HP, IBM, CISCO와 같은 서버 벤더에서도 자체적으로 제공한다.

 

대충 위와같이 디스크들을 RAID5로 묶어서 사용하게 된다.

 

???

 

그럼 서버를 위와같이 DB 내에 최소 RAID1로 만들어야한다.

그리고 이것도 위험하니 외부에 DB를 더 두어서 클러스터를 구성한다. 그렇다고 하더라도 클러스터 묶였지만 물리적 제약때문에 서로 통신할 수 있는건 아니다.

 

이를 해결하기위해서 쓰는게 Overlay Network이다.

 

그림을 보면 가상머신이 각각 만들어져 있다. DB간의 통신을 하기위해서 둘 사이에 VXLAN이라는 것을 만들어야한다. 그럼 Overlay Network가 만들어진다.

Overlay Network는 물리적으로 서로다른 지역에 있는 동일네트워크 주소간에 터널을 구성하고 해당 터널을 통해 사설 주소를 이용한 직접적인 통신이 가능하도록 해주는 기능이며 Overlay Network구성을 위해서는 반드시 터널링 기술이 필요하다.

이 터널링 기술은 대표적으로 "GRE tunnel", "VXLAN"을 이용할 수 있다. overlay network는 모든 클라우드 환경에 구성되어야 한다. 그래서 이걸 활용해 서버를 다른 DB로 그대로(ip 안바꾸고) 옮길 수도 있다.

 

특수 문자의 사용과 표준 입,출력의 변환

0 : 표준입력

1 : 표준출력

2 : 표준에러

 

주로 위의 번호를 사용하는 경우는

명령실행 2 > /dev/null

 

- `>` 덮이쓰기

```

date > out1

set -o noclobber

# set을 사용하면 예상치 못하게 미리 만들어진 파일을 덮어쓰는 경우를 방지

date >  out1   # 에러 발생

```

 

- `<` 표준 입력

명령 < 파일 이름

 

명령을 파일로부터 받겠다.

```

cat 0< stdin

sort <stdin

```

 

dat이라는 명령어가 없다. 그리고 2는 꺽쇠에 최대한 붙어야한다. 이건 dat에러를 /dev/null로 보내라는 의미이다. 에러커맨드를 띄우지 말라는 의미로 사용할 수 있다.

 

 

응용

```

echo << EOF >> a.txt

```

 

 

- 에일리어스

alias

unalias

 

- cron

시간에 기반한 잡 스케쥴러, 미리 지정해 둔 기간에 특정 동작, 업무가 가능하도록 자동화 시키는 것.

 

```

crontab -e

```

분, 시, 일, 월, 요일, 사용자, 명령어 순으로 숫자를 입력

```

* * * * * echo `date` "Hello All" >> /root/cron-test.txt | wall  # wall 넣어줘야 진짜로 온걸 실시간으로 볼 수 있음

00 01 1 * * root cp -r /home /backup

```

이때 `date`는 $(date)와 동일

매월 1일 1시 정각에 root의 권한으로 /home dir을 /backup에 복사해라

 

- ssh

???

ssh에서 원격지에 있는 서버에 명령을 실행하고 해당 명령의 결과를 로컬서버에서 확인할 수 있도록 하는 방법.

 

관리용서버

대충 위와같이 ssh를 통해 명령어 요청가능

 

이걸 쉘 스크립트에 쓴다면 문제가 패스워드를 매번 입력해주어야한다. 그래서 패스워드 접속이 아닌 키를 이용해서 접속하는 방법을 써야한다.

 

보면 .ssh 폴더 아래에 known_hosts가 보인다. 이건 내가 접속해보았던 호스트이다.

 

이제 lbdns의 pub 키를 NFS에 authorized_keys로 넣어주어야한다.

 

이걸 하기 위해서 scp 명령어를 쓰자

 

```

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

```

 

이젠 비밀번호도 안나온다.

 

그런데 위의 방법은 결국 한번은 미리 접속을 해야 하지만 만약 가상머신을 생성할 때 미리 pub 파일을 복사해서 authorized_keys로 붙여넣은 다음 생성된다면? 생성되는 모든 서버를 관리자가 원격에서 관리할 수 있게 된다.

또한 반복문과 같은 문법을 적용하여 여러 서버에 동시에 동일한 명령을 실행하는 것도 가능해질 것이다.

 

즉 해야하는 거

1. keypair 미리 만들고 pub은 복사해서 authorized_keys로 만들기

2. starter sh 사용하기

3. vm 복붙

 

for 변수(ip) <--- 반복할 내용(1.1.1.1 ~ 1.1.1.100)

do

  변수($ip)에게 명령 전달(yum update -y)

done

 

그런데 이걸또 섹션별로 나누어서 관리하는 것이다.

그게바로 ANSIBLE이다.

 

fail2ban

fail2ban 패키지를 이용하여 SSH 서버에 대한 추가적인 보안 설정 -> 최대 로그인 횟수 제한

 

login 공격하기 중

- 딕셔너리 어택(dictionary attack) : 텍스트 파ㅑ일을 미리 준비해서 패스워드가 될만한 것들을 다 집어넣고 하는건데

728x90