Networking
네트워크가 작동하는 방식
- 같은 네트워크 상에서는 스위치로 패킷을 전송할 수 있음
- 다른 네트워크 상에서는 router가 있어야 함
- 만약 PC A, B가 같은 네트워크에 있고 PC B, C가 같은 네트워크에 있다면
라우팅 테이블을 추가하면 A와 C가 통신할 수 있음
하지만, response를 받을 수 없는데 B는 기본적으로 response를 forwarding하지 않기 때문
보안적인 이슈인데, 만약 public network와 private network를 연결했을 때 forward가 된다면 문제가 있기 때문
ip 관련 연결 확인 커맨드
네트워크에 물리적으로 연결되었는지 확인: ip link
자신의 컴퓨터가 ip 주소를 할당받았는지 확인: ip addr
routing table 확인: route
network간 연결: ip route add 192.168.2.0/24 via 192.168.1.1 (routing 경로 추가)
device에 ip 추가: ip addr add 192.168.1.10/24 dev eth0
만약 모르는 network와 연결하려고 한다면, default gateway를 지정할 수 있음: ip route add default via 192.168.2.1
다른 네트워크로 패킷 포워드 확인하는 커맨드: cat /proc/sys/net/ipv4/ip_forward (0이면 forward하지 않고, 1이면 forward 함) 하지만 이 커맨드는 영속적이지 않기 때문에 /etc/sysctl.conf에서 net.ipv4.ip_forward = 1 로 둬야 함
host name 추가
cat >> /etc/hosts
192.168.1.11 db
이제 ping db 로 ping을 날릴 수 있음
address name을 ip로 변경하는 작업은 name resolution이라고 함
name resolution server 주소 확인
cat /etc/resolv.conf
nameserver 192.168.1.100
hostname 검색 순서 변경
일반적으로는
1) local의 /etc/hosts 파일에 있는지 확인하고
2) DNS 서버에 질의를 하지만,
cat /etc/nsswitch.conf
파일을 확인했을 때
...
hosts: files dns
...
위와 같은 순서로 되어 있을 텐데, 바꿀 수 있음
name server 주소 추가
cat >> /etc/resolv.conf
nameserver 192.168.1.100
nameserver 8.8.8.8
search domain
만약 mycompany.com 외부에서 web이라는 host를 접속하려면
ping web.mycompany.com 을 하면 됨
하지만 내부적인 입장에서는 web이라는 식별자로 접근할 수 있는데,
cat >> /etc/resolv.conf
nameserver 192.168.1.100
search mycompany.com
위와 같이 설정하면
내부장에서 ping web 이렇게 사용할 수 있음
search mycompany.com prod.mycompany.com 이렇게 검색할 수 있음
레코드 종류
A 레코드: host name과 IPv4 주소를 매핑
AAAA 레코드: host name과 IPv6 주소를 매핑
CNAME 레코드: name to name mapping
nslookup
nameserer에 query를 날림
로컬에 저장된 /etc/hosts 는 고려되지 않음
dig
name resolution 테스트를 하는 툴
nslookup보다 더 자세하게 나옴
network namespace
network namespace 내부에서는 외부의 정보를 확인할 수 없고
오로지 network namespace 내부의 정보만 볼 수 있습니다(arp table, ip table)
network namespace 생성 커맨드
ip nets add red
ip nets add blue
# 확인
ip netns
network namespace 밖에서 명령 넣기
ip netns exec red ip link
= ip -n red link
ip nets exec red arp
ip nets exec red route
network namespace 간의 연결
연결은 pipe 혹은 virtual network cable로 부를 수 있습니다.
케이블 생성: ip link add veth-red type veth peer name veth-blue
케이블을 name space에 연결: ip link set veth-red netns red, ip link set veth-blue netns blue
ip 할당: ip -n red addr add 192.168.15.1 dev veth-red, ip -n blue addr add 192.168.15.2 dev veth-blue
ip -n red link set veth-red up
ip -n blue link set veth-blue up
ip netns exec red ping 192.168.15.2
ip netns exec red arp
ip netns exec blue arp
virtual switch
위 처럼 하면 namespace 간의 연결은 가능한데,
여러 namespace 간의 통신은 어렵습니다.
그래서 switch같은 장비가 필요한데, 여러 솔루션들이 있습니다.
예를 들어서, linux-bridge, Open vSwitch 같은 솔루션들...
linux bridge 방법을 사용해서 virtual switch를 생성하는 방법은 다음과 같습니다.
ip link add v-net-0 type bridge
ip link
ip link set dev v-net-0 up
(여기에서 예전에 생성했던 veth-red와 veth-blue 연결은 더이상 필요하지 않습니다. virtual switch를 사용할 거기 때문에..!!)
ip -n red link del veth-red
virtual switch와 각 namespace들을 연결
ip link add veth-red type veth peer name veth-red-br (br을 붙이는 게 interface를 명확하게 하기 위해서 관행임)
ip link add veth-blue type veth peer name veth-blue-br
ip link set veth-red netns red
ip link set veth-red-br master v-net-0
ip link set veth-blue netns blue
ip link set veth-blue-br master v-net-0
ip -n red addr add 192.168.15.1 dev veth-red
ip -n blue addr add 192.168.15.2 dev veth-blue
ip -n red link set veth-red up
ip -n blue link set veth-blue up
host에서 virtual switch에 접근하려면 다음과 같이 입력합니다.
ip addr add 192.168.15.5/24 dev v-net-0
ping 192.168.15.1 (이제 ping이 감)
만약 blue network namespace에서 LAN으로 요청을 하려고 하면
ip netns exec blue ping 192.168.1.3 (LAN에 있는 다른 주소) (unreachable)
ip netns exec blue route
ip netns exec blue ip route add 192.168.1.0/24 via 192.168.15.5
이렇게 설정해도 외부로 나가지 않음
왜냐하면, namespace - host network - lan - 다른 device
이렇게 통신을 할 때 host network에서 응답을 namespace로 forwarding해주지 않음
따라서 NAT 기능을 enable시켜야 함
iptables -t nat -A POSTROUTING -s 192.168.15.0/24 -j MASQUERADE
인터넷과 연결하려고 하면
ip netns exec blue ping 8.8.8.8
ip netns exec blue route
ip netns exec blue ip route add default via 192.168.15.5
ping 8.8.8.8
만약 다른 LAN 상에서 namespace로 접근하려는 경우
두 가지 옵션이 있음
1) LAN 상의 디바이스에서 routing 규칙을 추가해서, namespace로 접근하려면 LAN을 넘어서 디바이스 접근한 후, 그 디바이스의 namespace 로 접근하라고 지정
2) NAT 규칙을 설정
iptables -t nat -A PREROUTING --dport 80 --to-destination 192.168.15.2:80 -j DNAT
'advanced > Devops' 카테고리의 다른 글
[CKA] 12일차 - HA 설정(ETCD 서버) (0) | 2022.09.02 |
---|---|
[CKA] 11일차 network(2) - CNI, Ingress, CoreDNS (0) | 2022.08.26 |
[CKA] 9일차 - Storage (2) PV, PVC, SC (0) | 2022.08.22 |
[CKA] 8일차 - Storage (0) | 2022.08.21 |
[CKA] 7일차 - security (2) (config file, Authorization) (0) | 2022.08.20 |