9. Networking - pre

be-lgreen·2021년 5월 24일
0

1. Switching Routing


2. DNS


/etc/name

00파일에 지정한 내용과 내부 DNS에 지정한 내용 중 파일에 지정한 내용이 우선 적용된다.

내부 DNS에서 정의되지 않은 ip주소의 경우, 내부 DNS에는 8.8.8.8 구글 퍼블릭 DNS로 포워딩하도록 설정 되어있다.

내부 DNS -> 루트 DNS -> ...
내부 DNS에서는 다음번에 빠르게 찾기 위해서 캐싱을 해둔다.

3. CoreDNS


4. Network Namespace


네트워크 네임스페이스 생성

ip netns add <네임스페이스 이름>

네트워크 네임스페이스 리스트 확인

ip netns

ip

네트워크 인터페이스 관리 명령어 중 하나이다. 네트워크 인터페이스 정보를 확인하기 위해 사용할 수 있다.

ip link

네트워크 네임스페이스 내 네트워크 인터페이스 정보를 확인하기 위해서는

ip netns exec <네트워크 네임스페이스 이름> ip link

네트워크 네임스페이스 안에서 인터페이스 정보를 확인하면 로프백 정보만 보이고 호스트의 네트워크 인터페이스 정보는 보이지 않는다. 이는 호스트의 네트워크 인터페이스가 네임스페이스 안에 노출되지 않도록 한다.

가상이더넷(veth)으로 두 네임스페이스를 연결할 수 있다.

iP link add veth-red type veth peer name veth-blue : veth 만든다.
ip link set veth-red netns red : 각 veth를 네임스페이스에 붙인다.
ip link set veth-blue netns blue

ip <옵션> <오브젝트> <명령 옵션>

<옵션>
addr: IP 주소에 관한 정보를 수정하거나 출력
link: 네트워크 인터페이스의 상태를 관리하거나 출력
route: 라우팅 테이블을 변경하거나 출력

<명령 옵션>
add, del, set

다음으로 ip 주소를 각 네임스페이스에 할당한다.

ip -n red addr 192.168.x.x dev veth-red

up 명령어 후에 각 네임스페이스 서로 접근가능한다.

ip -n red link set veth-red up
ip -n blue link set veth-blue up

적용완료 되었는지 red 네임스페이스 안에서 blue 네임스페이스에 ping 한다.

ip netns exec red ping 192.168.x.x

네트워크 네임스페이스가 많을 경우에는 어떻게 할까?

네트워크 네임스페이스가 많아지면 모든 네트워크 네임스페이스끼리 직접 이어주기 힘들것이다. 따라서 중앙에 가상 스위치를 두고 모든 네임스페이가 이 스위치에 연결하여 서로 통신한다.

가상 스위치 오픈소스로는 linux bridge, Open vSwitch 등이 있다.

linux bridge에 대해 더 자세하게 알아보자.

birdge 스위치 생성 + up

ip link add v-net-0 type bridge
ip link set dev v-net-0 up

ip link add veth-red type veth peer name veth-red-br
ip link add veth-blue type beth peer name veth-blue-br

네임스페이스와 브릿지 네트워크게 가상네트워크를 할당한다 ?

ip link set veth-red netns red
ip link set veth-red-br master v-net-0

다음으로 ip 주소를 각 네임스페이스에 할당한다.

ip -n red addr 192.168.x.x dev veth-red
ip -n blue addr 192.168.x.x dev veth-blue

up 명령어 후에 각 네임스페이스 서로 접근가능한다.

ip -n red link set veth-red up
ip -n blue link set veth-blue up

호스트에서 네임스페이스에 ping

브릿지 네트워크는 호스트의 네트워크 인터페이스이다. 따라서 브릿지 네트워크에 ip를 할당하면, 호스트와 브릿지 네트워크와 연결된 네임스페이스와 통신이 가능하다.

ip addr add 192.168.15.5/24 dev v-net-0

이제 호스트에서 ping <네임스페이스에 할당된 ip주소> 명령어를 입력하면 응답이 올 것이다.

네임스페이스에서 외부네트워크에 접근하기

호스트 내부 네트워크 네임스페이스에서 외부 LAN으로 접근하기 위해서는 네임스페이스 라우터에 설정을 추가해야한다.

플로우는 다음과 같다. 호스트가 게이트웨이 역할을 한다고 할 수 있다.

네임스페이스 - 호스트 내 브릿지 네트워크 IP -> 외부 LAN

하지만 다시 외부에 ping을 보내면 응답을 받지 못한다. 이유는 private ip로 요청을 보냈기 때문에 받는 쪽에서는 어디로 응답을 줘야할지 모르기 때문이다. 따라서 NAT를 설정해주어야 한다.

iptable -t nat -A POSTROUTING -s 192.168.15.0/24 -j MASQUERADE

네임스페이스에서 인터넷에 접근하기

네트워크 네임스페이스 인터넷으로 접근하기 위해서는 네임스페이스 라우터에 설정을 추가해야한다.

플로우는 다음과 같다.

네임스페이스 -> 호스트 내 브릿지 네트워크 ip -> 인터넷

ip netns exec blue ip route add default via 192.168.15.5 <네트워크 브릿지 ip 주소>

ip netns exec blue ping 8.8.8.8

외부 네트워크에서 네임스페이스 IP로 접근 가능하게 하기

외부에서 네임스페이스 ip로 ping을 가능하게 하려면 port forwarding을 해주면된다.

기타 명령어

ifconfig

네트워크 인터페이스 관리 명령어 중 하나이다. 네트워크 인터페이스 정보를 확인하기 위해 사용할 수 있다.

ifconfig <옵션> <인터페이스>

<인터페이스> up : 지정한 인터페이스 활성화
<인터페이스> down : 지정한 인터페이스 비활성화
inet <주소> : 지정한 인터페이스 IP 주소 설정
netmask <주소> : 지정한 인터페이스 넷 마스크 설정

예) ifconfig
예) ifconfig eth0

arp

arp 테이블을 확인하는 명령어이다.

route

route 테이블을 확인하는 명령어이다.

docker networking


2) 네트워크 지정 X
3) 네트워크 브릿지

docker network ls

ip link 후 docker01 부분 확인

ip addr 후 docker01 부분 확인

도커에서 80번 포트로 애플리케이션을 서비스하고 있다고하자. (nginx)
도커 호스트 머신에서 curl <도커ip>:80을 하면 응답이 오지만, 호스트 외부에서 curl을 보내면 응답이 정상적이지 않다.

외부에서 애플리케이션에 요청을 보내기위해서는 아래와 같이 host mapping을 해주어야한다.

docker run -p 8080:80 nginx

해석하자면 호스트머신의 8080포트로 들어오는 트래픽을 컨테이너의 80포트로 보낸다는 의미이다.

iptables -nvL -t nat

Container Networking Interface (CNI)


컨테이너 환경에서 네트워크 설정 절차를 정의해둔 일종의 플러그인?이다.

birdge add

docker는 특이하게 CNI를 구현하고 있지 않고 자체 정의한 Container Network Model(CNM)이 구현되어 있다.

??
docker에서 CNI를 사용하려면 일일히 컨테이너마다 evoke를 해주어야하는데
k8s는 docker와 CNI를 사용하면서 evoke하는 것을 지원하고 있다.//????

netstat -plnt

p: 프로그램 이름 / PID
l(listen) : 연결 가능한 상태
n(number port) : 포트 넘버
t(tcp) : tcp

netstat -anp | grep etcd

netstat -nap : 연결을 기다리는 목록과 프로그램을 보여준다
netstat -an | grep 포트번호 : 특정 포트가 사용 중에 있는지 확인
netstat -nlpt : TCP listening 상태의 포트와 프로그램을 보여준다

0개의 댓글