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

gununoo·2022년 7월 11일
1

네트워크

목록 보기
6/8
post-thumbnail

IPv4

  • classful(경계가 있음) vs classless(경계 없음)
    classful -> /8, /16, /24 only
    classless -> /8, /12, /20, /27, ... 본인이 쓰고 싶은 대로 아무렇게나 씀 IPv6 over IPv4 tunnel -> IPv6 host끼리 IPv4 네트워크에서 통신할 때 tunnel 사용

https://techhub.hpe.com/eginfolib/networking/docs/switches/3600v2/5998-7621r_l3-ip-svcs_cg/content/442284089.htm

  • 원래의 네트워크 범위를 필요한 만큼 동일한 크기의 작은 네트워크로 나누는 작업 -> 서브넷팅
    서브넷팅의 장점 -> IP 낭비를 줄일 수 있다. 불필요한 브로드캐스트의 범위를 줄일 수 있다.
  • VLSM(Variable Length Subnet Mask) -> 가변 길이 서브넷 마스크 -> 필요한 만큼 서브넷을 나누어 쓰는 것

VLAN(Virtual Local Area Network)

  • L2(데이터 링크, Frame, MAC 헤더) 구간에서 동작하는 논리적인 네트워크
  • 하나의 물리적인 네트워크에 있는 vlan과 다른 물리적인 네트워크에 있는 vlan은 서로 관계 없다.
  • 여러 개의 vlan을 만들어서 사용할 수 있다 -> 여러 개의 네트워크가 하나의 스위치에 동시에 존재할 수 있다
  • Rotuer = 1 interface = 1 network = 1 broadcast domain
  • Switch = 1 vlan = 1 network(subnet) = 1 broadcast domain
  • 스위치는 vlan을 통해 네트워크를 논리적으로 구분할 수 있지만, 직접 통신이 되도록 할 수는 없다. 이때에는 서로 다른 패킷(IP)에 대한 해석이 가능한 라우터가 필요하다.
    https://developpaper.com/practice-vlan-under-linux-system/
    https://linux.systemv.pe.kr/tag/openvswitch/

1개의 네트워크를 사용하게 되면
1. 불필요한 브로드캐스트가 확산될 수 있다.
2. 보안상 결함이 발생한다.
-> vlan으로 해결 가능
필요한 만큼 논리적으로 구분
-> 논리적이므로 필요에 따라 vlan10에 포함되었다가 잠시 뒤 다른 네트워크로 이동시키는 것 자유롭다.

vlan 사용하기

  1. 스위치에 연결된 모든 인터페이스는 기본적으로 vlan1에 포함된다
  2. 추가적인 네트워크(vlan)가 필요하다면 생성할 수 있다.
    단, vlan은 12bit를 활용하여 vlan - id를 부여할 수 있다.
    0 ~ 4095 -> 4096개
  3. vlan을 디자인하는 2가지 방법
    1. end-to-end vlan: 물리적으로 떨어져 있는 구간을 하나의 vlan으로 연결하는 방법
      보통 각 층에 있는 동일 업무를 하는 사람들의 PC를 그룹화하는 것
    2. local vlan: 한 지역에 있는 PC들을 하나의 vlan으로 그룹화하는 것(주로 사용!!)
  4. vlan을 생성하면 자동으로 이름이 부여된다.
    ex) vlan 10 -> VLAN0010

GNS3 실습 1


R1 -> SW1, R2 -> SW2
Symbol을 스위치로 변경
SW1, SW2에 NM-16ESW 추가하기 -> 16개 포트가 있는 스위치 모듈


https://www.router-switch.com/nm-16esw-used-p-17895.html

SW2만 실행
[SW2]

vlan database 설정

vlan database
vlan 10 name DEV
vlan 20 name OPS
exit

! 스위치 포트에 대한 vlan의 정보를 breif하게 보여줘
show vlan-sw br

access port 설정

conf t
int f1/1
! 스위치 포트의 모드를 access로
sw mode access
! 스위치 포트 access를 vlan 10으로 지정
sw access vlan 10

int f1/2
sw mode access
sw access vlan 10

int f1/3
sw mode access
sw access vlan 20

do show vlan-sw br
! VLAN10(DEV) -> Fa1/1, Fa1/2
! VLAN20(OPS) -> Fa1/3

PC3, PC4, PC5 start 시키기
[PC3]
ip 10.10.10.11/24

[PC4]
ip 10.10.10.12/24

[PC5]
ip 10.10.10.13/24

[PC3]
ping 10.10.10.12 -> VLAN10 -> 된다
ping 10.10.10.13 -> VLAN20 -> 안 된다

[PC4]
ping 10.10.10.11 -> VLAN10 -> 된다
ping 10.10.10.13 -> VLAN20 -> 안 된다

show arp

[PC3]
show arp

PC5와 통신을 시키고 싶음 -> PC5를 VLAN10으로 옮기자

[SW2]
end
conf t
int f1/3
sw access vlan 10

[PC3]
ping 10.10.10.13 -> VLAN10 -> 된다

[PC4]
ping 10.10.10.13 -> VLAN10 -> 된다

[PC5]
ping 10.10.10.11 -> VLAN10 -> 된다
ping 10.10.10.12 -> VLAN10 -> 된다

Switch의 포트

1. access port

access port = 1 vlan / 1 port(interface)
-> 주로 pc, 프린터, 서버와 같은 end-device가 연결된 곳에 설정

2. trunk port

trunk port = all vlan / 1 port(interface)
-> 주로 SW-SW, SW-R 연결에 설정
기본적으로 모든 vlan 통신이 가능한 인터페이스이고, 해당 트렁크 포트를 지낳 때에는 프레임의 vlan id를 태깅하여 넘겨준다. IEEE 802.1q
반대쪽 인터페이스에서는 태깅 부분을 제거한 나머지를 재조합하여 원래의 frame으로 만들어 최종 목적지로 전달하게 된다.
이를 이용하여 물리적으로 떨어져있는 end-device들 끼리도 정상적으로 통신이 가능하게 되는 것이다.

Trunk port 설정

[SW2]
conf t
int fa1/10
sw mode trunk

SW1 -> start 시키기

[SW1]
vlan dat
vlan 10 name DEV
vlan 20 name OPS
exit

conf t
int f1/10
sw mode trunk
end

conf t
int fa1/1
sw mode access
sw access vlan 10

PC1 start 시키기
[PC1]
ip 10.10.10.10/24
ping 10.10.10.11 -> 된다
ping 10.10.10.12 -> 된다
ping 10.10.10.13 -> 된다

GNS 실습 2


centos -> manage -> full clone -> name: CentOS2
VMware Work Station 네트워크 설정 변경
CentOS1 -> VMnet1
CentOS2 -> VMnet2

CentOS1 -> 본사에 있는 웹/DB 서버
CentOS2 -> 지사에 있는 Desktop

R2 -> SW1 -> NM-16ESW -> symbol: Multilayer Switch
Cloud1 -> 이더넷 추가
Cloud2 -> VMnet1 추가
Cloud3 -> VMnet2 추가

Switch -> start 시키기

[SW1]

vlan database 설정

vlan dat
vlan 10 name SERVER
vlan 20 name PC
exit

access port 설정

conf t
int fa1/1
sw mode access
sw access vlan 10

int fa1/2
sw mode access
sw access vlan 20

trunk port 설정

int fa1/10
sw mode trunk

! 저장
do wr

KVM openvswitch 설정 예시

[kvm openvswitch vlan]
ovs-vsctl add-br ovsbr0
ovs-vsctl add-port ovsbr0 eth1
ovs-vsctl add-port ovsbr0 vnet1 tag=10
ovs-vsctl add-port ovsbr0 vnet2 tag=20
ovs-vsctl add-port ovsbr0 vnet3 tag=30
https://serverfault.com/questions/1005939/how-to-configure-vlans-along-with-libvirt-kvm-qemu-and-ovs

<network>
  <name>ovs-network</name>
  <forward mode='bridge'/>
  <bridge name='ovsbr0'/>
  <virtualport type='openvswitch'/>
  <portgroup name='vlan-01' default='yes'>
  </portgroup>
  <portgroup name='vlan-02'>
    <vlan>
      <tag id='2'/>
    </vlan>
  </portgroup>
  <portgroup name='vlan-03'>
    <vlan>
      <tag id='3'/>
    </vlan>
  </portgroup>
  <portgroup name='vlan-all'>
    <vlan trunk='yes'>
      <tag id='2'/>
      <tag id='3'/>
    </vlan>
  </portgroup>
</network>

https://blog.scottlowe.org/2012/11/07/using-vlans-with-ovs-and-libvirt/

[kvm openvswitch vxlan overlay]

https://subscription.packtpub.com/book/undefined/9781784399054/9/ch09lvl1sec65/configuring-open-vswitch-tunnels-with-vxlan

[SW1]
show vlan-sw br

show int trunk

R1 -> start 시킴

[R1]
! 인터페이스 켜기
conf t
int fa0/1
no sh

보조 interface 만들기

int fa0/1.10
encap dot1Q 10

인터페이스에 ip 주소 입력

ip add 172.16.1.2 255.255.255.0

! 보조 interface 만들기
int fa0/1.20
encap dot1Q 20

! 인터페이스에 ip 주소 입력
ip add 172.16.2.2 255.255.255.0

do show ip route
-> 경로 2개 directly connected

centos1, 2 -> start

[centos2]
wired settings -> IPv4 ->
address: 172.16.2.100
gw: 172.16.2.2

[centos1]
wired settings -> IPv4 ->
address: 172.16.1.100
gw: 172.16.1.2

[centos2]
ping -c 3 172.16.1.100

curl http://172.16.1.100

firefox -> http://172.168.1.100 접속 -> 페이지 뜸

NAT/PAT

  • 내부 사용자들이 인터넷과 연결할 수 있도록 dynamic PAT
  • 외부 사용자들이 회사 내에 있는 웹 서버로 연결할 수 있도록 static PAT (DB 는 외부에서 연결할 수 없어야 한다)

인터페이스에 ip 입력

int fa0/0
ip add 192.168.1.116 255.255.255.0

인터넷 사용을 위한 동적 PAT 설정 -> 내부에서 외부로 나가는 것 설정

ip nat inside so list 1 int fa0/0 overload

ip nat outside
no sh

int fa0/1.10
ip nat inside

int fa0/1.20
ip nat inside

인터넷 연결을 위한 default route 설정

ip route 0.0.0.0 0.0.0.0 192.168.1.1

ACL 설정 - PC측(centos2)

[R1]
conf t
access-list 1 permit 172.16.2.0 0.0.0.255

ping test

[centos2]
ping www.google.com -c 3
-> 된다

[centos1]
ping www.google.com -c 3
-> 안 된다
-> ACL을 구성해야됨

ACL 설정 - SERVER측(centos1)

[R1]
access-list 1 permit 172.16.1.0 0.0.0.255

ping test

[centos1]
ping www.google.com -c 3
-> 이제 된다

외부에서 웹서버 연결을 위한 정적 PAT 구성

[R1]
conf t
ip nat inside so static tcp 172.16.1.100 80 int fa0/0 80
! 외부에서 int fa0/0 80 로 접속하면
! 내부 172.168.1.100 80로 정적 mapping

외부 pc에서 192.168.1.116 접속

서버 설정

[centos1]
yum -y install mariadb-server

[centos2]
yum -y install mariadb

[centos1]
systemctl enable mariadb --now
systemctl status mariadb

mysql_secure_installation
Enter current password for root: 그냥 엔터 누르기
Set root password? -> test123
Remove anonymous users? Y
Disallow root login remotely? Y
Remove test database and access to it? Y
Reload privilege tables now? Y

mysql -u root -ptest123

show databases;

create database testdb;
show databases;

DB

RDBMS에 비해 NoSQL은 샤드라는 단위로 스토리지를 관리하여 확장에 용이하다. 저렴한 스토리지 여러 개를 연결하여, 대용량 저장소를 구축하고 운용하는데 어려움이 없다. NoSQL 그래프, 미디어와 같은 비정형데이터에 대한 저장이 가능하여 입출력이 잦고, 위와 같은 데이터를 관리하기 유용하여 최근 front 쪽에서 많이 사용한다. 하지만 여전히 RDBMS에 대한 사용량은 높은 편이다.

[centos2]
mysql testdb -u root -h 172.16.1.100 -p
-> 접속이 안 됨
-> not allowed
-> 원격 접속이 차단되어있음

[centos1]
db 사용자 만들기

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

-> localhost에서 접속

GRANT ALL PRIVILEGES ON testdb.* TO 'user1'@'%' IDENTIFIED BY 'user1'; 

-> 원격에서 접속

FLUSH 

-> 적용

[centos2]
mysql testdb -u user1 -h 172.16.1.100 -p
-> 이제 user1으로 원격에서 접속이 됨

use mysql;
-> access denied
-> testdb 데이터베이스만 접속되게 설정해놨음

외부에서 DB 접속을 위한 정적 PAT 설정

[R1]
conf t
ip nat inside so static tcp 172.16.1.100 3306 int fa0/0 3306

[centos2]
mysql testdb -u user1 -h 192.168.1.115 -p
-> 외부(192.168.1.115)에서 접속
-> 원격 접속 됨

ACL(Access Control List)

AWS ACL 예시

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=sehyunfa&logNo=221979530198

  • 번호나 이름을 이용하여 정책을 생성하고 생성된 정책에 기반하여 패킷을 필터링, 분류한다.
  • 패킷의 어떠한 부분을 확인하고 필터링하느냐에 따라 standard/extended ACL로 구분한다.
  • 출발지 IP만을 확인하고 필터링 -> Standard ACL (번호 1~99) 또는 WORD
    -> 클라우드나 대규모 환경에서는 사용하지 않는 방법
  • 출발지 IP, 목적지 IP, 출발지/목적지의 포트 번호(L3 ~ L4) -> Extended ACL (번호 100 ~ 199) 또는 WORD
    -> 일반적으로 방화벽의 역할로써 사용하는 ACL은 extended 방식이다.

Standard ACL 구성 예

번호: 1 ~ 99
출발지의 IP주소만을 확인하고 필터링
작성 방법
access-list 1 permit 192.168.1.0 0.0.0.255
access-list 1 permit 192.168.1.4 0.0.0.3 -> 192.168.1.4 ~ 7
access-list 1 deny 2.2.2.2 0.0.0.0 -> 2.2.2.2만 deny
(= access-list 1 deny host 2.2.2.2)
access-list deny 0.0.0.0 255.255.255.255 -> 모든 IPv4 주소 deny
(= access-list 1 deny any)
standard는 특정 IP 주소로부터의 모든 접근에 대하여 허용 또는 차단으로만 구분할 수 있다.

Extended ACL 구성 예

access-list 111 permit ip any host 1.1.1.1
- "ip": 패킷의 IP(L3) 부분만을 확인하고 필터링하겠다!
- "any": source IP (출발지 IP)
- "host 1.1.1.1": 목적지 IP
access-list 111 deny tcp any host 2.2.2.2 eq 80
- "tcp": L3 부분과 L4에서 tcp 포트 번호를 확인하고 해당 패킷을 차단하겠다
- "any": source IP (출발지 IP)
- "host 2.2.2.2 eq 80": 2.2.2.2:80으로 접속한 것
access-list 111 deny icmp any host 2.2.2.2
- "icmp": ping
- 외부에 있는 모든 사용자들이 2.2.2.2로 ping 보내는 것이 있다면 이를 차단하겠다.
access-list 111 deny ip any any
- 모두 차단하겠다

ACL의 rule

1.top-down 방식 -> 위에서 차례대로
quiz. 나는 외부에서 접속하는 사용자들의 트래픽 중 2.2.2.2로부터의 모든 트래픽을 차단하고 싶다. 나머지 모든 트래픽은 허용하고자 한다. ACL 설정 명령어 순서는?
access-list 1 deny host 2.2.2.2
access-list 1 permit any
2. 지정하지 않은 나머지 모든 트래픽은 자동으로 차단된다. (별도로 작성하지 않더라도 ACL의 가장 아래에는 deny ip any any가 생략되어있다)
quiz. 외부에서 유입되는 트래픽 중 2.2.2.2만을 차단하라.
access-list 1 deny host 2.2.2.2
access-list 1 permit any -> 반드시 추가해야됨
(access-list 1 deny any) -> 생략되어있음
3. 생성된 ACL은 적용해주어야 활성화된다.
적용할 때에는 방향을 지정해주어야 한다. (들어올 때 할 것인지, 나갈 때 할 것인지)

standard ACL 예제

172.16.1.0/24에는 우리 회사의 서버들이 존재하고 있다.
이 서버들로 접속할 수 있는 사용자(IP)는 172.16.2.100이 유일하고, 나머지는 모두 차단된다.

standard ACL 생성

[R1]
access-list 1 permit host 172.16.2.100

인터페이스에 ACL 적용

int fa0/1.10
ip access-group 1 out

[centos2]
curl http://172.16.1.100
-> 된다
ping 172.16.1.100 -c 3
-> 된다
mysql testdb -u user1 -h 172.16.1.100 -puser1
-> 된다

[R1]
! 새로운 standard ACL 생성
access-list 11 permit host 172.16.2.100
! 인터페이스에 ACL 적용
int fa0/1.10
ip access-group 11 out

[centos2]
IPv4 설정 변경
wired settings -> IPv4
-> 172.16.2.200으로 변경

curl http://172.16.1.100
-> 안 된다
ping 172.16.1.100 -c 3
-> 안 된다
mysql testdb -u user1 -h 172.16.1.100 -puser1
-> 안 된다

172.16.1.100 이외의 ip는 성공적으로 차단된 것을 확인할 수 있음

nat 입력 잘못했을 경우

do clear ip nat trans *
no ip nat ~

profile
take a look

0개의 댓글