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

클라우드 32일차

by tonyhan18 2022. 2. 16.
728x90

Quiz access-list 1 permit any를 삭제하고

 

NAT는 주소를 바꾸는 것 자체를 의미한다.

여러 공인 주소를 이용하여 인터넷 사용이 가능하도록 하는 기술(1개의 사설주소가 1개의 공인 주소로 변경됨)

 

정적 NAT

특정 사설 주소는 "항상" 특정 공인 주소로만 변경됨.

10.1.1.100 <=> 209.10.5.100

장점) 외부로 부터 서비스 접속시 고정된 공인 주소를 제공해야 하는 서버에 적함

단점) 다수의 서버 또는 PC가 정적 NAT를 필요로 한다면 사설 주소 개수만큼 많은 공인 주소가 있어야 함

 

한 개의 공인 주소를 이용하여 인터넷 사용이 가능하도록하는 기술(여러개의 사설주소가 1개의 공인 주소를 공유)

 

동적 NAT

특정 사설 주소가 미리 지정된 공인 주소를 사용하는 것이 아니라 공인 주소가 담긴 pool에게 사용가능한 공인 주소를 요청하면 NAT는 그때그떄마다 사용할 수 있는 공인 주소를 제공한다.

앞에 나온 static과의 차이점은 NAT 테이블이 만들어져서 IP가 매핑되는 시기가 다르다.

정적 방법은 항상 지정된 사설 주소가 지정된 공인 주소로 변경되므로 관리자가 해당 매핑을 입력한 순간 테이블이 작성된다. (작성된 매핑값을 삭제하기 전까지 지워지지 않는다)

하지만 동적 NAT는 사설 주소가 어떠한 공인주소로 변경될지 알 수 없으므로 외부와의 통신을 시동하는 시점에서 NAT 기능을 갖춘 라우터 또는 방화벽이 어떠한 주소로 변경했는지를 그때 작성한다. (나갈때 테이블이 만들어지고 들어올때 테이블을 지우고 들어온다)

 

고정된 주소를 필요로 하지 않는 PC와 같은 장비에게 적절한 방법이 될 것이다.

 

* aws에서 인스턴스를 생성하면 인스턴스 자체는 사설주소를 할당받는다. 인터넷 사용을 위해 공인주소가 제공되는데 이 공인주소는 재부팅시에는 변경되지 않지만

중지->실행 하면 다른 공인주소로 변경된다.(Dynamic NAT) 만약 서버로 활용하기 위해 고정된 공인주소가 필요하다면 이 방법은 적절하지 않다. 이때 elastic IP 서비스를 이용하면 고정된 공인주소를 사용할 수 있지만 요금발생.

 

만약 공인주소가 1개인 상황에서 NAT를 적용하게 된다면? 최초 인터넷 사용자만 해당 공인주소를 사용하게 되므로 다수의 사용자가 인터넷을 사용하는 것은 불가하다. 이 경우 다수의 사용자가 인터넷 사용이 가능하도록 해주는 기술이 PAT이다. PAT는 공인주소와 포트번호를 변경하여 사설 주소 하나하나를 별도로 취급할 수 있게 해준다.

이때 내부 포트번호는 중복될 수 있는데 나갈때는 PAT로 변환되어 나가야한다.

 

대충 위와같이 포트번호가 있다. 이건 동적 PAT이다.

정적 PAT는 관리자가 명령어 또는 스크립트로 작성해서 넣어야한다.

 

정적 PAT

공인주소의 특정 포트번호와 사설주소의 특정 포트번호를 ㅈ벙적으로 매핑하는 것.

 

 

---

 

실습 1.

192.168.1.0/24, 192.168.2.0/24 사용자만 인터넷 접속이 가능하다

단 우리회사는 공인 주소가 1개 이다.

 

Dynamic PAT

 

HQ 라우터를 가서 다음을 입력하자

```

do show run | in ip nat

inside source list 1 int fa0/0 overload

access-list 10 permit 192.168.1.0 0.0.0.255

access-list 10 permit 192.168.2.0 0.0.0.255

해당 ip들은 분류해서 이 ???

 

ip nat inside source list 10 int fa0/0 overload

        사설주소                공인주소 공유방식(PAT의미)

```

 

Quiz2. 우리회사는 1개의 공인주소를 사용하고 있지만 이 주소를 활용하여 외붕 웹서비스를 제공하고자 한다. 실제 서비스를 제공하는 서버는 192.168.1.100의 80번 포트이고 외부에서 접속하는 사용자는 http://[HQ의 fa0/0의 IP] 만을 입력하면 웹서버로 접속 가능해야 한다.

 

예를들어 fa0/0의 주소가 10.5.1.100이라면?

(외부)http:://10.5.1.100 ---> (NAT) 10.5.1.100:80 ---> (리눅스) 192.168.1.100:80

 

 

HQ 라우터에 대해서

보면 위와같은 상태에서

정적으로 nat를 연결해보자

 

대충 위와같이 계속 ?를 써서 무엇을 넣어야할지 실무에서도 확인해봐야할 것이다.

```

ip nat inside source static tcp 192.168.1.100 80 int fa0/0 80

ip nat inside source static tcp 192.168.1.100 22 int fa0/0 20022

```

 

그러면

http://10.10.54.171로 접속시 웹페이지가 나온다.

????

 

quiz 위의 예를 참고하여 외부에 있는 사용자가 fa0/0의 20022로 ssh 연결을 시도하면 내부 리눅스로 ssh 연결이 되어야 한다.

 

시나리오 : 이제 우리회사는 공인주소를 별도로 구매함. 공인 IP 매핑해주기

```

rce static tcp 192.168.1.100 22 interface FastEthernet

rce static tcp 192.168.1.100 80 interface FastEthernet

```

 

```

int fa0/0

ip add 192.168.8.3 255.255.255.0

do show run | in ip route

 

no ip route 0.0.0.0 0.0.0.0 10.0.0.1

ip route 0.0.0.0 0.0.0.0 192.168.8.2

```

 

서버에는 고정된 공인 ip가 필요하다.

Quiz.

static NAT :

내부에 있는 웹서버인 192.168.1.100 은 공인주소 192.168.8.100과 1:1로 정적 매핑된다.

 

먼저 HQ로 가자

```

ip nat inside so static 192.168.1.100 192.168.8.100

```

dynamic NAT(aws에서 인스턴스를 처음 만들때 사용하는 방법)

 

사설주소는 ACL로, 공인주소는 pool로 집합을 만든다.

이후 두 집합을 연결(매핑) 하면 된다.

 

Quiz. 192.168.2.0/24 사용자들은 공인주소 ->ACL

192.168.8.201~192.168.8.230 까지만 사용하여 인터넷을 사용한다. -> Pool

```

access-l;ist 2 permit 192.168.2.0 0.0.0.255  # 사설주소 정의

ip nat pool LAN2 192.168.8.201 192.168.8.230 prefix-length 24  # 공인주소 정의

ip nat inside so list 2 pool LAN2 # 사설주소와 공인주소 매핑하기

do show ip nat translation  # 매핑된 정보 확인가능

```

정적 매핑과 동적 매핑 모두 확인가능하다

????

 

```

do clear ip nat tr *  # 변환 정보 모두 지워달라

```

이렇게 하니 정적 매핑만 보인다.

???

.

새로운 GNS 를 열자.

 

 

16개의 스위치 포트이다. 1/0 - 1/15 까지 사용 가능하다. 레오파드는 2개의 Fast Ethernet이 존재한다.

 

포트 구성을 위와같이 해주자

 

스위치의 왼쪽은 vlan11(서버)이고 오른쪽은 vlan12(PC)이다

 

이렇게 해놓았다면 R1은 서브인터페이스가 필요하다.

 

이제 vlan을 만들러가자

스위치에서

```

vlan dat  #vlan database

vlan 11 name LINUX

vlan 12 name WINDOWPC

exit

 

conf t

int fa1/11

sw mode access

sw access vlan 11

int fa1/12

sw mode access

sw access vlan 12

int fa1/10

sw mode trunk  # 이렇게 해놓고 dot1q안해도 된다. 왜냐면 default 가 dot1q이기 때문

do wr

```

 

라우터로

```

conf t

ip add dhcp

no sh

```

 

이제 라우터에 서브 인터페이스를 만들어 주어서 vlan 별로 받도록 해주어야 한다.

```

int fa0/1

no sh

int fa0/1.11

encap dot1q 11

ip add 192.168.1.2 255.255.255.0

int fa0/1.12

encap dot1q 12

ip add 192.168.2.2 255.255.255.0

```

 

옆에 있는 리눅스에 잘 접속되는 것을 확인할 수 있다.

 

[실습 과제]

우리회사는 R1의 fa0/0에 할당된 공인주소 1개를 이용하여 내부 네트워크가 외부와 연결되도록 설정하고자 한다.

1. 내부의 모든 사설 주소는 fa0/0 의 공인주소 한 개를 이용하여 모두다 인터넷으로 접속 가능해야 한다. 이를 위해 동적 PAT를 구성하라

 

사설 주소 : ㅁ

```

access-list 1 permit any

#access-list 10 permit 192.168.1.0 0.0.0.255

#access-list 10 permit 192.168.2.0 0.0.0.255

ip nat inside source list 10 int fa0/0 overload

 

int fa0/0

ip nat outside

 

int fa0/1.11

ip nat inside

int fa0/1.12

ip nat inside

```

 

Quiz

내부에 있는 192.168.1.100은 현재 웹 서버로 동작중이다.

fa0/0 의 80번 포트로 접속하면 리눅스 웹서버로 웹 접속이 가능해야 한다.

 

이를 내부에 있는 윈도우에서 옆사람 리눅스서버로 웹접속을 해보자

 

```

ip nat inside so static tcp 192.168.1.100 80 int fa0/0 80

 

---

 

 

라이브러리 만들기

- 클래스, 함수의 모음 파일 만들기

- 이를 모듈이라고도 부름

 

#!/bin/bash

addnum() {
        if [ $# -ne 2 ]
        then
                return
        fi
        echo $[ $1 + $2 ]
}

mulnum() {
        if [ $# -ne 2 ]
        then
                return
        fi
        echo $[ $1 * $2 ]
}

divnum() {
        if [ $# -ne 2 ] || [ $2 -eq 0 ]
        then
                return
        fi
        echo $[ $1 / $2 ]
}

mylib이라는 파일을 만들어서 위와같이 입력해주자

 

보면 알겠지만 평범함 함수랑은 형태가 조금 다르다

 

#!/bin/bash

. ./mylib

value1=10
value2=5

result1=$(addnum $value1 $value2)
result2=$(mulnum $value1 $value2)
result3=$(divnum $value1 $value2)

echo "+ : $result1"
echo "* : $result2"
echo "/ : $result3"

 

라이브러리를 import 하기 위해서

`. ./mylib` 해주면 된다.

 

메뉴만들기

#!/bin/bash

menu() {
        clear
        echo
        echo -e "\t\t관리자 메뉴 \n"
        echo -e "\t1. 디스크 공간 확인하기"
        echo -e "\t2. 로그인한 사용자 확인하기"
        echo -e "\t3. 메모리 사용량 확인하기"
        echo -e "\t0. 종료하기"
        echo -e "\t\t 메뉴를 선택하세요 : "
        read option
}

while [ 1 ]
do
        menu
#       clear
        case $option in
        0)
                break ;;
        1)
                df -k ;;
        2)
                who ;;
        3)
                cat /proc/meminfo ;;
        *)
                echo "해당 번호는 없습니다";;
        esac
        echo -en "\t계속 진행하시겠습니까?(아무키나 누르세요)"
        read -n1 enter
done

 

위와같이해서 menu1.sh 을 만들자

 

이번에는 select를 써서 만들어보자

#!/bin/bash

PS3="번호를 선택하세요 : "
select option in "종료하기" "로그인 사용자 확인" "메모리 사용량 확인" "디스크 공간 확인"
do
        case $option in
        "종료하기")
                break;;
        "로그인 사용자 확인")
                clear
                who;;
        "메모리 사용량 확인")
                clear
                cat /proc/meminfo;;
        "디스크 공간 확인")
                clear
                df -k;;
        *)
                echo "잘못된 번호를 선택하셨습니다";;
        esac
done

 

그렇게 좋아보이지는 않는다.

 

한번이런거 말고 dialog 패키지를 이용해보자

 

```

yum -y install dialog

 

dialog --title "notice" --msgbox "testing..." 10 20

history

```

 

.```

dialog --title "YESNO" --yesno "do you like me?" 10 20

```

YES -> 0

NO -> 1

 

```

dialog --inputbox "What is your name?" 10 20

```

```

dialog --inputbox "What is Ur name?" 10 20 2> name.txt

```

위의방식으로 결과값이 name.txt에 저장된다.

 

```

dialog --textbox name.txt 10 20

```

 

#!/bin/bash

temp=$(mktemp -t test.XXXXXX)
temp2=$(mktemp -t test2.XXXXXX)
menu() {
        dialog --menu "관리자 메뉴" 0 0 0 1 "가상 네트워크 확인" 2 "사용자 확인" 3 "웹 콘솔 연결" 4 "메모리 확인" 0 "종료" 2> $temp2
}

diskspace() {
        df -k > $temp
        dialog --textbox $temp 20 60
}

whoseon() {
        who > $temp
        dialog --textbox $temp 20 50
}

memusage() {
        cat /proc/meminfo >$temp
        dialog --textbox $temp 20 50
}

while [ 1 ]
do
        menu
        op=$(cat $temp2)
        case $op in
        1)
                diskspace;;
        2)
                whoseon;;
        3)
                firefox https://192.168.8.100:4200 &;;
        4)
                memusage;;
        0)
                clear
                break;;
        *)
                dialog --textbox "noting to runable" 10 30
        esac
done

 

---

 

보강

 

쉘프로그래밍

 

변수 지정시

val=10 -> 자동으로 int로 인식
val="10" -> 자동으로 str로 인식


val1=hello
val1 = hello  # 이렇게 하면 val1을 명령으로 처리해서 변수로 못받아들임

 

리다이렉션
>, >>, <<

echo "hello" > a.txt :기존 내용과 상관없이 덮어 씌운다
echo "hello" >> a.txt : 덧붙여진다
cat << a.txt (입력)

grep -e : 정규식
grep -v : 선택한걸 제외하고 선택

명령 실행결과를 변수에 담을 수 있다.
test1=$(pwd;who)
쉘에서의 기본 문법
조건문 (if, case)

if pwt 2>/dev/null
then
	echo "에러"
fi

위의 방식으로 에러를 씹을 수 있다.
반복문 (for, while)

 

도커

사용자 입장에서는 OS가 어떻게 구성되는지는 관심없고 그냥 그 위에 서비스가 올라가기를 희망한다. 그리고 서비스간에 칸막이를 치고 각각의 서비스를 컨테이너로 감싼다. 그리고 각자의 리소스를 할당해주는 것이다.

 

이렇게 하면 가상머신을 사용했을때는 무겁지만 본인만의 커널이 있고

컨테이너를 쓰면 가볍지만 본인만의 커널이 없다.

 

블로그 게시판

3요소 : 웹 프로그래밍 언어(PHP, JSP, ASP) + DB(MariaDB, MySQL) + 웹서버(Apache=httpd)

APM(Apache PHP Maria) 라는 용어가 있었나보다

 

암튼 이걸 컨테이너도 없이 그냥 배포하려고 하면 하루종일 걸리기 때문에 도커로 이미지화하자

 

yum -y install yum-utils device-mapper-persistent-data lvm2

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 

yum -y install docker-ce
systemctl start docker

docker container run --name mysqlwp -e MYSQL_ROOT_PASSWORD=beomtaek -d mysql
docker container run --name wordpress --link mysqlwp:mysql -p 8080:80 -d wordpress
# 80번 wordpress를 8080으로 포워딩

# 192.168.8.100

 

docker container run -it --name ubuntu01 --hostname ubuntu01 ubuntu:18.04 /bin/bash

하고나면 위와같이 ubuntu linux가 CentOS 커널을 이용하면서 작동중에 있다.

 

728x90

'Development(Web, Server, Cloud) > 22) LINUX - Cloud' 카테고리의 다른 글

클라우드 34일차(네트워크 부분 다시 봐야함)  (0) 2022.02.18
클라우드 33일차  (0) 2022.02.17
클라우드 31일차  (0) 2022.02.15
클라우드 30일차  (0) 2022.02.14
클라우드 29일차  (0) 2022.02.14