Networking-Prerequisites
- Prerequisite - 네트워크 & IP
- Prerequisite - 라우팅
- Prerequisite - DNS
- Prerequisite - Namespace
- Prerequisite - iptables
- Prerequisite - SSH 터널링
1. Prerequisite - 네트워크 & IP
네트워크란?
- 기본적으로는 통신할 수 있는 망을 말하는데, 라우터 없이 통신할 수 있는 영역을 의미한다고 생각하면 된다.
- 라우터 없이 통신할 수 있는 영역을 이더넷 네트워크(=로컬 네트워크, LAN)이라고 한다.
- 라우터를 통해 연결되는 네트워크를 인터넷(WAN)이라고 한다.
IP는 뭐야?
- TCP/IP 프로토콜을 사용하는 호스트에게 부여되는 ID로 호스트를 구분하기 위해 사용된다.
IP의 구성은?
- 32비트를 8비트(옥텟) 4개로 나누어 255.255.255.255까지 표현할 수 있다.
- 네트워크영역과 호스트영역으로 구분한다.
- 네트워크영역은 ISP업체에서 할당하고, 호스트영역은 임의할당이 가능하다. => IP 클래스
- 호스트영역을 더 쪼개서 네트워크를 나눌 수 있다. (=라우터 없이 사용할 수 있는 영역을 작게 가져간다.) => 서브넷마스크
- 네트워크 영역은 IP 영역의 제일 첫 IP, 브로드캐스팅 영역은 마지막 IP, 게이트웨이 주소는 두번째 IP주소를 할당하는게 일반적이다.
IP 클래스
- 호스트 영역의 크기에 따라 나눈다.
- A Class: 0#7.#8.#8.#8 (네트워크영역 0#7, 나머지 호스트 영역)
- B Class: 10#6.#8.#8.#8 (네트워크영역 10#6.#8, 나머지 호스트 영역)
- C Class: 110#5.#8.#8.#8 (네트워크영역 110#5.#8.#8, 나머지 호스트 영역)
서브넷 마스크
- 할당받은 네트워크를 더 작은 네트워크 영역으로 쪼개서 사용할 때 쓴다.
- 네트워크 영역이 크다는 것은 브로드캐스팅 영역이 크다는 것으로 패킷 전송이 비효율적으로 일어날 수 있고, 보안에 취약할 수 있다.
- 1을 연속하여 사용해서 호스트영역을 구분한다.
- 예) 211.168.83.0을 5개의 서브넷을 사용하기 위해 나눠야 한다면, 서브넷마스크 주소는 어떻게 되는가? -> 211.168.83.0은 C Class 주소이기 때문에 마지막 옥텟만 호스트 영역이다. 8비트에서 5개의 영역을 만들기 위해서는 1110 0000 이 되어야 한다. (8개의 영역이 생성된다.) 따라서 서브넷 마스크의 주소는 255.255.255.224 가 된다.
2. Prerequisite - 라우팅
통신을 하기 위한 컴포넌트들은 어떤게 있어?
- 호스트(PC): 네트워크의 가장 말단. 이더넷 인터페이스(eth0)가 있고, 여기에 IP를 할당받아서 네트워크 영역에 소속됨
- 스위치(L2): ARP 테이블을 통해 하나의 네트워크 영역 안에서 통신을 관리함.
- 라우터(L3): 라우팅 테이블을 통해 네트워크 영역 사이의 통신을 중개함
- 이더넷 인터페이스: 로컬 네트워크로 연결되는 인터페이스. 호스트, 스위치, 라우터에 있다.
- 시리얼 인터페이스: 외부 네트워크로 연결되는 인터페이스. 라우터에 있다.
- ARP, 라우팅 테이블: mac, ip 주소를 각 컴포넌트와 매핑한 테이블. arp는 호스트와 스위치에, 라우팅 테이블은 호스트와 라우터에 있다.
로컬네트워크에서 통신하려면 어떻게 해야해?
- 호스트의 이더넷 인터페이스에 ip를 할당한다. (네트워크 영역이 같은 ip 범위여야 한다.)
- 이제 통신할 수 있다. 스위치에서 처음에는 브로드캐스팅을 하고, ip와 mac으로 호스트 매핑을 하게되면 다음엔 유니캐스팅을 하게된다.
외부 네트워크와 통신하려면 어떻게 해야해?
- 호스트의 이더넷 인터페이스에 ip를 할당한다.
- 라우터의 이더넷 인터페이스에 게이트웨이 ip를 할당하고, 시리얼 인터페이스에 공인 ip를 할당한다.
- 호스트에 외부 네트워크 영역으로 나갈 수 있는 게이트웨이 ip를 등록한다.
혹은 Default Gateway ip를 등록한다.
3. Prerequisite - DNS
DNS가 뭐야?
- Domain Name System으로, ip를 url로 변경해주는 시스템 혹은 서비스
- PC에서는 Name Resolution 기능을 활용하여 DNS 성격의 서비스를 사용할 수 있다.
- DNS 서버를 통해 변환 서비스를 제공받는다.
Name Resolution 기능은 뭐야?
- PC에서 ALIAS 처럼 ip와 name 쌍을 설정해서 매칭하는 기능
- /etc/hosts에 목록을 저장한다.
- ip:name이 1:N 관계이다.
- 임의 세팅이기 때문에 url 형식이 아니어도 상관없고, 실제와 같지 않아도 상관없다.
DNS 서버가 뭐야?
- ip-url 매칭 테이블을 저장하고 있는 서버.
- 호스트가 이 서버에 url을 전송하면 ip를 반환하여 리턴한다.
- 인터넷 상의 모든 사이트의 ip-url 매칭 데이터가 있는 서버가 존재한다. (well-known public server, ex-8.8.8.8 by Google)
우리는 PC에서 어떻게 사용하고 있어?
- /etc/resolve.conf에 DNS 서버리스트를 등록해둔다.
- 여러개의 서버를 나열해도 되고, 모든 쿼리가 well-knwon public server로 가도록 nameserver를 설정해도 된다.
Name Resolution이랑 DNS랑 같이 사용하고 있어?
- 같이 사용하고 있다. 우선순위는 기본적으로 name resolution이 높지만, /etc/nsswitch.conf에서 host: files dns 부분을 변경해줌으로서 우선순위를 바꿀 수 있다.
- ping 툴을 사용하면 hosts 파일과 resolve파일을 모두 체크, nslookup은 resolve 파일만 체크하고 dig은 디테일을 보고싶을 때 사용한다.
DNS 형식, 구조는 어떻게 되?
- 프로토콜://서브도메인.메인도메인.TLD/경로명?쿼리
- TLD는 Top Level Domain으로 .com, .kr, .net등을 말한다. 1레벨 이다.
- (메인)도메인은 naver, google, microsoft등을 말한다. 2레벨 이다.
- (메인)도메인+TLD를 루트도메인이라고 한다.
- 서브도메인은 www, mail, map, drive등을 말한다. 3레벨 이다.
- 서브도메인은 ip를 구분한다는 관점에서 호스트네임이라고도 한다.
- 호스트네임+도메인+TLD를 FQDN(Fully Qualified Domain Name)이라고 한다.
DomainName을 ip로 바꾸는 규칙, Record
- A Record: FQDN -> IP (ipv6의 경우에는 AAAA Record)
- CNAME Record: DNS -> DNS
CoreDNS는 뭐야?
- 로컬호스트에서 돌릴 수 있는 DNS 서버
- 쿠버네티스 클러스터에서 사용된다.
쿠버네티스 coreDNS1
쿠버네티스 coreDNS2
4. Prerequisite - Namespace
Namespace가 뭐야?
- 호스트로부터 네트워크나 프로세스를 격리하는 공간
- 호스트는 루트 네임스페이스이며, 루트 네임스페이스 안에 다른 네임스페이스를 생성하여 사용한다.
- 부모 네임스페이스에서는 자식 네임스페이스의 모든 프로세스들을 볼 수 있지만, 반대는 불가능하다.
Network Namespace
ns와 브릿지 그리고 NAT
브릿지를 사이에 둔 ns간의 통신
- 네트워크를 격리시킨 공간
- 하나의 네트워크 네임스페이스는 고유한 arp 테이블, 라우팅테이블, iptables, name resolution을 가지고 있다.
- 네트워크 네임스페이스를 구성하는 컴포넌트는 namespace, pipe(veth peer), bridge가 있다.
NS 2개 사이에 브릿지를 두고 통신하도록 구성하면?
# 네임스페이스, 브릿지 생성
> ip netns add ns1
> ip netns add ns2
> ip link add br0 type bridge
# veth peer 생성
> ip link add veth1 type veth peer name veth1-br
> ip link add veth2 type veth peer name veth2-br
# 브릿지와 ns에 veth peer 연결
> ip link set veth1 netns ns1
> ip link set veth2 netns ns2
> ip link set veth1-br master br0
> ip link set veth2-br master br0
# ns veth에 ip 할당 후 인터페이스 활성화
> ip netns exec ns1 ip addr add 192.168.1.10/24 dev veth1
> ip netns exec ns1 ip link set veth1 up
> ip netns exec ns2 ip addr add 192.168.1.20/24 dev veth2
> ip netns exec ns2 ip link set veth2 up
# 브릿지 및 브릿지에 연결된 veth 인터페이스 활성화
> ip link set veth1-br up
> ip link set veth2-br up
> ip link set br0 up
호스트와 NS가 브릿지를 통해서 통신할 수 있도록 설정하면?
> ip netns add ns1
> ip link add br0 type bridge
> ip link add veth1 type veth peer name veth1-br
> ip link set veth1 netns ns1
> ip link set veth1-br master br0
> ip netns exec ns1 ip addr add 192.168.1.10/24 dev veth1
> ip netns exec ns1 ip link set veth1 up
> ip addr add 192.168.1.11/24 dev br0
> ip link set veth1-br up
> ip link set br0 up
ip 명령어
> ip -o link # veth의 peer 정보에 대해 조회
> ip -br link
> netstat -nat | grep LISTEN
> iptables -L | grep FORWARD
> iptables --policy FORWARD ACCEPT
# NAT 및 DNS 셋업
# /etc/sysctl.conf에서 net.ipv4.ip_forward= 로 볼 수도 있다.
# 호스트가 호스트와 호스트 사이의 네트워크를 중계해줄 수 없다.
# default 값이 0으로 되어있는데, 이를 1로 수정해주면 중계가 가능해진다.
> sysctl -w net.ipv4.ip_forward=1
> cat /proc/sys/net/ipv4/ip_forward
> iptables -t nat -A POSTROUTING -s 10.201.0.0/24 -j MASQUERADE
> mkdir -p /etc/netns/container4/ echo 'nameserver 8.8.8.8' > /etc/netns/container4/resolv.conf
5. Prerequisite - iptables
iptables가 뭐야?
- 방화벽을 위한 패킷 필터링, NAT, 패킷 수정(Mangle) 기능을 제공하는 도구
iptables는 어떤 식으로 구성되어 있어?
iptables 구조
iptables 옵션들
iptables 명령어 예시
- tables: 패킷에 적용할 프로세스 그룹
- chains: 프로세스를 진행할 때 내부 단계(시점)
- target: 규칙과 일치할 때 작동할 행동(명령)
tables 디테일
- filter, nat(network address translation), mangle, raw 4종류가 있다.
- table이 어떤 종류냐에 따라 chains의 구성이 달라진다.
- filter: INPUT, OUTPUT, FORWARD
- nat: PREROUTING, POSTROUTING, OUTPUT
- mangle: ALL
chains 디테일
- PREROUTING, POSTROUTING, INPUT, OUTPUT, FORWARD 5종류가 있다.
- PREROUTING: 패킷이 이더넷 인터페이스를 통과해서 들어온 직후
- POSTROUTING: 패킷이 이더넷 인터페이스를 통과해서 나가기 직전
- INPUT: 패킷이 프로세스에 전달되기 직전
- OUPUT: 패킷이 프로세스에서 생성된 직후
- FORWARD: 패킷이 이더넷 인터페이스로 들어와서 프로세스에 전달되지 않을 때 (다른 목적지가 있음으로 결정될 때)
target 디테일
- ACCEPT, DROP 이 기본적으로 사용되는 타겟이다.
- REJECT, LOG, RETURN, SNAT, DNAT, MASQUERADE 가 있다.
SNAT, DNAT, MASQUERADE가 뭐야?
NAT와 PAT
Static / Dynamic NAT
NAT Packet 관찰
로컬 네트워크에 있는 호스트가 인터넷과 통신할 수 있도록 사설 IP를 공인 IP와 매칭해주는 기술
- SNAT: Source NAT. (일반적인 경우) 호스트의 사설 IP를 공인 IP로 변경하는 기술
- DNAT: Destination NAT. (일반적인 경우) 로드밸런서의 IP를 통해 요청을 받고 이것을 실제 서버로 전달하기 위해 IP를 변경하는 기술
- MASQUERADE: PAT/NAPT(Port Address Translation/Network Address Port Translation). (일반적인 경우) 여러 로컬 호스트들이 공인 IP 하나만 가지고 인터넷과 통신하기 위해 공인IP+포트넘버를 사설IP와 매칭해서 사용하는 기술.
- Static / Dynamic NAT(PAT)가 있는데, static은 1:1 매칭으로 연결시켜 놓는것을 말하고, dynamic은 라우터가 자동으로 할당하고 수거하는 것을 말한다.
iptables CRUD 명령어
SNAT, DNAT, MASQUERADE 실습
iptables 옵션 및 자주 사용하는 구문
> iptables [-t [테이블]] [기본 명령어] [Chain] [제어옵션 명령어] -j [Target]
# 특정 IP 허용
> iptables -I INPUT -s 210.158.63.128 -j ACCEPT
# MASQUERADE
> iptables -t nat -A POSTROUTING -s 172.17.0.10/24 -o eth0 -j MASQUERADE
# DNAT
> iptables -t nat -A PREROUTING -d 200.200.200.10 -j DNAT --to-destination 172.128.0.11
# 테이블 데이터 삭제
> iptables -F -t nat
IP Forwarding vs. Port Forwarding
- IP Forwarding: Routing과 같은 의미이다. 하나의 호스트 내부적으로 보자면, NIC(Network Interface Card)는 다른 NIC의 IP에 해당하는 목적지의 패킷을 받았을 때 이를 전달하는 기능이 있다. 이것을 IP Forwarding 이라고 한다.
- Port Forwarding: PAT는 보통 Dynamic 형태이기 때문에 outbound 패킷은 송수신이 가능하나 inbound 패킷은 통신이 불가하다. (외부->내부로 올 때 포트-local ip 매칭이 테이블에 없기 때문에.) 그래서 이것을 Static 하게 고정해주면(공유기 공인 ip:port-로컬 ip:port) inbound 패킷의 처리가 가능해진다. NAPT 부분 Port forwarding 참고
6. Prerequisite - SSH 터널링
SSH 터널링이 뭐야?
- 방화벽으로 막혀있는 포트에 접속하기 위해 방화벽 너머의 호스트에 있는 SSH 서버에 접속하는 것을 'SSH 터널을 생성한다.'고 한다. 그리고 이 SSH 연결을 거쳐서 원하는 포트에 접속하는 것을 SSH 터널링이라고 한다.
- SSH는 암호화 통신이다.
- SSH 명령어는 터널을 생성하는 쪽인 SSH Client에서 입력한다.
- sshd는 SSH Daemon으로 SSH 연결 요청을 받아주는 프로세스를 의미한다. 이 포스트에서는 SSH 서버와 같은 의미이다.
- 터널링 종류 설명
- SSH 설명
로컬 SSH 터널링
- 클라이언트에서 SSH 클라이언트 프로그램이 작동되고, 서버에서 SSH 서버 프로그램이 작동되어 연결되는 방식 (정방향 터널링)
flowchart LR SSH_Client-->SSH_Server subgraph Client SSH_Client("SSH Client(8888)") end subgraph Server direction BT SSH_Server("SSH Server(22)\n1.2.3.4")-->Web_Server("Web Server(8080)\n127.0.0.1") end
# [SSH 클라이언트의 N포트로 들어와]:[그럼 웹서버 IP의:N포트로 연결해줄게] [SSH 서버 이름은 이거고@SSH 서버 IP는 이거야]
> ssh -L ([로컬 ip]:)[로컬 포트]:[원격지 ip]:[원격지 포트] [SSH 서버 username]@[SSH 서버 ip]
> ssh -L 8888:127.0.0.1:8080 username@1.2.3.4
flowchart LR SSH_Client-->SSH_Server subgraph Client SSH_Client("SSH Client(8888)") end subgraph 내부망 SSH_Server-->Web_Server subgraph Bastion SSH_Server("SSH Server(8888)\n1.2.3.4") end subgraph Server Web_Server("Web Server(8080)\n192.168.2.2") end end
# [SSH 서버의 IP와:N포트로 들어와]:[그럼 웹서버 IP의:N포트로 연결해줄게] [SSH 서버의 이름은 이거고@SSH 서버의 IP는 이거야]
> ssh -L 1.2.3.4:8888:192.168.2.2:8080 username@1.2.3.4
리모트 SSH 터널링
- 클라이언트 호스트에서 SSH 서버 프로그램이 작동되고, 서버에서 SSH 클라이언트 프로그램이 작동되어 연결되는 방식 (역방향 터널링)
- 말단의 클라이언트 호스트를 바로 연결하지 않고 보통 Gateway에 연결해둔다.
flowchart LR SSH_Client-->SSH_Server subgraph Gateway SSH_Server("SSH Server(8585)\n1.2.3.4") end subgraph 내부망 SSH_Client-->Web_Server subgraph SSH-Client SSH_Client("SSH Client(8888)\n127.0.0.1") end subgraph Server Web_Server("Web Server(8080)\n192.168.2.2") end end
> ssh -R 1.2.3.4:8585:192.168.2.2:8080 username@1.2.3.4
다이나믹 SSH 터널링
다이나믹 SSH 터널링 설명1
다이나믹 SSH 터널링 이미지
- SSH 클라이언트에서 지정한 포트를 통해 SSH 서버의 모든 포트(SOCKS)에 접근할 수 있는 방법 (정방향 터널링)
# [SSH 클라이언트의 N포트로 접속하면] [SSH 서버에 연결된 어떤 곳이던 연결해줄게]
> ssh -D 9090 sshd_admin@1.2.3.4