Search
Duplicate
📒

[Linux CLI] 05-1. 네트워크⭐

상태
수정중
수업
Linux
주제
연관 노트
3 more properties
참고

리눅스 기본 네트워킹

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을 등록하면 된다.
hostsDNS 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.
명령실행
google.com 도메인의 IP주소를 찾으라는 요청을 시작!
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.comDNS 서버 정보를 반환한다
이후 로컬 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에 접근하려면 다음과 같이 입력