tonyhan18 2022. 2. 10. 12:26
728x90
yum -y install libvirt qemu-kvm virt-install virt-manager virt-viewer

먼저 위의 패키지들을 설치해주고 시작하자

 

```

systemctl start libvirtd ; systemctl enable libvirtd

vi /etc/libvirt/qemu.conf

```

442, 446 앞의 주석을 제거해주어야 libvirt 사용이 가능해진다.

 

[실습 시나리오]

이름 : "" <- 15개 글자

CPU : "" <- [1~4]{1}

RAM : "" <- 설치시에는 MB 단위로 입력해야 하기 떄문에 1 * 1024 -> 설치옵션에 적용해야한다.

네트워크 : 기본옵션으로 제공

HOST : 현재 서버 이름

가상머신's ip : 설치후 자동으로(DHCP) 설정된다.(ip) -> grep ; gawk 이용하여 ip만 골라준다.

 

virsh list --all

virsh domifaddr 가상머신이름 -> ip 확인 가능

 

```

INSERT INTO instance VALUES(

'centos', 'kvmsrv1', 1, 1024, '192.168.111.111');

```

 

#!/bin/bash

#### var ####
vmname=''
vmhost=$(hostname)
vmcpu=''
vmram=$(( ram * 1024 ))
ram=''
vmip=''

DB_NAME='cloud'
DB_USER='user1'
DB_PASS='user1'
DB_HOST='localhost'

#### main ####

#### send to DB ####
echo
echo -e "\t\t[ 인스턴스 생성 프로그램 ]"
echo

while [ 1 ]
do
        echo -en "\t생성할 가상머신의 이름 : "
        read vmname
        echo
        ## check for duplicate ##
        namecheck=$(mysql $DB_NAME -u $DB_USER -p$DB_PASS 
        -e "select vmname from instance where vmname='${vmname}'")
        if [ -z "$namecheck" ]
        then
                break
        fi
        echo "duplicate name is exist"
done

echo -en "\tCPU 개수 입력(1~4 사이 선택) : "
read vmcpu
echo
echo -en "\tRAM 사이즈 입력(1~4 사이 선택;단위 GB) : "
read ram
vmram=$(( ram * 1024 ))
echo

#### install vm ####
# make
echo
echo -e "\t가상머신 생성을 시작합니다"
cp CentOS7pwd.qcow2 ${vmname}.qcow2
echo ">> $? <<"

virt-install --name $vmname --vcpus $vmcpu --ram $vmram --network network:default 
--disk ${vmname}.qcow2 --os-type linux --os-variant rhel7 --import --noautoconsole > /dev/null
echo ">> $? <<"
if [ $? == 0 ]
then
        echo -e ">>\t설치가 완료되었습니다\t<<"
else
        exit 0
fi

# send to DB
echo -e ">>\tIP정보를 확인했습니다, DB로 정보를 전송합니다\t<<"
while [ 1 ]
do
        vmip=$(virsh domifaddr $vmname | grep ipv4 | gawk '{print $4}' | gawk -F/ '{print $1}')
        #echo "ipaddr : $vmip"
        if [ -z "$vmip" ]
        then
                sleep 3
                continue
        else
                break
        fi
done

ans=$(mysql ${DB_NAME} -u ${DB_USER} -p${DB_PASS} -h ${DB_HOST} 
-e "INSERT INTO instance VALUES('${vmname}', '${vmhost}', ${vmcpu}, ${vmram}, '${vmip}')")

echo $ans

mysql cloud -u user1 -puser1 -e "select * from instance"

중간에 이름 체크하는 부분이 -z "$vmname" 으로 되어 있는 것을 확인할 수 있다. 이건 그냥 한게 아니다. DB에서 데이터를 받아오면 그게 테이블 형태로 오다보니 행과 값이 함께 들어온다. 그래서 에러가 위와같이 두개이상의 인자가 들어온다는 에러가 뜬다. 이걸 해결하기 위해서는 ""를 감싸준 것이다. 조건문 변수를 쓸때 이렇게 하는 게 좋아보인다.

 

이게 힘들다면

[[ -z $vmname ]] 을 써도 되기는 한다.

 

$(( )) 로 묶여야 내부의 변수는 $없이 쓰고 동시에 변수로 사용할 수 있어짐

 

또 신기한점이 $?는 이전 명령의 수행결과를 받아온다. 다른말로 수행결과를 받기 전까지 프로그램이 잠시 멈춘다.

 

 

command line - What does 2>/dev/null mean? - Ask Ubuntu

 

What does 2>/dev/null mean?

I would like a brief explanation of the following command line: grep -i 'abc' content 2>/dev/null

askubuntu.com

 

> /dev/null  하는 거 의미는 위에 링크를 따라가서 보자

 

```

virsh list --all

virsh domifaddr 가상머신이름 -> ip 확인 가능

virsh net-destroy default

virsh net-start default

```

 

리눅스 서버를 다루는 기술: virsh로 가상 시스템 관리하기 (thebook.io)

 

리눅스 서버를 다루는 기술: virsh로 가상 시스템 관리하기

 

thebook.io

 

 

virsh domifaddr tony | gawk -F'[ /]' '{print $21}'

이거 한다고 gawk 뒤지고 있을바에는 그냥 아래와 같이 작성해주자

 

virsh domifaddr tony | grep ipv4 | gawk '{print $4}' | gawk -F/ '{print $1}'

 

mysql을 bash에서 쓸때는 큰 따옴표로 감싸줘야함. 사실 이게 내부에 작은 따옴표 쓴다면 써주는게 좋은듯

 

결과를 확인하자

 

 

네트워크

- vlan

- static route

- Access Control List (CLI 를 이용하여 방화벽을 구성할 수 있다.) -> AWS(SG, ACL)

1. standart(표준) -> 패킷의 출발지와 목적지만 보고 필터링

2. extended(확장) -> L3, L4 부분을 모두 살펴보고 패킷을 필터링

 

Router

1 interface = 1 network = 1 broadcast domain

(fa0/0, fa0/1.10[서브인터페이스])

 

* broadcast domain

 

unicast : 1:1

multicast : 1:특정다수

- 기본적으로는 broadcast 와 통신방법은 동일하다.

- 데이터 송수신을 위해서는 멀티캐스트용 별도의 IP 주소를 이용해야하고

사용자는 해당 주소에서 전송되는 데이터를 해석하기 위한 전용 애플리케이션 또는 소프트웨어를 사용

- 화상회의에 사용된다.

- 라우팅 프로토콜

  ex) OSPF : 224.0.0.5, 224.0.0.6을 사용한다고 하자. 이 방법을 이용하게 되면 내가 지정한 특정 다수와 소통가능. 기본적인 방법은 브로드캐스트와 동일하다.

  ex) IGRP :  224.0.0.10

  ex) RIP :  224.0.0.9

 

broadcast : 1:모두

 

스위치는 물리적으로 네트워크를 구분할 수 없다.

1 vlan = 1 network = 1 broadcast domain

 

데이터센터가보면 위와같이 구성되어 있다. Active Standby로 나누어서

????

 

스위치(물리/가상)의 포트는 기능적으로 2가지중 하나의 역활을 수행할 수 있다.

1. access port : 1개의 포트에 1개의 vlan 통신만 가능한 포트

                     일반적으로 PC, 서버, 프린터와 같은 end-device에 적용

2. trunk port : 1개의 포트에 모든 vlan 통신이 가능하도록 할 수 있는 포트

                     스위치간 연결, 스위치---라우터 간 연결에 사용된다

 

 

대충 위와같이 만들었을때 서버는 외부 사용자의 access를 받지 않게끔 브로드캐스트가 안되게 만들어보자

 

대충 위와같은 상황이다.

3개의 네트워크가 있는 상태이다.

 

같은 네트워크 = 같은 브로드캐스트 네트워크이다.

이 상황에서 vlan으로 네트워크를 나누어서 서버에 내부 컴퓨터가 접속하는 것을 막자. 그렇다고 해서 외부 컴퓨터가 L3 패킷을 갑자기 처리해 서버쪽의 같은 vlan으로 갈 수 있는건 아니다.

 

실습

R1(HQ)----R2(BR_BUSAN)

둘 사이의 연결은 192.168.12.0/24 네트워크를 사용할 계획이다. 단, /24는 범위가 너무 커서 IP낭비를 최소화 할 수 있는 주소로 서브넷팅하여 사용할 계획이다.

서브넷팅은 192.168.12.0/30 255.255.255.252를 사용해서 네트워크를 나누어 사용해보자

 

R1

 |

두 개의 네트워크가 필요. (VLAN10, VLAN90)

192.168.10.0/24 -> 일반 사용자들 -> vlan이름 : PC

192.168.90.0/24 -> 회사 내부 서버들 -> vlan 이름 : Server

 

R2

 |

한 개의 네트워크만 사용할 계획이라 별도의 vlan 설정은 필요하지 않다.

192.168.20.0/24

* 게이트웨이는 각 네트워크의 첫번째 주소를 사용한다.

 

라우터

``` 

?  -> 현재 위치에서 실행할 수 있는 명령어들을 출력해줌

e? -> e로 시작하는 명령어들

en? -> enable만 뜬다. 그래서 en만 입력하면 enable이 입력된걸로 취급함

```

user mode -> exec privilege 모드(user mode의 기능을 포함하며 추가적으로 저장, 삭제가 가능한 곳)

```

show ip int br

```

ip, interface 정보를 짧게 보여달라

 

                                                              [물리적 상태]              [통신 상태:line protocol]

FastEthernet0/0    unassigned    YES    unset    administratively down    down

                                                              no sh로 해결

                                                                    up                         up

                                                                    up                        down  # 상대방이 down

                                                                  down                      down  # 물리상태에 오류

                                                                  down                        up  # 이런 경우는 엇음

 

```

Router# configure terminal (config t) (conf t)

Router(config)#  <-- global configuration mode (컴피그모드)

```

=> 시스템 전체에 영향을 미치는 명령어, hostname

=> 라우팅 프로토콜, NAT, ACL

 

```

Router(config)# int fa0/0

Router(config-if)#  <-- 인터페이스 모드

```

프리빌리지모드(#)가 아닌 곳에서 프리빌리지모드에서 실행할 수 있는 명령어를 실행하고자 한다면? "do"

 

 

라우터

```

int fa0/0

ip add 192.168.12.1 255.255.255.252

no sh

```

 

```

int fa0/0

ip add 192.168.12.2 255.255.255.252

no sh

```

 

스위치

```

en

conf t

vlan 10

name PC

vlan 90

name SERVER

 

int fa0/1

sw mode access

sw access vlan 10

int fa0/2

sw mode access

sw access vlan 90

 

int fa0/24

sw trunk encap  dot1q#tag를 붙인다

 

```

 

라우터0

```

en

conf t

int fa0/1

no sh

 

int fa0/1.10

encap dot1q 10

ip add 192.168.10.1 255.255.255.0

 

int fa0/1.92

encap dot1q 90 ip add 192.168.90.1 255.255.255.0

```

 

라우터1

```

en

conf t

int fa0/1

ip add 192.168.20.1 255.255.255.0

no sh

```

 

 

PC0

```

192.168.10.100

255.255.255.0

192.168.10.1

```

 

SERVER0

```

192.168.90.100

255.255.255.0

192.168.90.1

```

 

PC1

```

192.168.20.100

255.255.255.0

192.168.20.1

```

 

알지 못하는 네트워크 정보를 라우터에 install 하는 방법은

1. static -> 관리자가 직접 입력해야 한다

2. dynamic -> 라우터간 라우팅 프로토콜을 이용항 동적으로 네트워크 ????

 

라우터1

- 타 네트워크 접근을 위한 라우팅 설정

```

ip route 192.168.20.0 255.255.255.0 192.168.12.2

```

 

그런데 우리가 다른 네트워크로 가겠다고 하루종일 위의 것을 하루종일 입력할 수는 없다...

그래서 ip route 192.168.0.0 255.255.0.0 192.168.12.1로 바꾸어버리자

ip route 0.0.0.0 0.0.0.0 192.168.12.1 -> 모든 IPv4 주소

 

edge network (통신에서 가장 마지막에 위치한 라우터)는 알지못하는 모든 통신을 바로 앞 라우터로만 전송하면되는데

이때 사용하는 IPv4 주소 전체인 any(0.0.0.0 0.0.0.0)을 "default route" 라 부른다.

 

이와같이 라우터들도 자신이 모르는 네트워크와 통신할때는 default route를 사용한다.

 

하지만 이러한 설정도 맨끝에 있는 얘만 해주어야 한다. 가운데에 있는 얘는 직접 입력해주어야 과도한 트래픽 방지를 할 수 있다.

 

암튼 부산과 같이 HQ가 아니면 위와같이 처리해버리자

 

 

우리가 하는 모든 작업은 VPC내에서 이루어진다. 이러한 VPC는 당연히 사설 IP를 사용한다.

 

대충 위와같이 CIDR이 타인도 동일하게 들어가 있다.

 

???? ACL/SG으로 subnet들을 다 연결해놓을 수 있다.

 

결국에는 라우팅 테이블이라는 sw 라우터가 있어서 얘가 인터넷 게이트웨이랑 연결되어서 나가게 된다.

 

그래서 우리가 만드는 아키텍처에서 항상 D.R(Default Router)가 있어야만 한다.

그래서 나중에는 위와같이 S* 형태의 ISP 주소가 작성될 것이다.

 

만약 위와같은 라우팅 테이블이 있는 경우 패킷의 목적지 주소가 192.168.20.100이라면 두개의 네트워크에 매칭이 된다.

이러한 경우에는 상세한 주소를 알려주는 곳으로 전송된다. 그래서 192.168.20.0/24를 먼저 찾아간다.

이것을 "longest match rules"이라 부른다.

 

위 그림을 보면 왼쪽 네트워크는 대규모 네트워크 WAN이다. 얘네들 입장에서는 오른쪽 네트워크는 그냥 edge router이다.

 

A 라우터 입장에서는 B랑 A 왼쪽 넽워크까지 달 아야한다. 그래서 상세 정보를 입력해야만 한다. 하지만 B 라우터 입장에서는 갈 곳이 많아서 전체네트워크를 적어줘야한다. 그래서 B 라우터는 그냥 모르는건 172.16.2.2(A)로 가라고 하면 된다.

 

그래서 위쪽에서도 작성된 0.0.0.0 이 Default Route라고 부른다.

 

 

이제 전 구간 통신이 가능한 상태이다.

이제 우리는 특정 트래픽을 필터링 해 보자!!!(using ACL)

 

ACL(Access Control List)는 번호나 이름을 이용하여 정책을 만들고 만들어진 정책에 의해 패킷을 필터링 하거나 분류하기 위한 기능을 제공한다.

 

라우터에 들어오게 되면 L2는 제끼고 ACL로 들어가서 ip를 확인한다. ip를 가지고 routing table에서 보낼 포트를 선택해서 전달한다. 이런걸 하는게 라우터이다.

 

유입된 패킷의 L3, L4 또는 데이터의 내용을 확인하고 deny 또는 permit 시킨다. deny된 패킷은 bit-bucket에 버려진다. permit 된 패킷은 라우팅 테이블의 경로를 확인하고 선택된 경로로 포워딩된다.

 

ACL은 패킷의 어느 부분을 살펴보고 permit/deny 하느냐에 따라 standard와 extended로 구분된다.

standard는 유입된 패킷의 "출발지IP"만을 확인한다.

standard는 all or nothing이다.

 

구성예) [번호가 1~99 라면 standard ACL]

- access-list 10 permit 192.168.1.0 0.0.0.255

                                           [wild card bit/mask]

wild card (bit)mask에서 0, 1 차이

0 -> look at this bit (위와 동일하게 써라)

1 -> don't care bit (위와 동일해도 되고 동일하지 않아도 된다)

그래서 위와같이 영역을 나누어서 처리하기 위해서 wild card mask를 사용하는 것이다.

그런데 aws에서는 이걸 wild card를 쓰지 않고 그냥 서브넷 마스크를 쓴다.

 

대신 wild card를 사용하면 ip를 걸러낼 수 있다.

Q. 1.1.1.0/24 범위에 있는 IP 주소중 마지막 주소가 홀수인 주소만 골라라

ip : 1.1.1.1

mask : 0.0.0.254

 

물론 이딴걸 쓸 이유가 없다. 그래서 걍 서브넷 마스크 쓴다고 생각하자.

 

- access-list 10 deny 1.1.1.1 0.0.0.0

얘는 걍 1.1.1.1을 차단한거다

 

- access-list 10 deny 0.0.0.0 255.255.255.255

얘는 전체다 차단

 

중요한건 ACL의 규칙이다.

1. top-down 방식으로 적용된다.

예) 

예를 들어 위와같이 처리하는 것이 있을 수 있다. 답은 2번이다.

먼저 1.1.1.1을 차단해야 넘어가지 않는다. permit이 위에 있으면 1.1.1.1은 첫번째 규칙보고 바로 넘어가기 떄문이다.

 

2. 

728x90