참고
리눅스 기본 네트워킹
NOTE
•
이더넷
◦
유선을 사용해 기기를 연결하는 네트워킹 기술로 주로 근거리 통신망(LAN)에서 사용된다.
•
인터페이스
◦
네트워크 연결(물리 or 가상)
•
네트워크 인터페이스 컨트롤러/카드
◦
유선 표준, IEEE 802.11의 무선 표준 중 하나를 통해 네트워크에 물리적 연결을 제공한다.
◦
네트워크의 일부가된 NIC는 전송하려는 바이트의 디지털 표현을 전기 혹은 전자기 신호로 바꿔준다.
Switching(서브넷 개념)
NOTE
Switch는 허브와 같이 컴퓨터 컴퓨터 간 통신을 돕는 장치! (LAN 네트워크 생성!)
Switch는 MAC 주소를 기반으로 통신한다.
ip link # 네트워크 인터페이스 확인 (eth0 확인)
sudo ip addr add 192.168.1.10/24 dev eth0
sudo ip addr add 192.168.1.11/24 dev eth0
sudo ip link set eth0 up # switch 내부의 네트워크에 정보등록
ip addr show # 모든 네트워크 인터페이스 IP확인(link로는 Mac주소나 상태만 보여줌)
ping 192.168.1.11 # A -> B 통신이 가능해진다!
Bash
복사
Routing / Gateway
NOTE
그러면 ‘각 네트워크 간 통신’은 어떻게 해야하는가?
A → C로 가려면 어떻게 해야하는가? (A와 C 양측에서 라우터로 B를 지정하면된다)
네트워크의 크기가 점점 커지고, 먼 지역에 위치한 네트워크와 통신해야 하는 필요성이 늘어나면서 라우터가 등장했다.
Routing을 통해 Switching으로 만들어진 네트워크 그룹을 통신가능하게 한다.
route # route table 확인(설치필요 할 수 있음)
ip addr add 192.168.2.10/24 dev eth0 # 2번째 스위치 구성
ip addr add 192.168.2.11/24 dev eth0
ip link set eth0 up
ip route add 192.168.1.0/24 via 192.168.2.1 # 라우터 설정
ip route add 192.168.2.0/24 via 192.168.1.1 # 라우터 설정
ip route add default via 192.168.2.1
route
Bash
복사
실제 route 확인
라우터는 네트워크 주소가 서로 다른 장비들을 연결할 때 사용한다.
•
192.168.1.x, 1992.168.2.x를 사용하는 네트워크를 연결한다고 가정해보자.
•
ip route add 192.168.2.0/24 via 192.168.1.1 명령어를 통해 192.168.1.1 게이트웨이를 거치면 컴퓨터 B → 컴퓨터 C 방향으로 접근할 수 있게된다.
•
한편, 이러한 설정을 일일히 수행해야하는데 컴퓨터 C → 컴퓨터 B에 접근하기 위해서도 작성해야하고, 모든 네트워크를 이럴수는 없으므로 default gateway 생성도 가능하다.
Router
•
라우팅 테이블을 이용해서 어떤 경로로 데이터 패킷을 전송할지 결정한다.
Gateway
•
서로 다른 네트워크 프로토콜을 사용하는 네트워크 간의 통신을 가능하게 한다.
•
로컬 네트워크 환경에서의 게이트웨이 ⇒ 기본 게이트웨이, 외부 네트워크(인터넷)로의 출구점을 의미한다.
하지만 route를 연결한 것만으로는 통신이 되지 않는다.
•
리눅스 패킷은 기본적으로 한 인터페이스에서 다른 인터페이스로 foward되지 않기 때문 (보안이슈)
•
etho이 사설망, eth1이 공용망인 경우, 기밀정보가 외부로 나가기 때문
•
network간 패킷동인이 가능한 설정파일은 /proc/sys/net/ipv4/ip_foward 확인
◦
1이면 가능, 0이면 불가능
리눅스 DNS
Name Resolution
NOTE
Name Resolution ⇒ /etc/hosts에 정의된 ip -이름을 맵핑해서 통신하는방법!
A,B,C의 서버에는 각각의 IP정보를 담은 /etc/hosts파일이 있다.
# A(web) -> B(db) 통신
# etc/hosts에 192.168.1.11 db 정보가 있기에 가능하다.
pin db
ssh db
Bash
복사
•
하지만 서버가 많아지면, 각 서버마다 /etc/hosts 파일로 DNS를 관리하기가 점점 어려워진다.
•
그래서 아예 DNS 정보를 저장하는 서버를 하나두고, 그 서버에 접근해서 /etc/hosts 파일을 받아오는 구조로 변경된다. ⇒ DNS Server
DNS Server
NOTE
DNS ⇒ /etc/resolv.conf 파일에서 DNS 서버 경로를 확인할 수 있다!
DNS서버에 검색한뒤, 검색한다.
•
/etc/resolv.conf 파일에서 DNS 서버 경로를 확인할 수 있다.
◦
host값을 받았는데 ip주소를 모르겠다면, 바로 DNS 서버에 요청을 보내는 식으로 동작함
◦
DNS 서버와 별개로 접근하고 싶은 private server가 있을 경우 /etc/hosts에 지정
◦
만약 hosts/DNS Server 둘다 값이 없는경우 에러 발생
◦
web.mycompany.com을 web만으로 검색하려면 search mycompany.com을 등록하면 된다.
•
hosts와 DNS Server의 값이 다른경우, DNS 서버를 먼저 우선시한다.
◦
/etc/nsswitch.conf 옵션으로 조회 순서를 조정할수 있다.
◦
ex) hosts: file dns로 설정하면 hosts를 먼저 조회함
도메인 이름
NOTE
우리가 아는 사이트의 링크가 dot(.)으로 분절된 이유는 ‘그룹화’를 위해서이다.
Domain의 구조
•
com, edu, org, io등 맨 뒤에 붙는 구분자는 TLD(top level domains)다.
◦
com의 경우 상업 / 일반목적
◦
net의 경우 네트워크
◦
edu는 교육
◦
org는 NGO 단체
도메인을 IP로 바꾸는 과정
1.
2.
로컬 DNS 캐시 확인
•
운영체제는 먼저 로컬 DNS 캐시를 확인한다.
•
이 캐시는 이전에 질의했던 도메인 이름들의 IP주소 정보를 가지고 있다.
◦
ex) google.com의 ip주소가 캐시에 있으면 바로 반환하고 끝난다.
•
대부분의 시스템에서는 /etc/resolve.conf 파일에 설정된 DNS서버를 사용한다.
파일에 있는 내용
3.
로컬 DNS 서버 질의
•
로컬 DNS 캐시에 google.com에 대한 정보가 없다면, 운영체제는 설정된 로컬 DNS 서버에 질의를 보낸다.
•
로컬 DNS 서버는 일반적으로 ISP(Internet Service Provider)또는 공용 DNS 서버를 사용한다.
◦
ex) Google DNS 8.8.8.8, CloudFlare 1.1.1.1
4.
로컬 DNS 서버에서의 검색
•
로컬 DNS 서버도 먼저 자신의 캐시를 확인한다.
•
캐시가 존재한다면, 정보를 반환하고 없다면 로컬 DNS 서버는 DNS 계층 구조를 따라 DNS 계층 구조를 따라 Root DNS서버로 질의를 보낸다.
5.
Root DNS 서버로 질의
•
Root DNS서버 → TLD DNS 서버로 질의를 보내서 google.com의 DNS 서버 정보 요청
6.
TLD DNS 서버로 질의
•
로컬 DNS 서버 → TLD DNS 서버로 질의 보sorh google.com의 DNS 서버 정보 요청
7.
google.com의 DNS 서버로 질의
•
TLD DNS 서버는 google.com의 DNS 서버 정보를 반환한다
•
이후 로컬 DNS 서버는 google.com의 DNS 서버로 질의를 보내서 해당 도메인의 IP주소 요청
8.
IP 주소 반환
•
google.com의 DNS 서버는 도메인에 대응하는 IP주소를 로컬 DNS 서버에 반환한다.
9.
로컬 DNS 서버 → 클라이언트 IP 주소로 반환
•
로컬 DNS는 이 IP주소를 클라이언트에게 반환
DNS 명령어 - dig / nslookup
NOTE
도메인 서버에 호스트명을 검색하기 위한 명령어
# 두 명령어 모두 /etc/hosts가 아닌 DNS server부터 검색한다.
nslookup [도메인 주소]
dig [도메인 주소]
Bash
복사
dig로도 가능!
주소 입력
dig로 하면 더 자세히 나오더라
DNS 정리
NOTE
도메인 서버에 호스트명을 검색하기 위한 명령어
/etc/host.conf
특정 도메인과 IP 주소값을 매핑하는 파일
•
hosts: /etc/hosts 파일
•
bind: DNS를 말하며, /etc/resolv.conf에 정의된 nameserver를 의미한다.
•
nis: NIS에 의한 도메인 쿼리를 말한다.
어떤 PC로 부터 자신(DNS서버)에게 도메인 주소를 IP로 알려달라는 질의 요청이온다.
1.
/etc/hosts에서 검색
2.
/etc/resolv/conf 파일에 정의된 nameserver에 쿼리
/etc/resolv.conf
사용하고자 하는 nameserver를 정의한다.
•
DNS 클라이언트 설정을 정의
# 기본적인 설정 예제
# nameserver: DNS 서버의 IP 주소를 지정합니다.
nameserver 8.8.8.8
nameserver 8.8.4.4
# search: 도메인 이름을 검색할 때 사용할 도메인 목록을 지정합니다.
search example.com sub.example.com
# domain: 검색 시 사용할 기본 도메인 이름을 지정합니다.
# 일반적으로 seach와 사용되지 않는다.
domain example.com
# options: 다양한 설정 옵션을 지정할 수 있습니다.
# timeout: DNS 서버에 대한 응답을 기다리는 시간(초)입니다.
options timeout:2
# attempts: 각 DNS 서버에 대해 시도할 쿼리의 횟수입니다.
options attempts:3
# rotate: round-robin 방식으로 nameserver를 사용합니다.
options rotate
# ndots: FQDN(정규화된 도메인 이름)으로 간주할 점의 개수입니다.
options ndots:1
# debug: 디버그 정보를 출력합니다.
options debug
# inet6: IPv6를 사용하여 DNS 쿼리를 시도합니다.
options inet6
# single-request: 단일 요청으로 DNS 쿼리를 수행합니다.
options single-request
# single-request-reopen: 단일 요청을 재시도합니다.
options single-request-reopen
# no-tld-query: 최상위 도메인 쿼리를 하지 않습니다.
options no-tld-query
# use-vc: TCP를 사용하여 DNS 쿼리를 시도합니다.
options use-vc
Bash
복사
systemd-reoslved
ubuntu 18버전 이후부터 system-resolved가 DNS 해결을 관리한다.
이 서비스는 DNS 해결을 관리하며, 이 서비스는 DNS 쿼리를 처리하고 캐시하여 성능을 향상시킨다.
•
/etc/systemd/resolvedconf
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it under the
# terms of the GNU Lesser General Public License as published by the Free
# Software Foundation; either version 2.1 of the License, or (at your option)
# any later version.
#
# Entries in this file show the compile time defaults. Local configuration
# should be created by either modifying this file, or by creating "drop-ins" in
# the resolved.conf.d/ subdirectory. The latter is generally recommended.
# Defaults can be restored by simply deleting this file and all drop-ins.
#
# Use 'systemd-analyze cat-config systemd/resolved.conf' to display the full config.
#
# See resolved.conf(5) for details.
[Resolve]
# Some examples of DNS servers which may be used for DNS= and FallbackDNS=:
# Cloudflare: 1.1.1.1#cloudflare-dns.com 1.0.0.1#cloudflare-dns.com 2606:4700:4700::1111#cloudflare-dns.com 2606:4700:4700::1001#cloudflare-dns.com
# Google: 8.8.8.8#dns.google 8.8.4.4#dns.google 2001:4860:4860::8888#dns.google 2001:4860:4860::8844#dns.google
# Quad9: 9.9.9.9#dns.quad9.net 149.112.112.112#dns.quad9.net 2620:fe::fe#dns.quad9.net 2620:fe::9#dns.quad9.net
DNS=4.2.2.1 4.2.2.2 208.67.220.220
FallbackDNS=
Domains=
DNSSEC=yes
#DNSOverTLS=no
#MulticastDNS=no
#LLMNR=no
Cache=yes
#CacheFromLocalhost=no
DNSStubListener=yes
#DNSStubListenerExtra=
#ReadEtcHosts=yes
#ResolveUnicastSingleLabel=no
Bash
복사
[Resolve]
# DNS 서버 지정
DNS=8.8.8.8 8.4.4.4
# 실패시 사용할 DNS 서버
FallbackDNS=1.1.1.1 1.0.0.1
# 도메인 이름 지정
Domain=example.com
# Multicast DNS를 사용설정
MulticastDNS=yes
Bash
복사
•
systemd-resolved는 DNS, LLMNR, Multicast DNS를 통해 호스트 이름을 해석한다.
순서
1.
애플리케이션이 도메인 이름 해석을 요청.
•
사용자가 웹 브라우저, 터미널 등에서 도메인 이름을 입력한다.
•
애플리케이션은 해당 도메인 이름을 IP주소로 해석하기 위해 DNS 쿼리 생성
2.
systemd-resolved가 로컬 캐시를 확인.
•
systemd-resolved는 로컬 DNS 캐시확인
•
만약 해당 도메인 이름의 해석 결과가 캐시에 존재한다면 캐시반환
resolvectl flush-caches
Bash
복사
•
/etc/hosts 파일을 확인.
•
LLMNR 및 mDNS를 통해 로컬 네트워크 내에서 이름 해석 시도.
•
설정된 DNS 서버로 쿼리 전송.
•
DNSSEC 검증 (선택 사항).
•
최종 IP 주소를 반환하고 결과를 로컬 캐시에 저장.
resolvctl은 systemd-resolved와 상호작용하기 위해 사용하는 명령어로, DNS 해석 및 네트워크 이름 조회와 관련된 다양한 기능을 제공한다.
resolvectl [OPTIONS...] COMMAND ...
Send control commands to the network name resolution manager, or
resolve domain names, IPv4 and IPv6 addresses, DNS records, and services.
Commands:
query HOSTNAME|ADDRESS... Resolve domain names, IPv4 and IPv6 addresses
service [[NAME] TYPE] DOMAIN Resolve service (SRV)
openpgp EMAIL@DOMAIN... Query OpenPGP public key
tlsa DOMAIN[:PORT]... Query TLS public key
status [LINK...] Show link and server status
statistics Show resolver statistics
reset-statistics Reset resolver statistics
flush-caches Flush all local DNS caches
reset-server-features Forget learnt DNS server feature levels
dns [LINK [SERVER...]] Get/set per-interface DNS server address
domain [LINK [DOMAIN...]] Get/set per-interface search domain
default-route [LINK [BOOL]] Get/set per-interface default route flag
llmnr [LINK [MODE]] Get/set per-interface LLMNR mode
mdns [LINK [MODE]] Get/set per-interface MulticastDNS mode
dnsovertls [LINK [MODE]] Get/set per-interface DNS-over-TLS mode
dnssec [LINK [MODE]] Get/set per-interface DNSSEC mode
nta [LINK [DOMAIN...]] Get/set per-interface DNSSEC NTA
revert LINK Revert per-interface configuration
log-level [LEVEL] Get/set logging threshold for systemd-resolved
Options:
-h --help Show this help
--version Show package version
--no-pager Do not pipe output into a pager
-4 Resolve IPv4 addresses
-6 Resolve IPv6 addresses
-i --interface=INTERFACE Look on interface
-p --protocol=PROTO|help Look via protocol
-t --type=TYPE|help Query RR with DNS type
-c --class=CLASS|help Query RR with DNS class
--service-address=BOOL Resolve address for services (default: yes)
--service-txt=BOOL Resolve TXT records for services (default: yes)
--cname=BOOL Follow CNAME redirects (default: yes)
--validate=BOOL Allow DNSSEC validation (default: yes)
--synthesize=BOOL Allow synthetic response (default: yes)
--cache=BOOL Allow response from cache (default: yes)
--zone=BOOL Allow response from locally registered mDNS/LLMNR
records (default: yes)
--trust-anchor=BOOL Allow response from local trust anchor (default: yes)
--network=BOOL Allow response from network (default: yes)
--search=BOOL Use search domains for single-label names (default: yes)
--raw[=payload|packet] Dump the answer as binary data
--legend=BOOL Print headers and additional info (default: yes)
resolvectl status
resolvectl dns
resolvectl dns eth0
resolvectl query [domain or ip]
Bash
복사
도메인 네임스페이스
•
.(마침표)가 루트인 트리 구조
•
각 트리 노드와 리프에는 특정 공간에 대한 정보가 포함되어 있다.
•
demo.mhausenblas.info는 소위 최상위 도메인이 .info인 도메인이다.
리소스 레코드
•
도메인 네임스페이스의 노드나 리프에 있는 페이로드
네임 서버
•
도메인 트리에 대한 정보를 가지고 있는 프로그램
•
네임 서버가 네임스페이스에 대한 완전한 정보를 가지고 있는 경우 권위있는 네임서버라 한다.
리졸버
•
클라이언트 요청에 대한 응답으로 네임서버에서 정보를 추출
•
로컬에 있는 시스템이며, 리졸버와 클라이언트 간의 상호 작용을 위해 정의된 명시적인 프로토콜은 없다,.
# 두 명령어 모두 /etc/hosts가 아닌 DNS server부터 검색한다.
nslookup [도메인 주소]
dig [도메인 주소]
Bash
복사
dig로도 가능!
네트워크 네임스페이스
NOTE
네임스페이스 ⇒ 프로세스를 실행할 때 시스템의 리소스를 분리해서 실행해주는 기능!
/proc/<PID>/ns 디렉토리에서 현재 프로세스에서 사용하고 있는 네임스페이스의 ID확인이 가능하다.
•
네임스페이스의 종류
◦
Cgroup 네임스페이스
◦
IPC 네임스페이스
◦
네트워크 네임스페이스
◦
PID 네임스페이스
네임스페이스 실습
NOTE
# veth에 ip주소 추가
ip netns exec red ip addr add 192.168.15.1/24 dev veth-red
ip netns exec blue ip addr add 192.168.15.2/24 dev veth-blue
# ping 통신
ip netns exec red ping 192.168.15.2
Bash
복사
•
네트워크 네임스페이스를 통해 네트워크 환경을 분리하면 네임스페이스에 속한 프로세스들에게 새로운 IP를 부여하거나, 네트워크 인터페이스를 추가하는것이 가능하다!
•
위의 과정을 마무리하면, 2개의 namespace에서는 ARP table에 서로의 정보가 저장되어 통신이 가능해진다.
Bridge ⇒ 이너젯 주소 기반으로 통신하며, 가상 네트워크 스위치 역할을 해준다.
•
여러개의 network를 연결하려면, Virtual Switch를 생성한뒤 Namespace를 연결한다.
◦
Virtual Switch를 생성하기위해서는, linux-bridge, Open vSwitch등의 방법이 존재한다.
◦
위와같은 설정이후에 host에서 ping으로 namespace에 통신이 가능해진다.
namespace가 Gateway를 타고가야한다.
•
Namespace를 host외부 네트워크와 연결하기 위해서는?
# Router 설정
ip netns exec blue ip route add 192.168.1.0/24 via 192.168.15.5
# Nat 설정
iptable -t nat -A POSTROUTING -s 192.168.15.0/24 -j MASQUERADE
Bash
복사
ex) blue Namespace에서 host의 gateway에 접근하려면 다음과 같이 입력