[네트워크] 22-07-05 TIL

gununoo·2022년 7월 5일
1

네트워크

목록 보기
2/8
post-thumbnail

서버(linux -> opensource -> Cloudstack)

  • 관리
    • 스크립트: bash, python, go, php -> ex) 3000대에 톰캣을 한 번에 다 깔아라
      "멱등성": ~~~을 보장해달라고 하는 것
      ex) httpd가 설치되어있다고 보장해줘 -> 이미 설치가 되어있으면 불필요하게 재설치를 하지 않음
      ex) httpd가 실행되어있는걸 보장해줘 -> 이미 start되어있으면 불필요하게 재시작을 하지 않음
    • Ansible, Terraform
  • 컨테이너(도커 -> Swarm -> 쿠버네티스)
    • scale out -> AutoScale
    • scale up -> 서버 사양 교체
  • 배포
    • github + webhooks + jenkins
    • gitlab + jenkins
    • 코드에 에러가 있을 때, 서버가 동작 중일 때도 jenkins로 이전 커밋으로 되돌릴 수 있음

베어메탈(Bare Metal) vs VM

  • VM의 Application 실행 경로
    : Physical Resources -> HostOS -> VMware WorkStation(Hypervisor) -> vResources -> GuestOS -> Application
  • 베어메탈보다 30%정도 성능 하락 (베이메탈:VM = 1:0.7)
  • 도커는 HostOS 위에 컨테이너들을 올림
  • 도커는 HostOS의 kernel을 직접 쓰기 때문에 성능 저하가 거의 없음 (베어메탈:도커 = 1:1)

실습 환경

VMnet0 -> Bridge
VMnet1 -> Host-only

VMnet2 -> Host-only
VMnet10 -> NAT(가상의 스위치)

네트워크 및 인터넷 설정 열기 -> 이더넷 -> 어댑터 옵션 변경
VMnet1 -> 속성 -> ipv4 속성 -> 172.16.1.1
VMnet10 -> 속성 -> ipv4 속성 -> 211.183.3.1

vNIC type

  • Host-only(isolated): 고립되어있어 외부와 통신이 불가능함
  • NAT(Network Address Translation): 원래의 ip를 다른 ip로 변경
  • Bridge(Switch): 호스트OS와 동일한 네트워크에 연결됨. 같은 강의실에 있는 옆 친구의 가상머신에 접속 가능.
    VMnet0은 bridge이기 때문에 로컬pc의 네트워크 설정을 그대로 따라서, ip설정을 임의로 바꿀 수 없음
  • (Host): 도커에서 쓰임

스위치: 강의실마다 스위치가 각각 있고, 라우터가 스위치들을 연결함

https://www.cisco.com/c/ko_kr/products/switches/catalyst-4900-series-switches/index.html

  • Host-only

    • VMnet1와 가상머신이 연결되어있음
    • VMnet1은 라우터와 연결되어있지만, host-only이기 때문에 인터넷과 연결되어있지 않음
    • Host-only일 때 인터넷과 연결하는 법 -> 라우터에 NAT을 구성하기!!!
  • NAT
    본인의 pc(windows 10)에 VMnet10 가상 스위치를 생성함 -> ip는 1번이 할당되어 211.183.3.1
    라우터의 default 게이트웨이에 ip 2번 할당 -> 211.188.3.2
    pc에서 NAT를 거쳐서 VM에서의 사설 ip를 공인 ip로 바꿔줌
    공유기에서 NAT를 거쳐서 사설 ip를 공인 ip로 바꿔줌
    구글에 접속할 때 라우터(공유기)가 사설ip를 공인ip로 바꿔서 내보냄

  • Bridge(Switch)
    스위치에 교육생들의 pc가 연결되어있음
    스위치는 공유기와 연결되어있음
    공유기의 사설ip: 192.168.1.X
    공유기의 공인ip: 1.11.X.X
    https://ifconfig.me/ 에서 공인ip 확인 가능

GNS3 실습

cloud1에 이더넷 추가 -> internet으로 이름 변경 -> 라우터와 fa0/0 연결 (/0은 outside)

cloud2에 VMnet1 추가 -> server_zone으로 이름 변경 -> 라우터와 fa0/1 연결 (/1 inside)

fa0/0선 우클릭 -> start capture -> wireshark 켜짐
-> do ping 192.168.1.199 -> request, reply 패킷 자세히 보기

[Router]
R1# conf t
R1(config)# int fa0/0
R1(config-if)# ip add 192.168.1.116 255.255.255.0
R1(config-if)# no sh
Mar 1 00:20:55.743: %LINK-3-UPDOWN: Interface FastEthernet0/0, changed state to up
Mar 1 00:20:56.743: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/0, changed state to up
R1(conf-if)# do ping 192.168.1.116

ARP(Address Resolution Protocol)

통신하고자 하는 목적지의 IP주소를 이용하여 해당 목적지의 물리주소인 MAC 주소를 찾기 위한 프로토콜이며,
정상적으로 arp가 동작한 이후에는 arp 테이블에 목적지 IP와 MAC 주소가 등록된다.
이후 자신이 최종적으로 원했던 통신을 하고자 한다면 ARP 테이블에 있는 정보를 참고하여 패킷을 완성하게 된다.

________________________
| MAC | IP | TCP | Data | -> 프레임 
      __________________
      | IP | TCP | Data | -> 패킷 

ip주소는 출발지부터 목적지까지 바뀌지 않음. 반면, MAC주소는 계속 바뀜

whireshark의 filter에 arp 적용

  • who has 192.168.1.199? Tell 192.168.1.116
  • Target MAC addr 00:00:00:00:00:00 -> 목적지를 모름

src ------> dst

sender ip: 1.1.1.1
sender mac: 000c.000c.000c
dest ip: 1.1.1.5
dest mac: 00:00:00:00
"나는 1.1.1.1이고 나의 mac주소는 000c.. 인데, 너희들 중 1.1.1.5가 있다면 나에게 대답해줄래?"

src <------ dst

sender ip: 1.1.1.5
sender mac: 000a.000a.000a
dest ip: 1.1.1.1
dest mac: 000c.000c.000c
"아~ 1.1.1.5의 mac 주소는 000a.000a.000a구나! 기억해야지!" -> arp 테이블에 저장
(arp 테이블은 ram을 사용하기 때문에, 시간이 지나면 사라짐 -> aging)

[Router]

R1(conf-if)# do ping 8.8.8.8 -> 통신이 되지 않음
..... <- ping 실패했다는 뜻

R1(conf-if)# do show ip route
C 192.168.1.0/24 is directly connected, FastEthernet0/0

R1(conf-if)# ip route 0.0.0.0 0.0.0.0 192.168.1.1
R1(conf)# do show ip route
C 192.168.1.0/24 is directly connected, FastEthernet0/0
S* 0.0.0.0/0 [1/0] via 192.168.1.1 -> 내가 알지 못하는 곳으로 갈 때에는 공유기(192.168.1.1)에게 맡겨라

R1(conf)# do ping 8.8.8.8 -> 이제 접속 됨!
!!!!! <- ping 성공했다는 뜻

R1(conf)# int fa0/1 -> inside
R1(conf-if)# ip add 172.16.1.2 255.255.255.0 -> gateway의 ip 추가
R1(conf-if)# no sh -> changed state to up

[가상머신]
ifconfig ens32 | grep 172.168.1
inet 172.16.1.128 netmask 255.255.255.0 broadcast 172.16.1.255

ifconfig ens32 | grep 172.16.1 | gawk '{print $1}' -> 결과 중 첫 번째를 반환
inet

ifconfig ens32 | grep 172.16.1 | gawk '{print $2}'
172.16.1.128 -> dhcp 프로토콜로 ip를 할당받은 것

가상머신 interface 설정 바꾸어보기
wired settings -> ipv4 -> manual
-> ip: 172.16.1.100
-> netmask: 24
-> gw: 172.16.1.2
-> apply -> interface 껐다가 켜기

[가상머신]
ifconfig ens32 | grep 172.16.1 | gawk '{print $2}'
172.16.1.100 -> ip주소가 설정한대로 바뀌었음

ping 172.16.1.2 -c 5 -> gateway로 ping 잘 됨

[Router]
R1(conf-if)# do show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.1.116 - cc01.0ea4.0000 ARPA FastEthernet0/0
Internet 192.168.1.1 0 784f.9b2a.ea7b ARPA FastEthernet0/0
Internet 192.168.1.199 42 cc01.350c.0000 ARPA FastEthernet0/0
Internet 172.16.1.2 - cc01.0ea4.0001 ARPA FastEthernet0/1
Internet 172.16.1.100 0 000c.2920.8092 ARPA FastEthernet0/1

R1(conf-if)# do ping 172.16.1.100
!!!!!

[가상머신]

ping www.google.com -> 안 된다

ping 8.8.8.8 -> 패킷이 나가기는 한다??
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

왜 도메인으로 보내면 안 되고 ip로 보내니까 패킷이 나가기는 하고, 돌아오지 않을까?

웹서버 접속 과정

클라이언트 - 10.10.10.10
DNS - 8.8.8.8
웹서버 - 5.5.5.5

  1. [클라이언트] 자신의 캐시 검색
  2. [클라이언트] 자신의 hosts 파일을 검색
  3. [클라이언트] 자신의 DNS에게 Query
  4. [클라이언트 -> 8.8.8.8] 8.8.8.8 DNS에게 www.test.com의 IP 물어봄
  5. [8.8.8.8] DB 탐색
  6. [8.8.8.8 -> 클라이언트] 클라이언트에게 www.test.com의 IP 알려줌
  7. [클라이언트] 패킷 생성
    | Data(Request) | DST TCP(80)[SYN] | SRC TCP(12345) | DST IP(5.5.5.5) | SRC IP(10.10.10.10) |
  8. [클라이언트 -> 웹서버] 서버에게 SYN(0번) 전송
  9. [클라이언트 <- 웹서버] 서버가 응답을 보냄
  10. [클라이언트 <- 웹서버] 클라이언트에게 ACK(1번)/SYN(0번) 전송
  11. [클라이언트 -> 웹서버] 서버에게 ACK(0번) 전송
  12. [클라이언트 -> 웹서버] GET메소드를 서버에게 보냄
  13. [클라이언트 <- 웹서버] index.html 전송

IP는 ISP(SKT/KT/U+)에게 비용을 지불했느냐 여부에 따라 공인(public)IP, 사설(private)IP로 분류한다.
대표적인 사설 IP주소 대역
10.X.X.X
172.16.X.X ~ 172.31.X.X
192.168.X.X

aws에서 172.16.X.X(사설IP) 서버를 만들면 인터넷 연결이 없음
igw 연결하면 외부와 접속은 됨
NAT을 설정하면 임시적으로 공인 IP를 부여할 수 있음
인스턴스를 중지하면 공인 IP를 반납함

NAT(Network Address Translation)

사설IP주소 하나를 특정 공인IP주소로 변경하는 것

  • 동적 NAT: 공인 주소 여려 개는 공인 주소 pool에 담겨있고, 사설 주소가 이를 요청했을 경우 pool에 있는 공인 주소를 꺼내여 연결(변경)해준다. 따라서 공인 주소와 사설 주소는 지정되지 않는다.
  • 정적 NAT: 특정 사설 주소는 무조건 지정된 공인 주소를 사용하도록 정적으로 매핑해두는 기술

PAT(Port Address Translation)

공인 주소가 1개인 경우 다수의 사설 주소가 한 개의 공인 주소를 공유하여 주소 변경을 하고자 하는 경우에 사용하는 방법

클라이언트 - 172.16.1.10(사설 IP)
NAT - pool에 floating IP들이 있음 -> 168.116.63.5, 168.116.63.6, 168.116.63.7, ... -> 동적 NAT

ISP는 인터넷에 연결시켜주기 전에, 서비스 가입자인지 확인함
-> ISP는 사설 IP를 drop시킴 -> 사설IP를 공인IP로 변경해야 함 -> NAT의 역할
클라이언트가 외부로 나갈 때 NAT를 거침
NAT에서 사설 IP를 pool에서 floatingIP를 꺼내어 할당해줌
168.116.63.5

| Data(Request) | DST TCP(80) | SRC TCP(12345) | DST IP(5.5.5.5) | SRC IP(172.16.1.10) |

서버는 클라이언트와 달리, 정적 NAT로 고정된 IP를 할당받음
정적 NAT으로 할당된 IP는 NAT Table에 저장되어, 다른 클라이언트에게 할당하지 않음

여러 클라이언트가 NAT를 거쳐서 하나의 같은 공인IP로 변경될 때 -> 각자 다른 포트 번호로 바뀌어야함
-> NAT 장비의 port로 바꿈 = PAT(Port Address Translation)

시나리오 1 - 동적 PAT 설정(인터넷 연결)

[Router]
R1(config)# access-list 1 permit any
-> 변경할 주소 지정(모든 ip를 확인함)

R1(config)# ip nat inside source list 1 int fa0/0 overload
"ip nat": 주소 변경할게!!
"inside source list1": 주소를 변경할 출발지 주소는 list1에 지정된 친구들이야!!
"int fa0/0": fa0/0(192.168.1.X)에 할당된 공인 주소로 변경할게!!
"overload": PAT 활성화 => 다수의 사설 주소가 fa0/0의 주소를 공유!!

R1(config)# int fa0/0
R1(config-if)# ip nat outside

R1(config-if)# int fa0/1
R1(config-if)# ip nat inside
-> fa0/1에서 들어와서 fa0/0으로 빠져나갈 때

가상머신에서 이제 인터넷 접속이 됨

R1(config)# ip http server
-> 가상머신에서 http://192.168.1.116 접속

http://192.168.1.116 ---> Router ---> 172.168.1.100:80
정적 PAT

시나리오 2 - 정적 PAT 설정(포트 8001)

외부에 있는 사용자들이 192.168.1.1XX:8001 포트로 접속할 경우 내부에 있는 사설 주소인 172.16.1.100의 80번 포트로 접속되도록 한다.

192.168.1.1XX:8001 = 172.16.1.100:80

[Router]
R1(config)# ip nat inside source static tcp 172.16.1.100 80 int fa0/0 8001

내부에 있는 사설 IP주소인 172.16.1.100의 TCP 포트번호 80번과 공인 IP주소가 할당된 fa0/0의 8001 포트를 정적으로 매핑하겠다!

[가상머신]

systemctl start httpd -> 아파치 켜기
echo "HELLO ALL" > /var/www/html/index.html -> index.html 생성
ystemctl stop firewalld -> 방화벽 끄기

다른 가상머신 접속해보기 http://192.168.1.199:8001

시나리오 3 - 정적 PAT 설정(포트 22)

퇴근한 서버 관리자는 집에서 웹서버로 ssh 연결을 시도하고자 한다.
아래와 같은 방법으로 접속이 가능해야 한다.

ssh -l root -p 20022 192.168.1.199 접속을 시도하면 내부에 있는 리눅스 웹서버로 ssh 연결이 가능해야한다. 화면에는 public key 를 저장할 것인지를 물을 것이고 yes 를 타이프 한 후에 패스워드를 입력하면 정상적으로 원격지 서버에 접속할 수 있어야 한다.
참고로 ssh 서버의 기본 포트는 22 번이다

[Router]

R1(config)# ip nat inside source static tcp 172.16.1.100 22 int fa0/0 20022 -> 내 가상머신의 ssh 접속 허용

[가상머신]

ssh -l root -p 20022 192.168.1.199 -> 다른 가상머신 접속

오타내서 라우터 에러 발생했을 떄

%Static entry in use, cannot change
  1. do show run으로 확인
  2. no [삭제하고 싶은 라인]
  3. 만약 사용 중이라는 단어가 보이면
    do clear ip net trans *
  4. 다시 no [삭제하고 싶은 라인]

ssh 접속 기록 확인

[가상머신]
cd .ssh/
cat known_hosts
ssh로 접속한 기록이 나옴

profile
take a look

0개의 댓글