Development(Web, Server, Cloud)/22) LINUX - Cloud

Cloud 25일차 - gawk, 정규표현식, mysql, mariadb, 스위치, 라우터, IP, 서브넷, 서브넷팅, 서브넷마스크, CIDR, vlan

tonyhan18 2022. 2. 8. 17:42
728x90

 

이재원님의 이글루 : [명령어] sed 및 awk 사용법 (egloos.com)

 

이재원님의 이글루 : [명령어] sed 및 awk 사용법

 

slog2.egloos.com

이 글이 정말 필요한것만 잘 정리되어 있다.

 

 

gawk

 

gawk -> 정규식 표현 -> 특수문자 -> DB연결

gawk의 기본 형식

 

gawk option

1. 옵션

-F -> IFS를 의미한다. 각각의 데이터를 구분하는 구분자역활. gawk에서도 각각의 데이터는 공백, 탭, 줄바꿈을 기본으로 분류함

 

grep은 행으로 데이터를 분류

gawk는 열로 데이터를 분류

 

그래서 두개를 쓰면 X,Y 좌표형태로 데이터 분류가능해짐

이때 $0은 전체를 출력하는거고 $1부터는 잘라진 부분들의 번호이다.

 

-f -> file을 의미한다. 다음에 파일이름이 표시되고 파일내에는 프로그램으로 동작할 내용을 작성해 넣을 수 있다.

단독으로 gawk를 사용하면 반드시 맨 뒤에 입력할 내용이 들어와야한다.

 

그래서 gawk를 사용하는 전략은 grep으로 먼저 쭉 내려간다음 gawk로 열단위 데이터를 받아오자.

 

 

정규표현식

입력될 데이터에 대한 검증작업

입력된 데이터에서 특정 데이터에 대한 추출 작업등에 활용된다.

ex) 우리 회원중에 이메일 주소가 gmail인 회원?

특정 단어나 패턴등을 활용하여 데이터를 추출해 낼 수 있다.

 

예를 들어 위와같이 test라는 단어가 있으면 전체 데이터를 출력하라는 의미를 표현할 수 있다.

 

이걸 응용해서 데이터 검출이 가능해진다.

 

 

- 특수문자를 이용한 확장 정규 표현식

? : 물음표 앞에 문자가 없거나 있다면 한번 있다.

 

```

echo "bt" | gawk '/be?t/{print $0}'

```

와 같이 작성하면 e가 없거나 있다면 한번 있어야 한다. 그래서 검출할 수 있는게

```

bt

bet

beet -> 불가능

```

 

하면 위와같이 스크립트를 짜볼 수도 있을것이다.

 

그런데 지금은 한 `e`만 걸러내니 이걸 `a`도 걸러낼 수 있게 해보자

 

위와같이 작성해주면 a,e에 대해서 처리해준다. 하지만 baet는 처리해주지 않는다.

 

[ae]? -> ae가 없거나, a 또는 e가 한번만 나오는 것은 참

 

 

`+`는 앞에 있는 철자가 무조건 한번이상은 나와야 한다.

 

대충 위와같이 나와야한다.

 

{ } : 인터벌, 몇번 출력되도록 할 것인지를 지정해준다.

{1} : 앞에 있는 철자가 정확히 한번만 나와야한다.

{1,3} : 최소 1에서 최대 3까지는 출력

|는 or 연산을 할 수 있다.

 

 

() : 특정 단어 등을 묶어서 표현하고 싶은 경우

 

많이 쓰는것중 하나가

[A-Za-z0-9.]+ 으로 사용가능 이메일을 분리해낼수도 있다.

 

가상머신의 올바른 이름은 아래의 조건을 만족해야 한다.

소문자와 숫자를 이용하여 최소 5글자 최대 10글자까지 만들 수 있다.

위와같이 만들어주면 될거라고 생각한다.

 

예제) 사용자로부터 가상머신의 이름을 입력받고 잘못된 이름인 경우에는

잘못된 이름입니다. 다시 입력하세요 :

가상머신의 이름 : 

 

정상적인 경우에느 "설치를 진행합니다" 메시지 출력후 프로그램 종료

#!/bin/bash

while [ 1 ]
do
        echo -n "가상머신의 이름 : "
        read name
        sol=$(echo $name | gawk '/^[a-z0-9]{5,10}$/{print $0}')

        if [ -z $sol ]
        then #변수에 값이 없는 경우(잘못된 이름)
                echo "잘못된 이름입니다. 다시 입력하세요"
        else    # 변수에 값이 있는 경우(정상적인 이름)
                echo "설치를 진행합니다"
                # 설치 명렁어
                break
        fi
done

위와같이 작성해주면 오직 필요한 정보가 들어와야만 데이터를 처리해줄 수 있게 된다.

 

예제)

사용자로부터 VM의 이름, CPU 개수를 입력받아 설치를 진행한다.

단, CPU 개수는 해당 (진짜서버)호스트가 실제로 가지고 있는 범위에서 선택할 수 있어야 한다.

만약 진짜 PC의 CPU가 4개라면 VM은 1~4 사이에서 CPU를 선택할 수 있어야한다. 그 외 다른 숫자를 선택하면 "잘못된 선택입니다. 다시 시작합니다."

 

```

mpstat

```

 

#!/bin/bash

while [ 1 ]
do
        echo -n "가상머신의 이름 : "
        read name
        namesol=$(echo $name | gawk '/^[a-z0-9]{5,10}$/{print $0}')

        echo -n "CPU의 갯수 : "
        read cpus
        # 정상 CPU 개수 선택이라면 cpusol에 담긴다
        cpusol=$(echo $cpus | gawk '/^[1-4]{1}$/{print $0}')

        if [ -z $namesol ] || [ -z $cpusol ]
        then
                echo "잘못된 입력입니다"
        else
                echo "설치를 진행합니다"
                break
        fi
done

 

 

쉘과 DB 연결하기

쉘을 통해 입력 받은 정보를 DB에 저장하거나

쉘을 통해 DB의 정보를 확인하는 것이 가능하다.

 

```

yum -y install mariadb-server

systemctl status mariadb

systemctl restart mariadb

```

하면 마리아 DB가 설치된다.

 

이제는 CLI창이나 유저 요청으로 DB에서 데이터를 불러올 수 있어야한다.

 

그 다음 환경설정을 해주어야한다.

```

mysql_secure_installation

```

패스워드는 test123으로

Remove anonymous users : 익명 사용자 지우기

Disallow root login remotely : 다른 PC 접속 막기

Remove test database and access to it : test db없애기

 

```

mysql -u root -ptest123

```

하면 한방에 DB로 들어옴

 

 

```

show databases;

```

```

CREATE DATABASE school;

GRANT ALL PRIVILEGES ON school.* TO user1@'localhost' IDENTIFIED BY 'user1';

use school;

```

user1에게 school DB를 다룰 권한을 모두 부여

위의 명령어로 서버가 아닌 DB에서만 접속하게 만들 수도 있다.

 

 

```

CREATE DATABASE cloud;

exit;

```

 

```

mysql cloud -u user1 -puser1

mysql school -u user1 -puser1

```

하면 위와같이 cloud는 막히지만 school은 이용 가능해진다.

 

이제 DB를 만들고 행 단위로 데이터를 만들텐데 이때 행단위 데이터를 구분하는 것이 PK(Primary Key)이다.

 

학교 DB라면 학생 학번을 PK로 만들면 된다.

```

mysql -u root -ptest123;

use school;

MariaDB [school]> CREATE TABLE student (
    -> number int not null,
    -> name varchar(20),
    -> address varchar(20),
    -> primary key (number));

show tables

```

잘 만들어졌다.

 

```

desc student;

```

```

INSERT INTO student VALUES (1111, 'tonyhan', 'Mapo');

```

물론 PK가 동일하게 입력되면 이게 막힌다.

 

```

select * from student;

```

이제는 쉘에서 DB의 정보를 가져오게끔 만들어보자

 

실행하니 위와같이 나오는 것을 확인할 수 있다.

 

Quiz. 사용자로부터 학번을 입력받아 해당 학번에 매치하는 학생의 모든 개인 정보를 화면에 출력하라

 

네트워크

IP : Internet Protocol(인터네트워킹) -> 상호 통신시 사용하는 프로토콜, 표준프로토콜

 

IP : v4 vs v6 (둘은 직접통신 불가하다)

보내는 헤더에 v6로 변환할 수 있지만 데이터는 그렇게 못함

 

그래서 이걸 현재는 인터넷은 v4로 처리하고 v6 컴퓨터끼리는 터널링 기술로 통신하게끔 만드는 것이다.

 

하지만 v4와 v6가 직접 통신하는 거은 현재 불가능하다.

IP는 사람의 이름과 비슷한 역활을 한다.(MAC 주소는 사람의 신체와 같은 역활을 한다)

통신을 위해서는 물리적인 주소인 MAC 주소와 논리적인 주소(그때 그때마다 바꿀 수 있다)인 IP 주소가 필요하다.

 

IP도 네트워크 영역과 호스트 영역으로 구성된다.

네트워크와 호스트를 구분해 주는 역활은 서브넷 마스크가 담당한다.

실재회사에서는 16,24만쓴다.

 

Q. 우리회사는 211.183.3.0/24 라는 공인 주소를 구매했다. 이를 적절히 나누어 4개의 부서에서 동일하게 각각 20개의 IP 주소를 사용하고자 한다. 어떤 네트워크 주소를 사용해야 하는가?

 

N1: 211.183.3.0/27

N2: 211.183.3.32/27

N3: 211.183.3.64/27

N4: 211.183.3.96/27

 

서브넷팅으로 나누어주면 된다.

 

IP는 첫번째 옥텟에 따라 A,B,C,D,E 클래스로 구분한다.

A : 1 - 126

B : 128 - 191

C : 192 - 223

 

각 클래스 별로 default subnet mask가 달라진다.

A : 255.0.0.0

B : 255.255.0.0

C : 255.255.255.0

 

10.10.10.0/24

얘도 서브넷팅이 된것다. A 클래스를 아주 작게 자른형태이다.

 

192.168.1.0/24

얘는 서브넷팅 되지 않았다. C 클래스를 그대로 사용하기 때문이다.

 

192.168.1.0/27

얘는 서브넷팅 되었다.

 

- PC에 사용할 수 없는 주소들

1. 0.0.0.0 -> 알 수 없는 주소

2. 255.255.255.255 -> IPv4 전체에 대한 브로드캐스트 주소

3. 각 네트워크에서의 첫번쨰 주소(네트워크 주소)

4. 각 네트워크에서의 마지막 주소(브로드캐스트 주소)

5. lo 또는 loopback 주소는 각 디바이스에 있는 논리 인터페이스이며 테스트용으로 사용된다. PC에 할당 할 수 있는 주소가 아니다.(127.0.0.1 == localhost)

 

## 중간급 네트워크 아키텍처 설계

스위치 : 동이 네트워크 내에서 노드를 나누고 연결 (L2 장비 : frame[MAC]을 처리할 수 있다)

라우터 : 물리적으로 네트워크를 구분하고 연결 (L3 장비 : IP주소를 읽고 이를 처리할 수 있다. 다른 네트워크와 연결에 관여한다 - 이때 쓰는게 라우팅 테이블)

 

1개의 인터페이스 = 1 네트워크 = 1 브로드 캐스트 도메인

"브로드 캐스트 도메인" 브로드 캐스트 트래픽이 발생했을 때 퍼져 나가는 범위

 

결론은 위와같이 라우터가 네트워크를 나누고 브로드캐스트 범위는 동그라미 친곳까지이다. 다른곳으로 넘어갈 수가 없다.

 

이제 실습을 위해 두개의 주소대역을 사용해보자

우리 회사는 192.168.1.0/24 라는 네트워크를 사용할 계획인데, 이를 두개의 네트워크로 구분하여 사용하고자 한다. 그런데 왜 구지 네트워크를 또 나눌려고 할까? 그건 바로 브로드캐스트를 했을때 네트워크 컴퓨터가 너무 많아져서 시간이 오래걸리기 때문이다. 그러니 192.168.2.0/24와 같이 같은 서브넷 마스크의 다른 네트워크를 사용하지 않는 것이다.

 

그래서 네트워크를 같은 크기로 줄이는 서브넷팅을 하는게 보다 효율적인 방법이다.

 

그럼 클라우드에서도 이렇게 쓰는가?하면 안그런다. 왜냐면 귀찮으니까

그리고 서브넷팅도 2,4,8... 순으로만 나눌 수 있다. 왜냐하면 비트가 가지는 경우가 2가지 뿐이라서 그렇다.

 

그래서 네트워크 서브넷 마스크에서 오른쪽으로 1비트가 늘어날때마다 서브넷팅은 2의 제곱으로 생기게 된다.

192.168.1.0/24를 다음과 같이 나누자

N1 : 192.168.1.0/25 (1-126)

N2 : 192.168.1.128/25 (129-254)

 

이떄의 기본 게이트웨이는 다른 네트워크로 갈 수 있는 기기의 입력포트 즉 3번이 기본게이트웨이로 들어간다. 스위치는 받은 패킷을 가지고 브로드캐스트로 먼저 보내서 라우터가 패킷을 받게되는 것이다. 스위치는 어짜피 IP 통신을 못한다. 그래서 기본 게이트웨이 IP는 라우터에게 부여해야한다. 즉 3번에 IP를 부여해주자

 

N1 : 192.168.1.126 <- 라우터 인터페이스 주소, 기본 게이트웨이 주소

N2 : 192.168.1.254

 

Log Level 은 7부터 0까지이다. 여기에서는 5번으로 적혀있다. 0에 가까울수록 위급한 상황을 의미한다.

1은 즉시 수정해라(즉시 조치)

 

fa0/1 포트도 처리해주었다.

 

do show his

보면 이렇게 지정해왔다.

 

이제 PC들에 정보를 넣어주자

 

결과 이렇게 만들어주었다.

 

PC는 이렇게 접촉했던 컴퓨터들을 ARP TABLE 안에 넣어놓는다. 단 이건 동일 네트워크까지만 범위가 확장된다.

그래서 다른 네트워크로 가기 위해서는 먼저 Default Gateway의 맥주소를 찾아오는 작업부터 수행해주어야 한다. 이를 위해서 먼저 ARP가 발생한다.

 

ARP(Address Resolution Protocol)

 

???

ARP 구성은 위와같다. ARP 내에는 Default Gateway가 적히고 그 IP에 맞는 MAC 주소를 달라고 한다.

MAC주소 안에는 자신의 MAC 주소가 적혀있다.

스위치에는 MAC Table이 작성되어 port와 MAC 주소가 적혀있다.

그래서 받은 ARP를 가지고 먼저 들어온 포트와 MAC주소를 테이블에 작성하고 브로드캐스트한다.

브로드캐스트해서 받은 PC는 IP를 해석하는데 자신의 IP가 아니기 때문에 패킷을 버리고 라우터는 자신의 IP가 맞기 때문에 자신의 정보를 담은 패킷을 던진다.

 

그리고 나서 1.1 PC는 다시금 목적지 서버주소(1.130)을 담아서 던진다. 그리고 dst MAC 주소는 라우터의 주소가 된다.

그럼 라우터는 다시금 MAC 보고 IP를 보고나서 IP의 네트워크에 맞는 포트번호로 프레임을 던진다.

 

물론 이 프레임을 처음받은 스위치도 MAC주소를 모르니 다시금 ARP를 하고 어찌저찌해서 패킷이 보내진다. 이렇다보니 라우터는 MAC Table 말고도 ARP Table을 가지고 있을 수 밖에 없다.

 

하면 결국에는 패킷이 원하는 IP로 도착하게 된다.

 

arp table을 확인해보니 위와같이 DG의 맥주소를 확인할 수 있다.

 

스위치의 MAC Address Table을 확인해보아도 위와같이 나오는 것을 확인할 수 있다.

 

라우터를 확인해보면 위와같이 arp 뿐만 아니라 네트워크별로 라우트 테이블을 가지고 있다.

 

라우터는 내부에 유입된 패킷의 목적지 IP주소를 자신의 라우팅 테이블에 적용하여 해당 목적지 IP 주소가 어느 경로로 가야하는지를 결정한다. 이후 해당 경로로 패킷을 포워딩한다.

 

라우트가 하는 일

1. Path Selection(경로선택 based on Routing Table)

2. Packet Forwarding

 

이제 실제 사례가 될 수 있는 것을 봐보자. 어떤 회사의 네트워크가 위와같이 구성되어 있었다고 해보자. 만약 위와같이 형태로 네트워크를 구성했다면 네트워크는 딱 1개만 있는 것이다. 그렇다보니 ARP 를 던지면 전체에 물어보는 문제가 생긴다.

 

라우터는 1개의 인터페이스 = 1개의 네트워크

즉, 물리적으로 네트워크를 구분한다.

 

스위치는 인터페이스 별로 네트워크를 구분할 수 없다.

하지만 스위치는 논리적으로 네트워크를 구분할 수 있다. 이때 사용하는 기술이 바로 VLAN(Virtual Local Area Network)로 사실상 라우터가 하나뿐인데 네트워크를 나누고 싶을때 사용한다고 보면 된다.

 

스위치는 이 VLAN만 잘 알고 있으면 된다.

 

아무리 물리적으로 떨어져 있어도 논리적으로 묶을 수 있는게 VLAN이다.

 

예를 들어 한대의 스위치가 있고 4대의 컴퓨터가 연결되어 있어서 하나의 네트워크로 연결되어 있다고 하자. 그럼 영업팀의 문서를 기술팀이 가져가는 것은 좋지 않기에 스위치를 늘리어 사용할 수 있다. 하지만 이게 계속 늘어나면 별로이기 떄문에 스위치내에서 가상의 스위치를 만드는 것이다. 이게 바로 VLAN이다. 그리고 영업팀은 하나의 VLAN에 기술팀은 다른 VLAN에 연결해준다. 그럼 VLAN은 번호만 다르게 해주면된다.

 

그럼 영업팀과 기술팀간의 통신은 되지 않을 것이다. 이렇게 구분하는 것을 VLAN이라고 부른다.

 

해서 IP를 위와같이 지정해주고 환경도 구성해주자.

보면 스위치 입장에서는 네트워크가 1개 뿐이다. 그래서 VLAN으로 네트워크를 구분하게끔 만들어주자.

 

스위치는 VLAN 번호 별로 별개의 네트워크로 동작하게 되는데 기본적으로 스위치에는 VLAN 1이 존재하고 모든 인터페이스는 기본적으로 VLAN 1에 속하게 된다. 위의 그림도 VLAN 1에 모두 속해있기 때문에 사실상 같은 네트워크이다. 그래서 각각을 VLAN으로 만들어서 사용해야한다.

 

그래서 위와같이 만들어서 사용할 수 있게 해보자.

 

먼저 스위치0번을 위와같이 설정해놓자

 

 

스위치 0,1 번 모두 VLAN을 만들어놓자.

 

첫번째 스위치는 인터페이스에 들어가서 VLAN을 바꾸는 것이다.

 

하고나니 색깔이 바뀌었다. 0, 1번 스위치의 vlan 10을 모두 fa0/1로 vlan 20을 fa0/2로 모두 바꾸어놓자

 

하고나니 vlan끼리 연결해주는 인터페이스가 또 필요해졌다. 그런데 지금 물리적으로 한개만 연결되어 있으니 이걸 또 나누어주어야 한다.

 

그래서 지나가는 여러 vlan이 지나가는 곳을 Trunk port로 한개만 지나가는 곳을 Access port로 지정해주어야한다.

 

????????

 

결론은 위의 순서로 스위치들에게 입력해주자.

 

그러면 최종적으로 같은 네트워크랑은 통신하는데 바로 옆에 있는 컴퓨터와는 통신이 안된다.

 

결론은 위와같이 VLAN은 논리적인 네트워크를 만들 수 있다.

그래서 위와같이 수십개의 네트워크로 연결했어야 했던것을 Trunk port의 encapsulation 방법으로 처리할 수 있어야한다.

 

방법 2가지

ISL by cisco <- 잘안씀

dot1q by standard

 

결국 프레임에 Tag라는 부분이 추가되어 처리된다.

 

그러면 멀리떨어진 같은 네트워크랑 통신이 가능해진다.

 

이걸 실재 kvm에서 ovs 를 이용해 vlan을 구성하는 것을 확인해보자.

 

결국 위와같이 vlan을 통해서 가상머신간의 통신이 가능해진다.

 

 

OPENVSWICH – VLANs, Trunks, L3 VLAN interface, InterVLAN Routing – Configuration And Testing | Brezular's Blog

 

OPENVSWICH – VLANs, Trunks, L3 VLAN interface, InterVLAN Routing – Configuration And Testing | Brezular's Blog

In a previous tutorial we showed how to install Openvswitch on Qemu image with Microcore Linux. At the end of tutorial we created Openvswitch extension and submitted it to Microcore public repository. Assuming that Openvswitch is configured and functional

brezular.com

위 사이트를 가보면 위와같이 부분이 있다. 이게바로 vlan을 브릿지에 있는 이더넷에 연결해준것이다.

 

그런데 포트들이 인터넷으로 나갈 수 있는 구멍이 따로 필요하다.

 

그래서 아래쪽에 가보면 위와같이 트렁크를 eth5에 연결해준것을 확인할 수 있다. 이런식으로 vlan을 처리해준다.

728x90