1. 시스템 설치 직후 초기 설정을 그대로 쓰지 않는 이유

시스템 설치 직후 초기 설정을 그대로 사용하지 않는 예로는 다음과 같은 경우가 있습니다:

디폴트 관리자 계정 변경: 디폴트 관리자 계정을 그대로 두면 해킹의 위험이 높아질 수 있습니다. 공격자가 일반적인 사용자 이름을 알고 있으면 쉽게 접근할 수 있기 때문에, 강력한 고유 사용자 이름으로 변경하는 것이 좋습니다.

비밀번호 변경: 초기 비밀번호는 쉽게 추측할 수 있으므로, 강력한 비밀번호로 변경해야 합니다. 이는 보안을 강화하기 위한 기본적인 조치입니다.

디폴트 포트 변경: 예를 들어, 웹 서버의 디폴트 포트인 80을 다른 포트로 변경하는 것은 공격자가 일반적으로 사용하는 포트를 스캔하는 것을 방지하기 위한 방법입니다.

서비스 비활성화: 기본적으로 활성화된 서비스 중 불필요한 것들은 비활성화하여 공격의 표면적을 줄이는 것이 좋습니다. 예를 들어, FTP 서비스가 필요 없다면 이를 비활성화하는 것이 안전합니다.

방화벽 설정: 기본 방화벽 설정을 그대로 두기보다는, 필요한 포트만 열고 나머지는 차단하여 보안을 강화할 수 있습니다.

이러한 초기 설정 변경은 보안을 강화하고 시스템을 더욱 안전하게 만드는 데 중요한 역할을 합니다.

 

2.  iptables

iptables는 리눅스에서 방화벽을 설정하고 관리하는 데 사용되는 명령어입니다. 주로 다음과 같은 용도로 사용됩니다:
패킷 필터링: 네트워크 트래픽을 검사하고, 특정 조건에 맞는 패킷을 허용하거나 차단할 수 있습니다.

NAT(Network Address Translation): 내부 네트워크의 IP 주소를 외부에서 접근할 수 있는 주소로 변환하여 인터넷과 연결할 수 있게 합니다.

포트 포워딩: 특정 포트로 들어오는 트래픽을 다른 포트나 IP 주소로 전달할 수 있습니다.
로그 기록: 특정 패킷이나 트래픽을 기록하여 보안 분석이나 문제 해결에 활용할 수 있습니다.
상태 기반 필터링: 연결의 상태를 기반으로 패킷을 허용하거나 차단하여, 더 정교한 보안 정책을 적용할 수 있습니다.
사용자 정의 체인 및 규칙: 기본 체인 외에 사용자 정의 체인을 만들어 특정 요구 사항에 맞게 규칙을 설정할 수 있습니다.

 

또한, RHEL 5부터는 iptables 외에도 firewalld라는 새로운 방화벽 관리 도구가 도입되었습니다. firewalld는 동적인 방화벽 관리를 지원하고, 더 직관적인 명령어와 GUI를 제공하여 사용이 편리합니다. 하지만 iptables는 여전히 RHEL에서 사용할 수 있으며, 많은 사용자들이 기존의 스크립트나 설정을 유지하기 위해 iptables를 계속 사용하고 있습니다. 따라서 RHEL 7 이상에서도 iptables는 여전히 존재하지만, 기본적으로는 firewalld가 권장됩니다.

결론적으로, RHEL 5 이후에도 iptables는 사용 가능하지만, 새로운 시스템에서는 firewalld가 더 많이 사용되고 있습니다.

 

3.  iptables 명령어 예시

- 기본 정책 설정:
모든 트래픽을 기본적으로 차단하고, 특정 트래픽만 허용하는 경우:
bash
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT


- SSH(포트 22) 허용:
SSH 접속을 허용하려면 다음과 같이 설정합니다:
bash
iptables -A INPUT -p tcp --dport 22 -j ACCEPT


- HTTP(포트 80) 및 HTTPS(포트 443) 허용:
웹 서버에 대한 트래픽을 허용하려면:
bash
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT


- 특정 IP 주소에서의 접근 허용:
특정 IP(예: 192.168.1.100)에서의 접근을 허용하려면:
bash
iptables -A INPUT -s 192.168.1.100 -j ACCEPT


- ICMP(핑) 허용:
ICMP 패킷을 허용하여 핑 요청을 받을 수 있게 하려면:
bash
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT


- 규칙 목록 확인:
현재 설정된 규칙을 확인하려면:
bash
iptables -L -n -v


- 규칙 삭제:
특정 규칙을 삭제하려면, 해당 규칙의 번호를 확인한 후 다음과 같이 삭제합니다:
bash
iptables -D INPUT 1


- 규칙 저장:
설정한 규칙을 저장하여 재부팅 후에도 유지하려면:
bash
service iptables save

 

4.  RHEL7에서 firewalld가 iptables를 대체한 이유

- 동적 관리: firewalld는 방화벽 규칙을 실시간으로 변경할 수 있어, 서비스 중단 없이 설정을 업데이트할 수 있습니다. 반면에 iptables는 규칙을 변경할 때 전체 방화벽을 재시작해야 했습니다.

- 영역 기반 설정: firewalld는 네트워크 영역(zone) 개념을 도입하여, 각 영역에 대해 서로 다른 규칙을 쉽게 적용할 수 있습니다. 이를 통해 더 유연하고 직관적인 관리가 가능합니다.
- 간편한 명령어: firewalld는 명령어와 설정 파일이 직관적이어서 사용자가 이해하고 관리하기가 더 쉽습니다. GUI 도구도 제공하여 비전문가도 쉽게 사용할 수 있습니다.
- 서비스 기반 규칙: firewalld는 서비스 단위로 규칙을 설정할 수 있어, 포트 번호를 직접 지정하지 않고도 간편하게 설정할 수 있습니다.
- 상태 기반 필터링: firewalld는 상태 기반 필터링을 기본적으로 지원하여, 연결 상태에 따라 패킷을 자동으로 관리합니다.

5.  보안 감사 도구

보안 감사 도구는 시스템, 네트워크, 애플리케이션의 보안을 평가하고 취약점을 식별하는 데 사용됩니다. 다음은 다양한 보안 감사 도구의 종류입니다.

1. 취약점 스캐너
Nessus: 네트워크 취약점 스캐닝 도구로, 다양한 취약점을 탐지합니다.
OpenVAS: 오픈 소스 취약점 스캐너로, 다양한 보안 검사 기능을 제공합니다.


2. 침투 테스트 도구
Metasploit: 침투 테스트 및 취약점 개발 프레임워크로, 공격 시나리오를 테스트하는 데 사용됩니다.
Burp Suite: 웹 애플리케이션 보안 테스트 도구로, 다양한 공격 기법을 지원합니다.


3. 로그 분석 도구
Splunk: 로그 데이터를 수집하고 분석하여 보안 이벤트를 모니터링합니다.
ELK Stack (Elasticsearch, Logstash, Kibana): 로그 수집, 저장, 분석 및 시각화를 위한 오픈 소스 도구입니다.


4. 네트워크 분석 도구
Wireshark: 네트워크 패킷을 캡처하고 분석하여 보안 문제를 식별하는 도구입니다.
Nmap: 네트워크 탐색 및 보안 감사 도구로, 호스트 및 서비스 정보를 수집합니다.


5. 파일 무결성 검사 도구
Tripwire: 파일 시스템의 무결성을 모니터링하고 변경 사항을 기록합니다.
AIDE (Advanced Intrusion Detection Environment): 파일 무결성 검사 및 침입 탐지 시스템입니다.


6. 악성 코드 분석 도구
Cuckoo Sandbox: 악성 소프트웨어 분석을 위한 자동화된 샌드박스 환경입니다.
VirusTotal: 파일이나 URL을 여러 안티바이러스 엔진으로 검사할 수 있는 서비스입니다.


7. 보안 정보 및 이벤트 관리(SIEM) 도구
IBM QRadar: 보안 이벤트 및 로그 데이터를 분석하여 위협을 탐지합니다.
ArcSight: 실시간 보안 모니터링 및 분석을 제공하는 SIEM 솔루션입니다.
이러한 도구들은 보안 감사 과정에서 중요한 역할을 하며, 각 도구의 특성에 따라 적절하게 활용해야 합니다.

 

6.  SELinux는 무엇이고, 장점과 단점은 어떤 것이 있는가?

SELinux의 policy를 생성해 보았는가? SELinux의 Policy를 관리하는 방법은 무엇인가?

enforce와 permissive의 차이는?

 

SELinux란?
SELinux(Security-Enhanced Linux)는 리눅스 커널에 적용된 보안 모듈로, 시스템의 보안을 강화하기 위해 강력한 접근 제어 모델을 제공합니다. SELinux는 프로세스와 파일 간의 상호작용을 제어하고, 최소 권한 원칙을 통해 시스템을 보호합니다.

장점
강력한 보안: 프로세스와 자원의 접근을 엄격히 제한하여 보안 침해를 방지합니다.
정책 기반 관리: 세밀한 보안 정책을 정의하고 적용할 수 있어, 특정 상황에 맞는 보안을 설정할 수 있습니다.
침입 탐지: 비정상적인 접근 시도를 기록하고 경고를 발생시켜 침입 탐지 기능을 제공합니다.


단점
복잡성: 설정 및 관리가 복잡하고, 정책 작성이 어려울 수 있어 학습 곡선이 존재합니다.
호환성 문제: 일부 애플리케이션이 SELinux 정책에 의해 차단될 수 있어, 기존 시스템과의 호환성 문제가 발생할 수 있습니다.
디버깅 어려움: SELinux로 인해 발생하는 문제를 디버깅하는 것이 복잡할 수 있습니다.


SELinux 정책 생성
SELinux 정책을 생성하려면 policycoreutils, selinux-policy-devel 패키지가 필요합니다. 정책 파일을 작성하고, checkmodule, semodule_package, semodule 명령어를 사용하여 모듈을 컴파일하고 로드할 수 있습니다.

SELinux 정책 관리 방법
정책 확인: sestatus 명령어로 현재 SELinux 상태 및 정책을 확인합니다.
정책 수정: 정책 파일을 수정 후, semodule 명령어를 통해 적용합니다.
정책 생성: audit2allow 도구를 사용하여 감사 로그를 기반으로 새로운 정책을 생성할 수 있습니다.


Enforce와 Permissive의 차이
Enforcing 모드: SELinux가 정책을 강제로 적용하며, 정책 위반 시 접근이 거부됩니다.
Permissive 모드: SELinux가 정책을 적용하지 않지만, 위반되는 모든 동작을 로그로 기록합니다. 이 모드에서 정책을 테스트할 수 있습니다.

SELinux 는 enforce, permissive, disable 3 가지 모드가 있으며 기본 설정은 enforce mode이고 보안 정책에 위배되는 모든 액션이 차단됩니다.


7.  컨테이너의 경우는 어떤 방법으로 보안과 관련된 검사를 할 수 있는가?

1. 취약점 스캐닝
도구 사용: Clair, Trivy, Anchore와 같은 도구를 사용하여 컨테이너 이미지에서 알려진 취약점을 스캔합니다.
주기적 검사: 컨테이너 이미지를 배포하기 전에 스캔하고, 주기적으로 최신 상태를 유지합니다.


2. 시큐리티 베스트 프랙티스 준수
최소 권한 원칙: 컨테이너에서 필요한 최소한의 권한만 부여합니다.
불필요한 패키지 제거: 이미지에서 불필요한 패키지와 서비스를 제거하여 공격 표면을 줄입니다.


3. 컨테이너 런타임 보안
도구 사용: Falco, Sysdig와 같은 런타임 보안 도구를 사용하여 컨테이너 실행 중 비정상적인 활동을 모니터링합니다.
정상 동작 정의: 정상적인 동작을 정의하고 이를 벗어난 행동에 대해 경고를 설정합니다.


4. 네트워크 보안
네트워크 정책 설정: Kubernetes와 같은 오케스트레이션 도구에서 네트워크 정책을 설정하여 컨테이너 간의 통신을 제어합니다.
전송 암호화: 컨테이너 간 데이터 전송 시 암호화하여 데이터 유출을 방지합니다.


5. 로그 및 모니터링
로그 수집: 컨테이너의 로그를 중앙 집중식으로 수집하고 분석하여 이상 징후를 탐지합니다.
모니터링 도구: Prometheus, Grafana 등을 사용하여 성능 및 보안 관련 메트릭을 모니터링합니다.


6. 정책 관리
Opa (Open Policy Agent): 정책 기반 접근 제어를 통해 컨테이너의 보안을 관리합니다.
PodSecurityPolicy: Kubernetes에서 Pod의 보안 설정을 관리하는 도구입니다.


7. 컨테이너 이미지 서명
이미지 서명: Docker Content Trust를 사용하여 이미지가 신뢰할 수 있는 출처에서 왔는지 확인합니다.
서명 검증: 배포 전에 이미지 서명을 검증하여 무결성을 보장합니다.
이러한 방법들을 통해 컨테이너의 보안을 강화하고, 잠재적인 위협을 사전에 차단할 수 있습니다.

 

8.  Vulnerability의 정의가 무엇인가? CVE / NVD / NIST가 무엇인가? 어떻게 확인할 수 있는가?

Vulnerability의 정의
**Vulnerability(취약점)**는 시스템, 애플리케이션, 네트워크 등에서 악용될 수 있는 약점을 의미합니다. 공격자는 이러한 취약점을 이용하여 비인가 접근, 데이터 유출, 서비스 거부 공격 등의 악의적인 행위를 수행할 수 있습니다.

CVE, NVD, NIST의 정의
CVE (Common Vulnerabilities and Exposures)

CVE는 공개적으로 알려진 취약점의 리스트입니다. 각 취약점에 대해 고유한 식별자(CVE ID)를 부여하여, 다양한 보안 도구와 데이터베이스에서 일관되게 참조할 수 있도록 합니다.
NVD (National Vulnerability Database)

NVD는 미국 정부가 운영하는 취약점 데이터베이스로, CVE 목록을 기반으로 하여 더 상세한 정보를 제공합니다. 각 취약점에 대한 메타데이터, 심각도 평가(CVSS 점수), 패치 정보 등을 포함하고 있습니다.
NIST (National Institute of Standards and Technology)

NIST는 미국 국립표준기술연구소로, 정보 보안 및 취약점 관리와 관련된 표준과 가이드라인을 제공합니다. NVD는 NIST의 일부로 운영되며, 보안 취약점에 대한 정책과 지침을 개발합니다.
확인 방법
CVE 확인

CVE 목록은 CVE 공식 웹사이트에서 검색할 수 있습니다. 특정 취약점에 대한 정보를 CVE ID로 검색하여 확인할 수 있습니다.
NVD 확인

NVD는 NVD 웹사이트에서 제공하며, CVE ID로 검색하거나 다양한 필터를 사용하여 취약점을 찾을 수 있습니다. CVSS 점수와 같은 추가 정보를 제공받을 수 있습니다.
NIST 확인

NIST의 정보는 NIST 웹사이트에서 확인할 수 있으며, 보안 관련 가이드라인과 표준을 검색할 수 있습니다. 특히, NVD와 함께 사용하여 취약점 관리에 대한 통찰을 얻을 수 있습니다.
이러한 리소스를 활용하여 시스템과 애플리케이션의 취약점을 주기적으로 확인하고 대응할 수 있습니다.

 

9.  SSL 인증서의 종류는 어떤 것이 있는가? 인증서 체인 메커니즘?

SSL 인증서의 종류
도메인 인증서 (Domain Validated Certificate, DV)

도메인 소유자임을 확인하는 최소한의 검증을 요구합니다. 빠르게 발급되며, 기본적인 보안 제공.
기업 인증서 (Organization Validated Certificate, OV)

도메인 소유자뿐만 아니라 기업의 실체도 검증합니다. 인증서에 기업 정보가 포함되어 신뢰성을 높입니다.
확장 인증서 (Extended Validation Certificate, EV)

가장 높은 수준의 검증을 요구하며, 기업의 신원과 법적 실체를 철저히 검증합니다. 브라우저 주소창에 회사 이름이 표시되어 사용자에게 신뢰를 제공합니다.
Wildcard 인증서

주 도메인과 그 하위 도메인에 대해 SSL 보안을 제공하는 인증서입니다. 예를 들어, *.example.com을 사용하면 http://www.example.com, mail.example.com 등 모든 하위 도메인에 적용됩니다.
다중 도메인 인증서 (Multi-Domain Certificate)

여러 개의 도메인에 대해 SSL 보안을 제공할 수 있는 인증서입니다. 예를 들어, example.com, example.net, example.org 등을 하나의 인증서로 보호할 수 있습니다.
인증서 체인 메커니즘
SSL 인증서 체인은 인증서의 신뢰성을 보장하는 메커니즘입니다. 다음과 같은 구조로 이루어져 있습니다:

루트 인증서 (Root Certificate)

신뢰할 수 있는 인증기관(CA)에서 발급된 인증서로, 브라우저나 운영체제에 내장되어 있습니다. 루트 인증서는 직접적으로 사용되지 않고, 다른 인증서를 신뢰하는 기반이 됩니다.
중간 인증서 (Intermediate Certificate)

루트 인증서와 최종 사용자 인증서 간의 연결 역할을 하는 인증서입니다. 중간 인증서를 통해 루트 인증서의 보안을 강화하고, 인증서 발급의 유연성을 높입니다.
최종 사용자 인증서 (End-Entity Certificate)

실제 도메인에 발급된 SSL 인증서로, 웹사이트와 사용자 간의 보안 연결을 제공합니다.
인증서 체인은 브라우저가 웹사이트와 연결할 때 인증서의 신뢰성을 검증하는 데 사용됩니다. 브라우저는 최종 사용자 인증서에서 시작하여 중간 인증서, 루트 인증서로 올라가며, 각 단계에서 인증서의 유효성을 체크합니다.

왜 쓰는가?


데이터 암호화

SSL 인증서는 클라이언트와 서버 간의 데이터 전송을 암호화하여 도청 및 데이터 변조를 방지합니다.
신뢰성

인증서를 통해 웹사이트의 신원을 확인할 수 있어 사용자에게 신뢰를 제공합니다. 특히 EV 인증서는 기업의 신뢰성을 더욱 높여줍니다.
SEO 혜택

구글 등 검색 엔진은 HTTPS를 사용하는 웹사이트에 대해 더 높은 순위를 부여하므로, SEO에 긍정적인 영향을 미칩니다.
법적 요구사항

특정 산업에서는 SSL 인증서 사용이 법적으로 요구되기도 하며, 데이터 보호 및 규정 준수를 위해 필수적입니다.
이러한 이유로 SSL 인증서는 웹사이트의 보안과 신뢰성을 확보하는 데 중요한 역할을 합니다.

 

10.  브라우저에서 인증서 체인 메커니즘 예시

SSL 인증서 체인 메커니즘의 실제 예시를 통해 이해를 돕겠습니다.

예시: 웹사이트의 SSL 인증서 체인
루트 인증서

예를 들어, Let's Encrypt 또는 DigiCert와 같은 공인 인증기관(CA)에서 발급한 루트 인증서가 있습니다. 이 루트 인증서는 브라우저에 사전 설치되어 있어, 사용자가 직접적으로 인식하지 못합니다.
중간 인증서

루트 인증서 아래에 Intermediate CA가 존재합니다. 예를 들어, Let's Encrypt의 경우 ISRG Root X1이라는 루트 인증서가 있고, 그 아래에 여러 중간 인증서가 있을 수 있습니다. 이 중간 인증서는 루트 인증서의 신뢰성을 이어받아 최종 사용자 인증서를 발급합니다.
최종 사용자 인증서

특정 도메인, 예를 들어 http://www.example.com에 대해 발급된 SSL 인증서입니다. 이 인증서는 중간 인증서의 서명을 받아 유효성을 갖추게 됩니다.
인증서 체인 구성
브라우저가 웹사이트에 접속할 때의 과정:
사용자가 https://www.example.com에 접속하면, 서버는 최종 사용자 인증서를 브라우저에 전송합니다.
브라우저는 이 인증서를 검증하기 위해 다음 단계를 진행합니다:
최종 사용자 인증서의 서명을 확인하기 위해 중간 인증서를 요청합니다.
중간 인증서의 서명을 확인하기 위해 루트 인증서를 참조합니다.
브라우저가 루트 인증서를 신뢰할 수 있다면, 인증서 체인이 완성되어 안전한 연결이 설정됩니다.


요약
이 과정에서 루트 인증서, 중간 인증서, 최종 사용자 인증서가 서로 연결되어 인증서 체인을 형성하며, 이를 통해 웹사이트의 신뢰성을 보장하고 데이터 전송을 안전하게 암호화합니다. 사용자는 이러한 과정을 통해 안전하게 웹사이트에 접속할 수 있습니다.

 

11.  JKS, PEM, CRT?

1. JKS (Java KeyStore)
형식: 바이너리 형식
용도: 주로 Java 애플리케이션에서 인증서와 개인 키를 저장하는 데 사용됩니다.
특징:
Java에서만 사용 가능하며, Java의 보안 API와 호환됩니다.
여러 인증서와 키를 하나의 파일에 저장할 수 있습니다.


2. PEM (Privacy-Enhanced Mail)
형식: 텍스트 형식 (Base64 인코딩)
용도: 인증서, 개인 키, CA 인증서 등을 저장하는 데 사용됩니다.
특징:
파일 확장자로는 주로 .pem, .crt, .key 등이 사용됩니다.
다양한 시스템에서 널리 사용되며, 쉽게 읽고 수정할 수 있습니다.


3. CRT (Certificate)
형식: 주로 PEM 형식과 동일하지만, 특정 인증서를 나타냅니다.
용도: SSL/TLS 인증서를 저장하는 데 사용됩니다.
특징:
파일 확장자로 .crt가 사용되며, 일반적으로 CA에 의해 서명된 인증서를 포함합니다.
PEM 형식으로 저장될 수 있지만, 특정 인증서 파일을 나타내는 데 사용됩니다.


요약
JKS: Java 전용 키 저장소, 바이너리 형식.
PEM: 텍스트 형식, 인증서 및 키를 저장하는 범용 형식.
CRT: 인증서를 저장하는 파일, 주로 PEM 형식으로 저장됨.

 

12.  지금 사용 중인 배포판에 설치된 모든 패키지의 Vulnerability의 Severity를 어떻게 확인할 것인가? 전체를 업데이트할 것인가? 특정 패키지만 업데이트하는 것이 좋다고 판단하는가?

리눅스 배포판에서 설치된 모든 패키지의 취약점(Severity)을 확인하고 관리하는 방법은 다음과 같습니다.

1. 패키지 취약점 확인 방법
패키지 관리 도구: 각 배포판에 따라 패키지 관리 도구를 사용하여 설치된 패키지의 취약점을 확인할 수 있습니다.

Debian/Ubuntu: apt-get과 apt list --upgradable 명령어를 사용하거나 apt update 후 apt upgrade.
RHEL/CentOS: yum 또는 dnf를 사용하여 yum updateinfo 명령어로 취약점 정보를 확인.
Arch Linux: pacman -Q로 패키지 리스트를 확인하고, pacman -Syu로 업데이트.
취약점 데이터베이스:

CVE (Common Vulnerabilities and Exposures) 데이터베이스를 참조하여 각 패키지에 대한 취약점 정보를 확인.
OSSEC나 OpenVAS 같은 보안 도구를 사용하여 시스템 전체의 취약점을 스캔.
2. 전체 업데이트 vs 특정 패키지 업데이트
전체 업데이트:

장점: 모든 패키지가 최신 상태로 유지되어 보안 취약점이 즉시 해결됩니다.
단점: 새로운 버전으로 인한 호환성 문제나 의도하지 않은 버그가 발생할 수 있습니다.
특정 패키지 업데이트:

장점: 문제를 일으킬 가능성을 줄이고, 안정성을 유지할 수 있습니다. 특정 취약점만 해결할 수 있습니다.
단점: 패키지 간의 의존성 문제가 발생할 수 있으며, 장기적으로는 전체 시스템의 보안이 약해질 수 있습니다.


3. 특정 OS 버전 고집 이유
호환성 문제: 특정 애플리케이션이나 시스템이 특정 버전에서만 안정적으로 작동할 수 있습니다.
장기 지원: RHEL과 같은 배포판은 장기 지원(LTS) 버전을 제공하여, 안정성과 보안 패치가 보장됩니다.
테스트와 검증: 새로운 버전이 출시되면, 조직 내에서 충분한 테스트와 검증이 필요합니다. 이를 위해 특정 버전을 유지할 수 있습니다.
비용 문제: 새로운 버전으로의 전환에는 추가적인 비용이 발생할 수 있습니다.


이러한 이유로 많은 기업이나 기관에서는 안정성과 호환성을 고려하여 특정 버전을 고수하는 경우가 많습니다.

 

13. 망분리를 해야 한다고 할때 어떤 방법으로 구현할 수 있을까?

가. 물리적 분리
독립된 네트워크: 서로 다른 네트워크를 물리적으로 분리하여, 각 네트워크에 연결된 장비들이 서로 통신할 수 없도록 합니다.
전용 장비 사용: 각 네트워크에 대해 전용 라우터와 스위치를 사용하여 보안을 강화합니다.


나. 논리적 분리
VLAN (가상 LAN): 네트워크 장비에서 VLAN을 설정하여 같은 물리적 네트워크 내에서 서로 다른 논리적 네트워크를 구성합니다.
방화벽 설정: 방화벽을 통해 서로 다른 네트워크 간의 트래픽을 제한하여 접근을 통제합니다.


다. 보안 솔루션 적용
IDS/IPS 시스템: 침입 탐지 시스템(IDS) 또는 침입 방지 시스템(IPS)을 도입하여 비정상적인 트래픽을 감지하고 차단합니다.
VPN (가상 사설망): 안전한 통신을 위해 VPN을 사용하여 네트워크 간의 안전한 연결을 유지합니다.


라. 접근 통제
정책 기반 접근 제어: 각 네트워크에 접근할 수 있는 사용자 및 장비를 정책적으로 관리하여 불필요한 접근을 차단합니다.
다중 인증: 사용자 인증을 강화하기 위해 다중 인증(MFA)을 적용하여 보안을 강화합니다.

 

14.  개발자가 특정 개발 도구(특정 버전 이상 등)을 사용해야 한다고 할 때 해당 배포판이 이를 지원하지 않으면 직접 컴파일해 쓰는 경우 보안에 어떤 위험이 있을까? 이를 어떤 방법으로 해결할 수 있는가?

 

개발자가 특정 개발 도구를 직접 컴파일하여 사용하는 경우, 보안에 여러 가지 위험이 존재할 수 있습니다. 다음은 그 위험과 해결 방법입니다.

보안 위험
취약점 포함 가능성:

직접 컴파일할 경우, 소스 코드에 알려진 취약점이 포함될 수 있으며, 이를 사전에 검토하지 않으면 보안 문제가 발생할 수 있습니다.
의존성 문제:

해당 도구가 의존하는 라이브러리나 패키지의 보안 취약점이 해결되지 않은 상태로 포함될 수 있습니다.
패치 관리 어려움:

공식 패키지가 아닌 경우, 보안 패치가 자동으로 적용되지 않아 지속적인 보안 관리가 어려워질 수 있습니다.
코드 품질 및 신뢰성:

직접 컴파일한 도구는 공식적으로 제공되는 패키지에 비해 품질이나 신뢰성이 떨어질 수 있습니다.
해결 방법
소스 코드 검토:

컴파일하기 전에 소스 코드를 철저히 검토하여 알려진 취약점이 없는지 확인합니다.
신뢰할 수 있는 출처 사용:

공식적으로 제공되는 소스 코드나 신뢰할 수 있는 저장소에서 다운로드하여 컴파일합니다.
패치 및 업데이트 관리:

정기적으로 소스 코드를 업데이트하고, 보안 패치가 발표되면 즉시 적용합니다.
의존성 관리 도구 사용:

의존성을 관리하는 도구(예: pkg-config, CMake, Poetry)를 사용하여 필요한 라이브러리가 안전한 버전인지 확인합니다.
컨테이너 사용:

Docker와 같은 컨테이너 기술을 활용하여 특정 도구를 격리된 환경에서 실행하고, 보안 업데이트를 쉽게 관리합니다.
가상 환경 설정:

가상 환경(예: Python의 venv, Node.js의 nvm)을 사용하여 개발 도구를 격리하고, 시스템 환경에 미치는 영향을 최소화합니다.
이러한 방법들을 통해 직접 컴파일한 도구의 보안 위험을 효과적으로 관리할 수 있습니다.

 

15. 특정 배포판이 특정 CVE에 안전한지 여부를 어떻게 확신할 수 있는가?

CVE 데이터베이스 확인: NVD(National Vulnerability Database)와 같은 공식 CVE 데이터베이스를 통해 해당 CVE에 대한 정보를 확인합니다.
배포판 보안 공지 확인: 해당 배포판의 공식 웹사이트나 보안 공지 페이지에서 CVE 관련 패치를 확인합니다.
패치 레벨 확인: 배포판에서 제공하는 패치 수준 및 업데이트 내역을 확인하여, 해당 CVE가 수정된 버전인지 확인합니다.

 

16.  배포판 업데이트 주기는 어떻게 가져가야 한다고 생각하는가?

정기적 업데이트: 보안 업데이트는 최소한 월 1회 이상 진행하는 것이 좋습니다.
비상 업데이트: 심각한 보안 취약점이 발견되면 즉시 업데이트를 적용합니다.
테스트 환경 운영: 업데이트 전에 테스트 환경에서 충분히 검증한 후, 프로덕션 환경에 적용합니다.

 

17.  어떤 컴포넌트나 라이브러리가 안전함을 어떻게 확신할 수 있는가? 업데이트 주기는 어떻게 판단하나 외부와 내부가 분리된 망에서 어떻게 업데이트를 할. 수 있을까?

신뢰할 수 있는 출처: 공식적으로 지원되는 배포판이나 라이브러리 저장소에서 다운로드합니다.
보안 감사: 오픈 소스 라이브러리의 경우, 커뮤니티에서 진행한 보안 감사 결과를 확인합니다.
버전 관리: 최신 안정 버전 사용을 권장하며, 이전 버전의 보안 이슈를 확인합니다.

 

업데이트 주기는 어떻게 판단하나
CVE 발표 주기: CVE가 발표되는 빈도에 따라 업데이트 주기를 결정합니다.
프로젝트의 중요도: 사용하는 컴포넌트나 라이브러리의 중요도에 따라 업데이트 주기를 조정합니다.
의존성 분석: 의존성 트리를 분석하여 보안 취약점이 있는 라이브러리의 업데이트를 우선적으로 진행합니다.


외부와 내부가 분리된 망에서 어떻게 업데이트를 할 수 있을까?
물리적 미디어 사용: 외부에서 업데이트 파일을 다운로드한 후, USB 등의 물리적 미디어를 사용하여 내부망에 전송합니다.
전용 업데이트 서버: 외부에서 업데이트를 다운로드하고, 이를 내부망에 있는 전용 업데이트 서버에 배포한 후, 내부 시스템에서 해당 서버를 통해 업데이트를 진행합니다.

 

18.  자바에서 사용하는 라이브러리의 보안 취약점을 실시간으로 확인할 수 있는 방법은 어떤 방법이 있는가? 이를 실시간 패치하는 방법은?

정적 코드 분석 도구: SonarQube, Snyk 등의 도구를 사용하여 코드에서 보안 취약점을 실시간으로 분석합니다.
의존성 검사 도구: OWASP Dependency-Check, Maven의 dependency-check-plugin 등을 통해 라이브러리의 CVE를 검사합니다.


이를 실시간 패치하는 방법은?
자동화된 빌드 시스템: CI/CD 파이프라인을 구성하여, 보안 취약점이 발견될 경우 자동으로 최신 버전으로 업데이트하도록 설정합니다.
패치 관리 도구: JFrog Artifactory와 같은 패치 관리 도구를 사용하여, 라이브러리의 최신 패치를 자동으로 적용할 수 있도록 설정합니다.
이러한 방법들을 통해 보안 취약점을 효과적으로 관리하고, 실시간으로 대응할 수 있습니다.

 

19.  배포판의 LTS의 의미는 무엇인가? 각 배포판의 Long-term support의 정책?


LTS(Long-Term Support)는 특정 배포판이 장기간 동안 안정적인 지원과 업데이트를 제공하는 정책을 의미합니다. 일반적으로 LTS 버전은 보안 업데이트와 버그 수정을 제공하며, 새로운 기능 추가는 최소화하여 안정성을 유지합니다.

각 배포판의 Long-term support 정책
Ubuntu:

LTS 버전은 2년에 한 번 출시되며, 5년 동안 보안 업데이트와 버그 수정을 제공합니다. LTS 버전은 기업 환경에서 많이 사용됩니다.
Debian:

Debian의 Stable 버전은 3년 이상 지원되며, 보안 업데이트는 그 기간 동안 제공됩니다. 새로운 안정화 버전이 출시되면 이전 버전은 보안 업데이트를 계속 받을 수 있습니다.
CentOS:

CentOS는 Red Hat Enterprise Linux(RHEL)의 무료 대안으로, RHEL과 동일한 지원 기간(약 10년)을 가집니다. 주요 업데이트는 3-4년에 한 번 발생하며, 보안 패치는 지속적으로 제공됩니다.
Fedora:

Fedora는 LTS 개념은 없지만, 각 릴리스는 약 13개월간 지원됩니다. 최신 기술을 반영하는 배포판으로, 자주 업데이트가 이루어집니다.
openSUSE:

openSUSE Leap은 약 3년간 지원되며, 보안 및 버그 수정 업데이트가 제공됩니다. Tumbleweed는 롤링 릴리스 모델로 지속적으로 업데이트됩니다.
이러한 LTS 정책은 기업이나 안정성이 중요한 환경에서 중요한 선택 요소가 됩니다. 각 배포판의 LTS 정책을 고려하여 적절한 선택을 하는 것이 필요합니다.

 

20.  MITM 공격에 대해서 이야기해보시오. 어떻게 방지할 수 있는가?

MITM 공격에 대해서 이야기해보시오.
MITM(Man-In-The-Middle) 공격은 공격자가 두 통신 당사자 사이에 개입하여 정보를 가로채거나 조작하는 공격 방식입니다. 이 공격은 일반적으로 다음과 같은 방식으로 이루어집니다:

가로채기: 공격자가 네트워크 트래픽을 가로채어 사용자의 데이터(예: 로그인 정보, 신용카드 정보)를 수집합니다.
정보 수정: 공격자가 통신 내용을 수정하여 피해자가 잘못된 정보를 수신하게 만들 수 있습니다.
신뢰성 위조: 공격자가 피해자에게 신뢰할 수 있는 서비스인 것처럼 가장하여 정보를 탈취합니다.
어떻게 방지할 수 있는가?
암호화 사용:

SSL/TLS를 사용하여 웹사이트와의 통신을 암호화합니다. HTTPS 프로토콜을 사용하는 웹사이트에 접속할 때 URL이 "https://"로 시작하는지 확인합니다.
신뢰할 수 있는 인증서 사용:

인증서가 신뢰할 수 있는 CA(Certificate Authority)에서 발급되었는지 확인합니다. 브라우저에서 경고 메시지가 나타나면 주의해야 합니다.
VPN 사용:

공공 Wi-Fi를 사용할 때는 VPN을 통해 트래픽을 암호화하여 외부 공격자로부터 보호합니다.
강력한 인증 방식:

다중 인증(MFA)을 사용하여 계정 보안을 강화합니다. 이 방식은 추가적인 인증 단계를 요구하여 보안성을 높입니다.
네트워크 보안 강화:

WPA3와 같은 강력한 무선 보안 프로토콜을 사용하여 무선 네트워크를 보호합니다.
정기적인 보안 점검:

시스템과 애플리케이션의 보안 패치를 정기적으로 적용하고, 취약점 스캐닝을 수행하여 보안을 강화합니다.
피싱 경고:

이메일이나 메시지를 통해 전달된 링크를 클릭할 때 주의하고, 출처를 확인하여 피싱 공격을 피합니다.
이러한 방법들을 통해 MITM 공격의 위험성을 줄이고, 데이터의 안전성을 높일 수 있습니다.

'Computer Science > Operating System' 카테고리의 다른 글

Linux - System Administration  (1) 2024.08.27

1. ARP,  DHCP

1. ARP 요청 (Address Resolution Protocol)
정의: ARP는 IP 주소를 MAC 주소로 변환하는 프로토콜입니다.
작동 방식:
ARP 요청: 특정 IP 주소에 해당하는 MAC 주소를 찾기 위해 해당 IP 주소를 가진 장치에게 브로드캐스트 요청을 보냅니다.
ARP 응답: 요청한 장치가 자신의 MAC 주소를 포함한 응답을 보내면, 송신자는 이 정보를 캐시에 저장합니다.
용도: 네트워크에서 데이터를 전송하기 위해 필요한 MAC 주소를 찾는 데 사용됩니다.


2. DHCP Discover (Dynamic Host Configuration Protocol)
정의: DHCP는 네트워크에 연결된 장치에 IP 주소와 기타 네트워크 설정을 자동으로 할당하는 프로토콜입니다.
작동 방식:
DHCP Discover: 새로운 장치가 네트워크에 연결되면, DHCP 서버를 찾기 위해 브로드캐스트 메시지를 보냅니다.
DHCP Offer: DHCP 서버가 해당 요청을 수신하면, 사용 가능한 IP 주소와 설정 정보를 포함한 응답을 보냅니다.
DHCP Request: 장치는 제공받은 정보를 바탕으로 특정 IP 주소를 요청합니다.
DHCP Acknowledgment: DHCP 서버가 요청을 확인하고 IP 주소를 할당합니다.
용도: 네트워크에 자동으로 IP 주소를 할당하여 관리의 편리함을 제공합니다.


- 요약
ARP 요청: IP 주소를 MAC 주소로 변환하기 위한 요청.
DHCP Discover: 네트워크 장치가 DHCP 서버에 IP 주소를 요청하는 첫 단계.

 

2. 데이터센터 네트워크의 특징

- 데이터센터 네트워크의 특징
고속 데이터 전송: 데이터센터 네트워크는 대량의 데이터를 빠르게 전송하기 위해 고속 링크(예: 10Gbps, 40Gbps, 100Gbps)를 사용합니다.
스케일 아웃 아키텍처: 수많은 서버와 스토리지를 수평적으로 확장할 수 있는 구조로 설계되어 있습니다.
고가용성: 장애 발생 시에도 서비스가 중단되지 않도록 이중화 및 페일오버 기능이 구현되어 있습니다.
가상화 지원: 서버와 네트워크 자원을 가상화하여 효율적으로 관리하고, 자원 할당을 동적으로 조정합니다.
소프트웨어 정의 네트워킹(SDN): 네트워크 관리와 제어를 소프트웨어로 구현하여 유연성과 자동화를 제공합니다.


- 네트워크 토폴로지 전략
동일 랙이 아닌 바로 옆 랙으로 대용량 트래픽이 발생해야 할 경우, 리프-스파인 토폴로지를 고려할 수 있습니다. 이 구조는 다음과 같은 장점을 제공합니다:
저지연성: 모든 서버가 스파인 스위치를 통해 직접 연결되어 있어 트래픽이 효율적으로 전달됩니다.
확장성: 필요에 따라 리프나 스파인 스위치를 추가하여 쉽게 확장할 수 있습니다.
고가용성: 각 노드가 여러 경로를 통해 연결되어 있어 장애에 강합니다.

 

- 내부 네트워크 트래픽 계산
10 페타바이트의 백엔드 스토리지가 있다고 가정할 때, 내부 네트워크 트래픽은 여러 요소에 따라 다르지만, 일반적으로 스토리지와 컴퓨팅 노드 간의 트래픽은 다음과 같이 계산할 수 있습니다:

I/O 작업 수: 스토리지에 대한 읽기/쓰기 요청 수.
데이터 전송량: 각 요청에 대해 전송되는 데이터의 양.

예시: 만약 하루에 1000회의 I/O 작업이 발생하고 각 작업에서 1GB의 데이터가 전송된다면,
내부 트래픽 = 1000 * 1GB = 1000GB = 1TB.


- 스토리지와 네트워크, 컴퓨팅 노드 간의 분산 전략

데이터 분산: 데이터를 여러 스토리지 노드에 분산 저장하여 I/O 부하를 분산시킵니다.
로컬 캐싱: 자주 사용되는 데이터를 캐싱하여 빠른 접근을 가능하게 합니다.
로드 밸런싱: 트래픽을 여러 경로로 분산시켜 네트워크의 과부하를 방지합니다.


- 외부 트래픽 대응
CDN 사용: 콘텐츠 전송 네트워크(CDN)를 활용하여 외부 사용자에게 더 가까운 위치에서 데이터를 제공하여 지연 시간을 줄입니다.
부하 분산: 외부 트래픽을 여러 서버에 고르게 분산시켜 서버의 과부하를 방지합니다.
보안: 방화벽과 DDoS 방어 시스템을 통해 외부 공격에 대비합니다.

 

3.프록시는 무엇인가? HTTP / SOCKS 4 / SOCKS5의 차이는?

프록시(Proxy)는 클라이언트와 서버 사이에서 중개 역할을 하는 서버로, 요청을 대신 전달하거나 응답을 대신 받아오는 기능을 합니다. 프록시는 주로 다음과 같은 용도로 사용됩니다:

익명성 제공: 클라이언트의 IP 주소를 숨겨 개인 정보를 보호합니다.
캐싱: 자주 요청되는 데이터를 저장하여 성능을 향상시킵니다.
접근 제어: 특정 웹사이트에 대한 접근을 제한하는 등의 보안 기능을 제공합니다.
트래픽 모니터링: 네트워크 트래픽을 분석하고 기록하는 데 사용됩니다.


- HTTP, SOCKS 4, SOCKS 5의 차이

 

- HTTP 프록시
프로토콜: HTTP 프로토콜을 사용합니다.
용도: 주로 웹 브라우징에 사용되며, HTTP 요청과 응답을 처리합니다.
특징: 웹 페이지의 요청을 중개하며, HTTPS를 지원하는 경우 SSL 터널링을 통해 보안 연결을 제공합니다.

 

- SOCKS 4
프로토콜: SOCKS 4 프로토콜을 사용합니다.
용도: TCP/IP 연결을 중개하며, 웹 브라우징뿐만 아니라 FTP, SMTP 등 다양한 프로토콜을 지원합니다.
특징: 인증 기능이 없으며, IP 주소와 포트 정보만 사용합니다.

- SOCKS 5
프로토콜: SOCKS 5 프로토콜을 사용합니다.
용도: SOCKS 4의 기능을 확장하여 TCP 및 UDP 연결을 모두 지원합니다.
특징: 인증 기능을 지원하여 보안을 강화하고, 다양한 프로토콜과 애플리케이션에서 사용할 수 있습니다. 또한, IPv6를 지원합니다.

 

- 요약

HTTP 프록시: 웹 트래픽 전용, HTTP 프로토콜 사용.
SOCKS 4: 다양한 프로토콜 지원, 인증 없음.
SOCKS 5: SOCKS 4의 확장, TCP/UDP 지원, 인증 기능 포함.

 

4. 로드밸런서는 무엇인가? 리버스 프록시와 차이는?

- 로드밸런서
로드밸런서는 클라이언트의 요청을 여러 서버에 분산시켜 시스템의 성능과 가용성을 향상시키는 장치입니다. 주로 다음과 같은 기능을 수행합니다:

트래픽 분산: 서버 간의 부하를 고르게 나누어 성능을 최적화합니다.
가용성 향상: 하나의 서버가 다운되더라도 다른 서버에서 요청을 처리할 수 있도록 합니다.
스케일링: 필요에 따라 서버를 추가하거나 제거하여 유연하게 대응할 수 있습니다.

 

- 리버스 프록시와의 차이
리버스 프록시: 클라이언트의 요청을 받아 실제 서버에 전달하고, 서버의 응답을 클라이언트에게 반환하는 역할을 합니다. 주로 보안, 캐싱, SSL 오프로드 등의 기능을 제공합니다.
로드밸런서: 클라이언트의 요청을 여러 서버에 분산하여 처리하는 역할에 집중합니다. 리버스 프록시 기능을 포함할 수도 있지만, 주된 목적은 부하 분산입니다.

 

5. 노스-사우스 트래픽과 이스트-웨스트 트래픽 L4/L7의 차이는?

소프트웨어, 하드웨어 차이는? SSL 오프로딩이 무엇인가?

 

- 노스-사우스 트래픽과 이스트-웨스트 트래픽
노스-사우스 트래픽: 클라이언트와 서버 간의 트래픽을 의미합니다. 예를 들어, 사용자가 웹사이트에 접근할 때 발생하는 트래픽입니다.
이스트-웨스트 트래픽: 데이터 센터 내에서 서버 간의 트래픽을 의미합니다. 예를 들어, 백엔드 서비스가 서로 통신할 때 발생하는 트래픽입니다.


- L4 / L7의 차이
L4 (Layer 4): 전송 계층에서 동작하며, IP 주소와 TCP/UDP 포트 정보를 기반으로 트래픽을 분산합니다. 패킷 헤더 정보를 사용하여 결정합니다.
L7 (Layer 7): 응용 계층에서 동작하며, HTTP 요청, URL, 쿠키 등 애플리케이션 레벨의 정보를 기반으로 트래픽을 분산합니다. 더 정교한 라우팅과 정책을 적용할 수 있습니다.


- 소프트웨어와 하드웨어 로드밸런서의 차이
소프트웨어 로드밸런서: 서버에서 실행되는 소프트웨어로, 일반적으로 비용이 적고 유연하게 구성할 수 있습니다. 예: NGINX, HAProxy.
하드웨어 로드밸런서: 전용 하드웨어 장비로, 높은 성능과 안정성을 제공합니다. 일반적으로 비용이 더 비쌉니다. 예: F5 BIG-IP, Cisco.

 

- SSL 오프로드
SSL 오프로드는 로드밸런서나 프록시 서버가 클라이언트와의 SSL/TLS 연결을 처리하고, 내부 서버와는 평문(HTTP)으로 통신하는 기능입니다. 이를 통해 내부 서버의 부하를 줄이고, SSL 처리로 인한 성능 저하를 방지합니다.

 

6. ㅇCLOS 토폴로지가 무엇인가? 이 토폴로지의 장점은 무엇인가 구현에 어떤 기술을 사용하는가?

- CLOS 토폴로지란?
CLOS 토폴로지(CLOS topology)는 고성능 네트워크 설계를 위한 구조로, 다중 경로를 지원하며 고속 데이터 전송을 가능하게 합니다. 주로 데이터 센터와 대규모 클라우드 환경에서 사용됩니다. CLOS 토폴로지는 기본적으로 세 개의 계층으로 구성됩니다:

엣지 스위치(Edge Switches): 클라이언트나 서버와 연결되는 최하위 계층.
중간 스위치(Spine Switches): 엣지 스위치와 연결되어 데이터 전송을 중계하는 중간 계층.
코어 스위치(Core Switches): 스위치 간의 연결을 관리하며, 대량의 트래픽을 처리합니다.


- CLOS 토폴로지의 장점
확장성: 노드를 추가하거나 제거하는 것이 용이하여 네트워크를 쉽게 확장할 수 있습니다.
고가용성: 다중 경로를 통해 장애가 발생해도 다른 경로로 트래픽을 우회할 수 있어 시스템의 가용성이 높습니다.
부하 분산: 데이터 트래픽이 여러 경로로 분산되어 성능이 향상됩니다.
단일 장애점 최소화: 특정 스위치나 링크에서 장애가 발생해도 전체 네트워크에 미치는 영향을 줄일 수 있습니다.


구현에 사용하는 기술
CLOS 토폴로지를 구현하기 위해 다음과 같은 기술이 사용됩니다.

스위칭 기술: 고속 패킷 스위칭을 지원하는 스위치가 필요합니다. 예를 들어, 이더넷 스위치가 자주 사용됩니다.
VLAN 및 VXLAN: 가상 네트워크를 구성하여 트래픽을 분리하고 관리합니다.

SDN(Software-Defined Networking): 네트워크를 소프트웨어로 정의하고 관리하여 유연성과 자동화를 제공합니다.
리던던시 기술: 여러 경로를 통해 트래픽을 전송함으로써 고가용성을 유지합니다.


CLOS 토폴로지는 대규모 데이터 센터와 클라우드 환경에서 매우 효과적인 네트워크 구조이며, 다양한 기술과 설계를 통해 성능을 최적화할 수 있습니다.

 

7.  DSR 방식의 로드밸런서가 무엇이고, 어떻게 구현이 되는가? L3 방식으로 구현할 수는 없나? 장점은 무엇인가? 왜 쓰는가? 설정할 때 주의 사항은?

- DSR 방식의 로드밸런서란?
DSR(Direct Server Return) 방식의 로드밸런서는 클라이언트의 요청을 로드밸런서가 처리한 후, 서버가 직접 클라이언트에게 응답하는 구조입니다. 이 방식은 로드밸런서가 요청을 분산하는 역할만 하고, 응답은 서버가 직접 전달합니다.

- DSR 방식의 구현
패킷 포워딩: 로드밸런서는 클라이언트의 요청을 수신하고, 해당 요청을 적절한 서버로 포워딩합니다.
IP 주소 변환: 로드밸런서가 클라이언트의 요청을 서버의 IP 주소로 변환하여 전송합니다. 이때 클라이언트는 로드밸런서의 IP를 인식하지 못합니다.
직접 응답: 서버는 클라이언트에게 직접 응답을 보내며, 이때 로드밸런서를 거치지 않습니다.


- L3 방식으로 구현 가능 여부
DSR 방식은 일반적으로 L4 또는 L7에서 구현됩니다. L3 기반으로 구현할 수는 있지만, IP 패킷의 라우팅에 대한 복잡성이 증가할 수 있습니다. L3에서는 TCP 세션 상태를 관리하기 어렵기 때문에, L4/L7 방식이 더 일반적입니다.

- DSR의 장점
성능 향상: 서버가 응답을 직접 클라이언트에게 보내므로 로드밸런서의 부하가 줄어듭니다.
대역폭 절약: 로드밸런서를 통해 다시 데이터를 전송할 필요가 없어 대역폭을 효율적으로 사용할 수 있습니다.
스케일링 용이: 추가 서버를 쉽게 연결할 수 있어 시스템 확장이 용이합니다.


- 왜 DSR 방식을 사용하는가?
대규모 웹 서비스: 많은 클라이언트 요청을 처리해야 하는 대규모 서비스에서 효율성을 극대화할 수 있습니다.
빠른 응답 속도: 클라이언트와 서버 간의 직접적인 응답 경로로 인해 빠른 응답 시간을 제공합니다.


- 설정 시 주의 사항
네트워크 구성: 클라이언트와 서버 간의 네트워크 경로가 올바르게 설정되어야 합니다. 방화벽이나 라우터 설정에 주의해야 합니다.
IP 주소 관리: 서버가 클라이언트에게 직접 응답할 수 있도록 IP 주소를 올바르게 구성해야 합니다.
세션 관리: 클라이언트와 서버 간의 세션 상태를 잘 관리해야 하며, 이를 위해 세션 지속성(Session Persistence) 설정이 필요할 수 있습니다.
모니터링: 로드밸런서와 서버의 상태를 지속적으로 모니터링하여 장애를 조기에 감지하고 대응해야 합니다.

 

8. PoP(Points of Presence)란?

PoP는 "Points of Presence"의 약자로, 네트워크 서비스 제공자가 고객에게 서비스를 제공하기 위해 구축한 물리적 위치를 의미합니다. 이 위치는 데이터 센터, 네트워크 노드 또는 중계 지점 등 다양한 형태로 존재할 수 있습니다.

- PoP의 주요 기능
접근성: 사용자가 인터넷에 연결할 수 있는 접점을 제공합니다.
데이터 전송: 데이터를 저장하거나 전송하는 역할을 수행합니다.
네트워크 최적화: 사용자와 가까운 위치에서 서비스를 제공함으로써 지연 시간을 줄이고 성능을 향상시킵니다.
로드밸런싱: 여러 서버 간의 트래픽을 분산시켜 안정성과 가용성을 높입니다.


- PoP의 활용 예
콘텐츠 전송 네트워크(CDN): 콘텐츠를 사용자에게 더 빠르게 전달하기 위해 여러 지역에 PoP를 배치합니다.
클라우드 서비스: 클라우드 제공업체가 여러 지역에 PoP를 두어 글로벌 서비스를 제공합니다.
PoP는 네트워크의 성능과 안정성을 높이는 데 중요한 역할을 하며, 특히 대규모 서비스에서 필수적인 요소입니다.

 

9. BGP가 무엇인가? AS의 개념은 무엇인가? BGP와 IP의 관계는 어떻게 되는가? EBGP는?

BGP란?
BGP(Border Gateway Protocol)는 인터넷에서 사용되는 주요 경로 선택 프로토콜로, 서로 다른 자율 시스템(AS) 간의 라우팅 정보를 교환합니다. BGP는 경로 벡터 프로토콜로, 라우터가 최적의 경로를 선택하고 전달하는 데 필요한 정보를 제공합니다.

AS(자율 시스템)의 개념
AS(Autonomous System)는 하나의 관리 하에 있는 네트워크 집합으로, 고유한 AS 번호를 가지고 있습니다. AS는 ISP(인터넷 서비스 제공자)나 대규모 기업 네트워크 등으로 구성될 수 있습니다. 각 AS는 자체적인 라우팅 정책을 가지고 있으며, BGP를 통해 다른 AS와 정보를 교환합니다.

BGP와 IP의 관계
BGP는 IP 주소를 기반으로 작동합니다. BGP는 IP 패킷이 목적지에 도달하기 위한 최적의 경로를 결정하는 데 사용되며, IP 주소의 프리픽스(주소 범위) 정보를 교환하여 라우팅 테이블을 업데이트합니다. 즉, BGP는 IP 네트워크의 경로 정보를 관리하는 프로토콜입니다.

EBGP(External BGP)
EBGP는 "External BGP"의 약자로, 서로 다른 AS 간의 BGP 세션을 의미합니다. 즉, 두 개의 다른 AS가 BGP를 통해 라우팅 정보를 교환하는 경우입니다. EBGP는 외부 네트워크와의 상호 연결을 담당하며, 경로 선택에서 중요한 역할을 합니다.

'Computer Science > Network' 카테고리의 다른 글

Linux - Network 2 / 3  (1) 2024.08.29
Linux - Network 1 / 3  (0) 2024.08.29
TCP 핸드쉐이크 프로세스  (0) 2024.08.27
네트워크의 기초 #1 네트워크, 처리량, 트래픽, 대역폭, RTT  (1) 2024.08.26
HTTP Header  (0) 2024.08.21

1. MTU

MTU(최대 전송 단위, Maximum Transmission Unit)는 네트워크에서 한 번에 전송할 수 있는 최대 패킷 크기를 의미합니다. MTU 값은 네트워크 성능과 효율성에 중요한 영향을 미치며, 기본값은 일반적으로 1500 바이트입니다.

MTU의 역할

  • 패킷 전송: MTU는 데이터가 한 번에 전송될 수 있는 최대 크기를 정의하여, 네트워크에서의 패킷 분할(fragmentation)을 방지합니다.
  • 성능 최적화: 적절한 MTU 설정은 네트워크 대역폭을 최적화하고, 전송 지연을 줄이는 데 도움을 줍니다.

MTU 값을 변경해야 하는 경우

  1. 네트워크 장비의 제한:
    • 특정 네트워크 장비(예: 라우터, 스위치)가 MTU 크기에 제한이 있는 경우, 이를 고려하여 MTU를 낮출 필요가 있습니다.
  2. VPN 사용:
    • VPN을 사용하면 종종 추가 헤더가 추가되어 패킷 크기가 증가합니다. 이 경우 MTU를 줄이지 않으면 패킷 분할이 발생할 수 있습니다.
  3. 특정 프로토콜 사용:
    • 특정 프로토콜(예: PPPoE)에서는 MTU가 1492 바이트로 제한될 수 있습니다. 이 경우 MTU를 조정해야 원활한 통신이 가능합니다.
  4. 네트워크 성능 문제:
    • 패킷 손실, 지연, 또는 성능 저하 문제가 발생하는 경우, MTU 값을 조정하여 최적의 설정을 찾을 수 있습니다.
  5. 멀티캐스트 및 브로드캐스트 트래픽:
    • 멀티캐스트 또는 브로드캐스트 트래픽이 많은 네트워크에서는 MTU를 조정하여 성능을 개선할 수 있습니다.

MTU 변경 시 주의사항

  • 테스트 필요: MTU를 변경하기 전에, 네트워크 환경을 고려하여 테스트를 진행하는 것이 중요합니다.
  • 일관성 유지: 모든 장비에서 동일한 MTU 설정을 유지해야 패킷 손실을 방지할 수 있습니다.

+ 내용

 

MTU(최대 전송 단위)는 패킷의 "묶음"이라고 보기는 어렵습니다. MTU는 한 번에 전송할 수 있는 최대 패킷 크기를 정의하는 값입니다. 즉, MTU는 패킷의 크기 제한을 나타내며, 네트워크에서 전송할 수 있는 단일 패킷의 최대 바이트 수를 의미합니다.

 

요약

  • MTU: 한 번에 전송할 수 있는 최대 패킷 크기.
  • 패킷: 실제로 전송되는 데이터의 단위.

 

2. MTU가 1500바이트면 시간당 흐르는 패킷의 양은?

MTU가 1500바이트라는 것은 한 번에 전송할 수 있는 최대 패킷 크기입니다. 시간당 흐르는 패킷의 양을 계산하기 위해서는 네트워크의 대역폭(속도)을 알아야 합니다.

예시 계산

  1. 대역폭 설정: 예를 들어, 네트워크 속도가 100 Mbps(메가비트 per 초)라고 가정해 보겠습니다.
  2. 비트로 변환:
    • 100 Mbps = 100,000,000 비트/초
  3. 바이트로 변환:
    • 100,000,000 비트/초 ÷ 8 = 12,500,000 바이트/초
  4. 패킷 수 계산:
    • 12,500,000 바이트/초 ÷ 1500 바이트/패킷 = 약 8333 패킷/초
  5. 시간당 패킷 수:
    • 8333 패킷/초 × 3600 초/시간 = 약 30,000,000 패킷/시간

결론

따라서, 100 Mbps의 대역폭에서 MTU가 1500 바이트일 경우, 시간당 약 30,000,000개의 패킷이 흐를 수 있습니다.

 

3. 패킷의 구성요소

패킷은 네트워크를 통해 데이터가 전송될 때, 정보의 단위로 사용되는 구조입니다. 패킷의 구성 요소는 일반적으로 다음과 같습니다:

1. 헤더 (Header)

  • 출발지 주소: 패킷이 어디에서 왔는지를 나타내는 주소.
  • 목적지 주소: 패킷이 어디로 가야 하는지를 나타내는 주소.
  • 프로토콜 정보: 어떤 프로토콜이 사용되는지를 나타내는 정보 (예: TCP, UDP).
  • 시퀀스 번호: 연결된 패킷의 순서를 식별하는 번호.
  • 제어 정보: 오류 검사, 흐름 제어 등과 관련된 정보.

2. 데이터 (Payload)

  • 실제 전송되고자 하는 정보나 데이터입니다. 이 부분이 패킷의 주요 내용이며, 애플리케이션의 데이터(예: 웹 페이지, 이메일 등)가 포함됩니다.

3. 트레일러 (Trailer)

  • 오류 검사 정보: 패킷이 전송 중 손상되었는지 확인하기 위한 정보(예: CRC 체크섬).
  • 일부 프로토콜에서는 트레일러가 포함될 수 있으며, 모든 패킷에 필수는 아닙니다.

패킷 구조의 예

  • IP 패킷: 인터넷 프로토콜(IP) 패킷은 헤더와 데이터로 구성되며, 헤더는 출발지 및 목적지 IP 주소, 프로토콜 정보 등을 포함합니다.
  • TCP 세그먼트: TCP 프로토콜의 경우, TCP 헤더가 포함되어 추가적인 제어 정보(예: 포트 번호, 플래그 등)를 제공합니다.

결론

패킷은 헤더, 데이터, 트레일러로 구성되어 있으며, 이 구성 요소들은 패킷이 네트워크를 통해 올바르게 전달되고 처리되는 데 필요한 중요한 정보를 포함합니다.

 

4. IP의 서브넷 마스크 계산 방법

서브넷 마스크 개념

서브넷 마스크는 네트워크 주소와 호스트 주소를 구분하는 데 사용됩니다. 일반적으로 서브넷 마스크는 네트워크의 비트 수를 나타내며, 이는 IP 주소의 어느 부분이 네트워크를 나타내고 어느 부분이 호스트를 나타내는지를 결정합니다.

서브넷 마스크 계산 방법

  1. IP 주소와 서브넷 마스크 이해하기
    • IP 주소는 32비트로 구성되며, 보통 4개의 옥텟(예: 192.168.1.1)으로 표시됩니다.
    • 서브넷 마스크도 32비트이며, 네트워크 부분은 1로, 호스트 부분은 0으로 표시됩니다.
  2. 네트워크 요구 사항 결정하기
    • 네트워크에서 필요한 호스트 수를 결정합니다. 예를 들어, 50개의 호스트가 필요하다면 서브넷 마스크를 계산해야 합니다.
  3. 필요한 비트 수 계산하기
    • 필요한 호스트 수에 따라 2의 거듭제곱을 사용하여 필요한 비트 수를 계산합니다.
    • 예: 50개의 호스트가 필요하다면, (2^6 = 64) (6비트)로 설정할 수 있습니다. (64는 50보다 크므로 적합)
  4. 서브넷 마스크 비트 수 결정하기
    • 전체 비트 수 32에서 필요한 호스트 비트 수를 뺍니다.
    • 예: 32 - 6 = 26. 따라서, 서브넷 마스크는 26비트가 됩니다.
  5. 서브넷 마스크 작성하기
    • 26비트의 서브넷 마스크를 작성합니다. 1로 설정된 비트는 네트워크 부분, 0으로 설정된 비트는 호스트 부분입니다.
    • 26비트 서브넷 마스크는 255.255.255.192입니다. (255.255.255.192 = 11111111.11111111.11111111.11000000)

예시

  • IP 주소: 192.168.1.0
  • 필요한 호스트 수: 50
  • 서브넷 마스크: 255.255.255.192 (/26)

결론

서브넷 마스크는 호스트 수에 따라 비트를 계산하고, 이를 바탕으로 IP 주소와 함께 사용하여 네트워크를 구성합니다.

 

 

5. 유니캐스트, 멀티캐스트, 브로드캐스트

유니캐스트, 멀티캐스트, 브로드캐스트는 네트워크에서 데이터 전송 방식에 따라 구분됩니다. 각각의 차이점은 다음과 같습니다:

1. 유니캐스트 (Unicast)

  • 정의: 한 송신자가 한 수신자에게 데이터를 전송하는 방식입니다.
  • 특징:
    • 1:1 통신 방식으로, 특정 대상에게만 메시지가 전달됩니다.
    • 예: 한 컴퓨터가 특정 서버에 요청을 보내는 경우.
  • 장점: 데이터가 특정 수신자에게만 전달되므로 보안성이 높고, 불필요한 트래픽이 발생하지 않습니다.

2. 멀티캐스트 (Multicast)

  • 정의: 한 송신자가 여러 특정 수신자에게 동시에 데이터를 전송하는 방식입니다.
  • 특징:
    • 1:N 통신 방식으로, 그룹에 속한 여러 수신자에게 동시에 전달됩니다.
    • 예: IPTV 방송이나 화상 회의에서 여러 사용자에게 스트리밍할 때 사용됩니다.
  • 장점: 필요한 수신자에게만 데이터를 전송하므로 대역폭을 절약할 수 있습니다.

3. 브로드캐스트 (Broadcast)

  • 정의: 한 송신자가 네트워크에 연결된 모든 수신자에게 데이터를 전송하는 방식입니다.
  • 특징:
    • 1:모든 통신 방식으로, 네트워크 내의 모든 장치가 수신합니다.
    • 예: ARP 요청이나 DHCP Discover 메시지.
  • 장점: 모든 장치가 동시에 수신하므로, 네트워크의 모든 장치와 정보를 쉽게 공유할 수 있습니다.

요약

  • 유니캐스트: 1:1 통신 (특정 수신자).
  • 멀티캐스트: 1:N 통신 (특정 그룹 수신자).
  • 브로드캐스트: 1:모든 통신 (모든 장치).

 

'Computer Science > Network' 카테고리의 다른 글

Linux - Network 3 / 3  (1) 2024.08.31
Linux - Network 1 / 3  (0) 2024.08.29
TCP 핸드쉐이크 프로세스  (0) 2024.08.27
네트워크의 기초 #1 네트워크, 처리량, 트래픽, 대역폭, RTT  (1) 2024.08.26
HTTP Header  (0) 2024.08.21

1. TCP,  UDP,  ICMP

TCP, UDP, ICMP는 네트워크 통신에서 중요한 역할을 하는 프로토콜입니다. 이들은 각각의 목적과 동작 방식에 따라 특정한 기능을 제공합니다.


1. TCP (Transmission Control Protocol)

  • 설명: TCP는 신뢰성 있는 데이터 전송을 보장하는 연결 지향 프로토콜입니다. 연결을 설정하고 데이터 전송 전에 세 가지 단계를 통해 상대방과 연결을 가집니다.
  • 특징:
    • 신뢰성: 데이터가 전송되었는지 확인하고, 오류가 발생한 경우 재전송합니다.
    • 연결 지향: 데이터 전송 전에 연결을 설정해야 합니다. 이를 위해 3-way handshake라는 과정을 거칩니다:
      • 클라이언트가 SYN 패킷 전송
      • 서버가 SYN-ACK 패킷 응답
      • 클라이언트가 ACK 패킷 전송 1
  • 헤더 구조:
    • 소스/목적 포트: 통신을 위한 포트 번호.
    • 순서 번호: 전송된 데이터의 위치를 나타냅니다.
    • ACK 번호: 수신한 데이터의 다음 순서를 나타냅니다.
    • 체크섬: 데이터의 오류를 체크하는 데 사용됩니다.

2. UDP (User Datagram Protocol)

  • 설명: UDP는 비연결형 프로토콜로, TCP보다 간단한 구조를 가지고 있습니다. 신뢰성을 요구하지 않는 데이터 전송에 사용됩니다.
  • 특징:
    • 비연결성: 데이터 전송 전에 연결을 설정하지 않습니다.
    • 속도: 데이터그램을 즉시 전송하기 때문에 실시간 애플리케이션에 유리합니다 (예: 비디오 스트리밍).
    • 신뢰성 부족: 패킷 손실이나 오류에 대해 신경 쓰지 않으므로, 높은 속도가 필요한 상황에서 주로 사용됩니다.
  • 헤더 구조:
    • 소스/목적 포트: TCP와 동일하게 포트 번호가 포함됩니다.
    • 길이: UDP 헤더와 데이터의 길이.
    • 체크섬: 데이터의 오류를 검증하는 기능이 있지만, 필수는 아닙니다.

3. ICMP (Internet Control Message Protocol)

  • 설명: ICMP는 네트워크 장비 간의 오류 메시지와 운영 정보를 전달하는 데 사용됩니다. 주로 네트워크 진단 도구에서 사용됩니다.
  • 특징:
    • 오류 메시지: 데이터 전송 중 문제가 발생했을 때 이를 알리는 데 사용됩니다.
    • Ping 명령: ICMP Echo Request와 Echo Reply 메시지를 통해 네트워크 상태를 검사합니다.
    • 비연결형: 직접 데이터 흐름을 관리하지 않으며, 오히려 다른 프로토콜을 보조합니다.
  • 헤더 구조:
    • 타입 및 코드: 메시지의 종류와 세부적인 코드를 나타냅니다.
    • 체크섬: 오류 검증을 위해 사용됩니다.

4. 관련 주제: 프로토콜의 비교

  • 신뢰성:
    • TCP는 데이터의 전송 신뢰성을 보장하는 반면 UDP는 이를 보장하지 않습니다.
  • 연결 방식:
    • TCP는 연결 지향적이며 UDP는 비연결 지향적입니다.
  • 용도:
    • TCP는 웹 브라우징, 이메일 등에 사용되고, UDP는 온라인 게임, VoIP, 스트리밍 서비스 등에 많이 활용됩니다.

 

2. TIME_WAIT

TIME_WAIT 상태는 TCP 연결 종료 후 클라이언트 소켓이 일정 시간 동안 유지되는 상태로, 여러 가지 이유로 필요합니다.

1. 패킷 손실 처리

  • TCP는 신뢰성 있는 데이터 전송을 보장하기 위해 세그먼트의 전송 상태를 확인합니다. 클라이언트가 연결을 종료하고 소켓을 닫았을 때, 지연된 패킷이나 재전송된 패킷이 도착할 수 있습니다.
  • TIME_WAIT 상태는 이러한 지연된 패킷을 처리할 시간을 제공합니다. 만약 클라이언트가 닫힌 소켓에 지연된 FIN 패킷을 받으면, 이미 닫힌 연결이므로 해당 패킷은 무시하거나 적절히 처리할 수 있습니다.

2. 중복 연결 방지

  • TIME_WAIT 상태는 동일한 소켓 쌍(소스 IP, 소스 포트, 목적지 IP, 목적지 포트)으로 새로운 연결을 생성하기 전에 일정 시간을 대기하게 합니다. 이는 이전 연결이 완전히 종료될 수 있도록 보장합니다.
  • 이 시간 동안 새로운 연결이 발생하더라도, 이전 연결의 패킷이 혼동되지 않도록 하여 데이터의 무결성을 보장합니다.

3. 재전송 처리

  • 서버가 클라이언트의 마지막 ACK를 받지 못했을 경우, FIN 패킷을 재전송할 수 있습니다. 클라이언트가 TIME_WAIT 상태에 있을 때, 이 재전송된 FIN 패킷을 수신하게 되면 적절히 응답할 수 있습니다.
  • 이를 통해 재전송된 패킷이 정상적으로 처리되도록 하고, 연결이 완전히 종료되는 과정을 보장합니다.

4. 효율적인 연결 종료

  • TIME_WAIT 상태가 없었다면, 클라이언트는 즉시 소켓을 닫고 새로운 연결을 생성할 수 있었으나, 이로 인해 이전 연결의 패킷이 혼란을 일으킬 수 있었습니다.
  • 따라서 TIME_WAIT 상태는 네트워크 자원을 효율적으로 관리하고, 연결 종료 과정에서 발생할 수 있는 오류를 최소화하는 역할을 합니다.

 

3. TCP Half-open connection

TCP Half-open 연결은 두 통신 호스트 간의 상태가 비동기화된 TCP 연결을 의미하며, 일반적으로 한 쪽이 오류로 인해 정상적으로 종료되지 않았을 때 발생합니다. 이 상태는 연결의 한 쪽에서만 소켓이 종료되었고, 반대편은 여전히 연결된 상태로 남아 있는 상황입니다.


1. Half-open 상태의 정의

  • 정의: 한쪽 호스트(서버 또는 클라이언트)가 연결을 종료하거나 소켓을 삭제했지만, 다른 쪽 호스트가 이를 인지하지 못한 경우 발생합니다. 결과적으로 하나의 연결만 비활성화되고, 나머지 쪽은 여전히 활성 상태입니다.
  • 비정상적 종료: 이 상태는 통상적으로 다음과 같은 상황에서 발생할 수 있습니다.
    • 한 쪽 호스트가 충돌(crash)한 경우
    • 연결 종료를 통지하지 않고 소켓을 비활성화한 경우

2. Half-open 상태의 예

  • 서버 충돌 예시: 서버가 연결에 대한 FIN 패킷을 보내지 않고 갑자기 종료되면, 클라이언트는 서버에 대한 연결을 여전히 유지한 채로 남게 됩니다. 이 클라이언트는 이제 데이터를 보내려고 시도할 수 있지만, 서버는 해당 데이터를 수신할 수 없습니다.
  • 상태 비동기화: 이 상황에서 클라이언트는 여전히 정상적으로 작동하는 자원으로 인식하지만, 실제로는 서버가 응답하지 않기 때문에 연결이 이상 상태로 들어갑니다.

3. Half-open 연결의 원인

  • TCP 설정 처리 오류: 연결을 종료했지만 시간이 오래 걸린 경우, 이로 인해 않는 패킷 수신 잔액의 통신에 대한 기대가 일어날 수 있습니다.
  • Stateful Firewall Timeout: 상태를 관리하는 방화벽이 일정 시간 동안 통신이 없으면 연결 상태를 삭제하는 경우, 연결의 일쪽이 데이터 패킷을 전송하면 방화벽은 패킷을 버릴 수 있습니다. 이로 인해 연결이 half-open 상태로 남게 됩니다 1.

4. Half-open 연결의 문제점

  • 자원 낭비: Half-open 연결이 유지되는 동안, 시스템 자원(메모리 및 소켓 포트)이 낭비됩니다.
  • 데이터 전송 실패: 한쪽이 비정상적으로 종료되었기 때문에, 데이터 전송이 실패할 수 있습니다.
  • 보안 위험: 한쪽 연결이 더 이상 기능하지 않지만, 공격자는 이를 이용할 수 있는 가능성이 존재합니다.

5. 관련 주제: Embryonic Connection

  • 정의: Embryonic Connection은 TCP 연결이 설정 과정에 있는 상태를 의미합니다. 이 상태에서 클라이언트는 서버의 응답을 기다리고 있으며, 이 연결이 완전히 설정되지 않았습니다.
  • 상태 관리:
    • 클라이언트가 SYN 패킷을 전송하고, 서버가 SYN-ACK 패킷을 응답하면, 클라이언트는 최종 ACK 패킷을 전송하여 연결을 확립합니다. 이 상태에서 오류가 발생하면, 연결은 half-open 상태로 전환될 수 있습니다.

 

4. 네트워크 인터페이스 리스트와 라우팅

1. 네트워크 인터페이스 리스트

네트워크 인터페이스는 서버가 네트워크에 연결될 수 있도록 하는 하드웨어 또는 소프트웨어 구성 요소입니다. 일반적으로 다음과 같은 정보가 포함됩니다.

  • 인터페이스 이름: 예를 들어, eth0, wlan0, lo(루프백) 등.
  • IP 주소: 각 인터페이스에 할당된 고유한 IP 주소.
  • 서브넷 마스크: IP 주소의 네트워크 부분과 호스트 부분을 구분하는 데 사용되는 마스크.
  • MAC 주소: 물리적 네트워크 인터페이스에 할당된 고유 식별자.
  • 상태: 인터페이스가 활성화(active) 또는 비활성화(inactive) 상태인지 여부.

이 정보는 일반적으로 명령어를 통해 확인할 수 있으며, 예를 들어 Linux에서는 ifconfig 또는 ip addr 명령어를 사용할 수 있습니다.

2. 라우팅 설정

라우팅 설정은 패킷이 네트워크를 통해 이동하는 경로를 결정합니다. 라우팅 테이블은 각 목적지에 대한 경로 정보를 포함하고 있으며, 주요 항목은 다음과 같습니다.

  • 목적지 네트워크: 패킷이 전송될 대상 IP 주소 또는 네트워크.
  • 서브넷 마스크: 목적지 네트워크를 정의하는 데 사용되는 마스크.
  • 게이트웨이: 패킷이 전달될 다음 홉의 IP 주소. 일반적으로 라우터의 주소입니다.
  • 인터페이스: 패킷이 전송될 네트워크 인터페이스.
  • 메트릭: 경로의 우선 순위를 결정하는 값. 낮은 값일수록 높은 우선 순위를 가집니다.

라우팅 테이블은 route 또는 ip route 명령어를 통해 확인할 수 있습니다.

3. 예시

  • 네트워크 인터페이스:
    • eth0: 192.168.1.10, 서브넷 마스크 255.255.255.0, 상태: 활성화.
    • lo: 127.0.0.1, 서브넷 마스크 255.0.0.0.
  • 라우팅 테이블:
    • 목적지: 0.0.0.0, 서브넷 마스크: 0.0.0.0, 게이트웨이: 192.168.1.1, 인터페이스: eth0, 메트릭: 100.

4. 중요성

  • 네트워크 연결: 올바른 네트워크 인터페이스 설정은 서버가 네트워크에 제대로 연결되도록 보장합니다.
  • 효율적인 데이터 전송: 라우팅 설정은 데이터 패킷이 최적의 경로를 통해 전달되도록 하여 네트워크 성능을 향상시킵니다.

5. 서브넷 마스크

서브넷 마스크는 IP 주소에서 네트워크 부분과 호스트 부분을 구분하는 데 사용되는 값입니다. 네트워크의 크기를 정의하고, 어떤 IP 주소가 동일한 네트워크에 속하는지를 판단하는 데 중요한 역할을 합니다.

서브넷 마스크의 구성

서브넷 마스크는 일반적으로 32비트의 이진수로 표현되며, 1로 설정된 비트는 네트워크 부분을, 0으로 설정된 비트는 호스트 부분을 나타냅니다. 예를 들어, 서브넷 마스크가 255.255.255.0인 경우:

  • 이진수: 11111111.11111111.11111111.00000000
  • 네트워크 부분: 24비트 (첫 3옥타브)
  • 호스트 부분: 8비트 (마지막 옥타브)

예시

  1. IP 주소와 서브넷 마스크:
    • IP 주소: 192.168.1.10
    • 서브넷 마스크: 255.255.255.0
    여기서 192.168.1.10의 네트워크 부분은 192.168.1이고, 호스트 부분은 10입니다. 이 설정은 192.168.1.0 네트워크 내에서 최대 254개의 호스트(192.168.1.1 ~ 192.168.1.254)를 지원합니다.
  2. 다른 서브넷 마스크 예시:
    • IP 주소: 10.0.0.5
    • 서브넷 마스크: 255.0.0.0
    이 경우, 네트워크 부분은 10이고, 호스트 부분은 0.0.5입니다. 이 설정은 10.0.0.0 네트워크 내에서 약 1천7백만 개의 호스트를 지원합니다.
  3. 서브넷 마스크 계산 방법 :
    1. IP 주소와 서브넷 마스크 이해하기
      • IP 주소는 32비트로 구성되며, 보통 4개의 옥텟(예: 192.168.1.1)으로 표시됩니다.
      • 서브넷 마스크도 32비트이며, 네트워크 부분은 1로, 호스트 부분은 0으로 표시됩니다.
    2. 네트워크 요구 사항 결정하기
      • 네트워크에서 필요한 호스트 수를 결정합니다. 예를 들어, 50개의 호스트가 필요하다면 서브넷 마스크를 계산해야 합니다.
    3. 필요한 비트 수 계산하기
      • 필요한 호스트 수에 따라 2의 거듭제곱을 사용하여 필요한 비트 수를 계산합니다.
      • 예: 50개의 호스트가 필요하다면, (2^6 = 64) (6비트)로 설정할 수 있습니다. (64는 50보다 크므로 적합)
    4. 서브넷 마스크 비트 수 결정하기
      • 전체 비트 수 32에서 필요한 호스트 비트 수를 뺍니다.
      • 예: 32 - 6 = 26. 따라서, 서브넷 마스크는 26비트가 됩니다.
    5. 서브넷 마스크 작성하기
      • 26비트의 서브넷 마스크를 작성합니다. 1로 설정된 비트는 네트워크 부분, 0으로 설정된 비트는 호스트 부분입니다.
      • 26비트 서브넷 마스크는 255.255.255.192입니다. (255.255.255.192 = 11111111.11111111.11111111.11000000)
    예시
    • IP 주소: 192.168.1.0
    • 필요한 호스트 수: 50
    • 서브넷 마스크: 255.255.255.192 (/26)

'Computer Science > Network' 카테고리의 다른 글

Linux - Network 3 / 3  (1) 2024.08.31
Linux - Network 2 / 3  (1) 2024.08.29
TCP 핸드쉐이크 프로세스  (0) 2024.08.27
네트워크의 기초 #1 네트워크, 처리량, 트래픽, 대역폭, RTT  (1) 2024.08.26
HTTP Header  (0) 2024.08.21

TCP 핸드쉐이크 프로세스 (연결 및 종료 과정) TCP (Transmission Control Protocol)는 신뢰성 있는 데이터 전송을 위해 세션을 설정하는 핸드쉐이크 프로세스를 사용합니다. 이 과정은 주로 연결을 설정할 때와 종료할 때의 두 가지 단계로 나뉘어집니다.


1. TCP 연결 설정 (핸드쉐이크)

TCP 연결 설정 과정은 일반적으로 3단계로 이루어져 있습니다. 다음은 각 단계의 설명입니다:

  • SYN 단계:
    • 클라이언트는 서버에 연결 요청을 위해 SYN (Synchronize) 패킷을 보냅니다. 이 패킷에는 클라이언트의 초기 시퀀스 번호가 포함됩니다.
  • SYN-ACK 단계:
    • 서버는 클라이언트의 SYN 요청에 대해 응답으로 SYN-ACK (Synchronize-Acknowledge) 패킷을 보냅니다. 이 패킷은 서버의 초기 시퀀스 번호와 함께 클라이언트의 요청을 확인하는 ACK (Acknowledgment)를 포함합니다.
  • ACK 단계:
    • 클라이언트는 서버의 SYN-ACK 패킷을 받고, ACK (Acknowledgment) 패킷으로 응답합니다. 이 단계에서 클라이언트는 서버의 시퀀스 번호를 확인하며, 이제 클라이언트와 서버 간의 연결이 성공적으로 설정됩니다.

이러한 3단계 과정을 통해 TCP 연결이 형성되고, 데이터 전송이 가능해집니다.

 

2. TCP 연결 종료

 

TCP 연결 종료는 일반적으로 4단계로 이루어집니다:

  • FIN 단계:
    • 클라이언트 또는 서버가 더 이상 데이터를 전송하지 않겠다고 결정할 경우, FIN (Finish) 패킷을 보냅니다. 이 패킷은 종료를 알리는 신호입니다.
  • ACK 단계:
    • 상대방은 FIN 패킷을 수신하면 확인 응답으로 ACK를 보냅니다. 이 단계에서 한 쪽의 연결이 종료됩니다.
  • FIN 단계:
    • 이제 상대방도 종료를 요청할 수 있으며, FIN 패킷을 전송합니다.
  • ACK 단계:
    • 원래의 클라이언트/서버가 FIN 패킷을 수신하고 ACK 패킷으로 응답함으로써 TCP 연결은 완전히 종료됩니다.

이 과정을 통해 상대방도 연결이 종료되었음을 확인하고, 모든 데이터가 안전하게 전송되었는지를 보장합니다.

 

3. 추가 확인할 점: TCP 상태 전이 다이어그램

TCP 핸드쉐이크 및 종료 과정은 상태 전이 다이어그램을 통해 명확하게 표현될 수 있습니다. 이 다이어그램은 연결이 설정되거나 종료되는 과정에서 각 상태 간의 전환을 시각적으로 나타냅니다.

  • 상태 변화:
    • TCP는 여러 상태를 거치며 연결을 관리합니다. 예를 들어, LISTEN 상태에서 SYN 수신 후 SYN-RECEIVED 상태로, FIN 수신 후 TIME_WAIT 상태로 넘어갑니다.
  • 시작 및 종료:

연결이 시작되면 ESTABLISHED 상태로 전이되며, 종료가 완료되면 CLOSED 상태로 되돌아갑니다.

'Computer Science > Network' 카테고리의 다른 글

Linux - Network 3 / 3  (1) 2024.08.31
Linux - Network 2 / 3  (1) 2024.08.29
Linux - Network 1 / 3  (0) 2024.08.29
네트워크의 기초 #1 네트워크, 처리량, 트래픽, 대역폭, RTT  (1) 2024.08.26
HTTP Header  (0) 2024.08.21

1.  리눅스

리눅스(Linux)는 오픈 소스 운영 체제 커널로, 리누스 토발즈(Linus Torvalds)가 1991년에 처음 개발하였습니다. 리눅스는 다양한 배포판으로 제공되며, 서버, 데스크탑, 임베디드 시스템 등 여러 환경에서 널리 사용됩니다.

주요 특징

  1. 오픈 소스: 리눅스는 소스 코드가 공개되어 있어 누구나 자유롭게 수정하고 배포할 수 있습니다. 이로 인해 다양한 버전과 배포판이 존재합니다.
  2. 유연성: 사용자는 필요에 따라 커널과 소프트웨어를 수정할 수 있어 다양한 하드웨어와 용도에 맞춰 최적화할 수 있습니다.
  3. 안정성: 리눅스는 높은 안정성을 제공하여 서버 환경에서도 자주 사용됩니다. 시스템이 오랫동안 실행되어도 잘 다운되지 않는 특성을 가지고 있습니다.
  4. 보안: 강력한 권한 관리 및 사용자 관리 기능을 통해 보안성이 높습니다. 다양한 보안 도구와 커뮤니티의 지원으로 지속적으로 보안이 강화됩니다.
  5. 다양한 배포판: 우분투(Ubuntu), 페도라(Fedora), 센토스(CentOS), 데비안(Debian) 등 다양한 배포판이 있어 사용자 요구에 맞는 선택이 가능합니다.

구성 요소

  • 커널: 하드웨어와 소프트웨어 간의 인터페이스 역할을 하며, 시스템 자원 관리, 프로세스 관리, 메모리 관리 등을 담당합니다.
  • : 사용자와 커널 간의 명령어 인터페이스로, 명령어를 입력하고 실행할 수 있게 도와줍니다.
  • 파일 시스템: 데이터 저장 구조로, 리눅스는 다양한 파일 시스템(예: ext4, XFS 등)을 지원합니다.
  • 응용 프로그램: 다양한 소프트웨어가 리눅스에서 실행될 수 있으며, 오픈 소스 및 상용 프로그램이 포함됩니다.

사용 사례

  • 서버: 웹 서버, 데이터베이스 서버 등 다양한 서버 환경에서 많이 사용됩니다.
  • 개발 환경: 많은 개발자들이 리눅스를 개발 환경으로 선택하며, 프로그래밍 언어 및 도구들이 잘 지원됩니다.
  • 임베디드 시스템: IoT 기기 및 다양한 하드웨어에서 리눅스 기반의 운영 체제가 사용됩니다.

 

2.  리눅스 파일시스템

리눅스 파일 시스템은 데이터를 저장하고 관리하는 구조로, 여러 종류의 파일 시스템이 존재합니다. 각 파일 시스템은 고유의 특성과 용도로 설계되었습니다. 다음은 리눅스에서 일반적으로 사용되는 파일 시스템의 주요 종류와 특징입니다.


1. ext4 (Fourth Extended Filesystem)
가장 널리 사용되는 리눅스 파일 시스템.
큰 파일과 파티션을 지원하며, 저널링 기능을 제공하여 데이터 무결성을 유지합니다.
빠른 성능과 효율적인 공간 관리를 특징으로 합니다.


2. XFS
고성능 파일 시스템으로 대용량 데이터 처리에 적합합니다.
저널링 기능이 있으며, 동시 작업 처리에 강점을 가지고 있습니다.
파일 시스템 크기를 동적으로 확장할 수 있는 기능을 제공합니다.


3. Btrfs (B-tree File System)
최신 파일 시스템으로, 스냅샷, 압축, RAID 기능을 지원합니다.
데이터 무결성을 위한 체크섬 기능이 있으며, 관리와 확장성이 뛰어납니다.
여러 디바이스를 통합하여 하나의 파일 시스템으로 사용할 수 있습니다.


4. FAT (File Allocation Table)
주로 USB 드라이브와 같은 이동식 미디어에서 사용됩니다.
다양한 운영 체제와 호환성이 높지만, 파일 크기와 볼륨 크기에 제한이 있습니다.


5. NTFS (New Technology File System)
Windows에서 주로 사용되지만, 리눅스에서도 읽기/쓰기가 가능합니다.
큰 파일과 파티션을 지원하며, 보안 및 저널링 기능이 있습니다.


6. ReiserFS
저널링 파일 시스템으로, 작은 파일에 대한 성능이 우수합니다.
최근에는 사용 빈도가 줄어들고 있지만, 특정 환경에서 여전히 사용됩니다.
파일 시스템의 주요 특징
저널링: 데이터 무결성을 보장하기 위해 변경 사항을 기록하는 기능.
스냅샷: 특정 시점의 파일 시스템 상태를 저장하여 복구할 수 있는 기능.
압축: 저장 공간을 절약하기 위해 데이터를 압축하는 기능.
RAID 지원: 여러 디스크를 하나의 논리적 장치로 묶어 성능과 안정성을 향상시키는 기능.
리눅스 파일 시스템은 다양한 요구 사항에 맞게 선택할 수 있으며, 각 파일 시스템의 특성을 이해하는 것이 중요합니다.

파일시스템의 종류(ext, XFS, GFS, FAT16/32, NTFS, UFS, tmpFS…)

 


3.  chown, chmod, chroot

chown, chmod, chroot는 리눅스 및 유닉스 시스템에서 파일과 디렉토리의 권한 및 소유자를 관리하는 데 사용되는 명령어입니다.

1. chown

  • 기능: 파일이나 디렉토리의 소유자를 변경합니다.
  • 사용법: chown [옵션] [소유자][:그룹] 파일/디렉토리
  • 예시: chown user:group filename은 filename의 소유자를 user로, 그룹을 group으로 변경합니다.
  • 용도: 파일의 소유자를 변경하여 권한을 관리할 수 있습니다.

2. chmod

  • 기능: 파일이나 디렉토리의 접근 권한을 변경합니다.
  • 사용법: chmod [옵션] [모드] 파일/디렉토리
  • 예시: chmod 755 filename은 소유자에게 읽기, 쓰기, 실행 권한을 주고, 그룹과 다른 사용자에게 읽기와 실행 권한을 부여합니다.
  • 용도: 파일의 접근 권한을 조정하여 보안을 강화하거나 특정 사용자에게 접근을 허용합니다.

3. chroot

  • 기능: 현재 프로세스의 루트 디렉토리를 변경합니다. 이 명령어를 사용하면 특정 디렉토리 내에서만 작업할 수 있는 환경을 생성합니다.
  • 사용법: chroot [옵션] 새로운루트 [명령어]
  • 예시: chroot /newroot /bin/bash는 /newroot를 새로운 루트로 설정하고, 그 안에서 bash 셸을 실행합니다.
  • 용도: 보안이나 테스트 목적으로 제한된 환경을 만들고, 특정 프로세스가 다른 시스템 파일에 접근하지 못하도록 합니다.

요약

  • chown: 파일의 소유자와 그룹을 변경.
  • chmod: 파일의 접근 권한을 변경.
  • chroot: 프로세스의 루트 디렉토리를 변경하여 제한된 환경을 생성.

이 세 가지 명령어는 시스템 관리 및 보안에 중요한 역할을 하며, 각각의 용도에 맞게 적절히 사용해야 합니다.


4.  2자로 된 명령어를 모두 찾을 수 있는 방법?

리눅스에서 2자로 된 파일 이름을 찾기 위해 사용할 수 있는 find 명령어는 다음과 같습니다. 두 가지 방법을 소개하겠습니다.

1. 패턴을 이용한 방법

find / -name '[a-z][a-z0-9]' -type f
  • 이 명령어는 루트 디렉토리(/)에서 소문자 알파벳과 숫자로 이루어진 2자 파일 이름을 가진 파일을 찾습니다.

2. 특정 디렉토리에서 찾기

find /usr/{bin,sbin} -name '??' -ls
  • 이 명령어는 /usr/bin과 /usr/sbin 디렉토리에서 2자 파일 이름을 가진 파일을 찾고, 해당 파일에 대한 상세 정보를 출력합니다.

 

  • 첫 번째 방법은 아스키 문자 패턴을 사용하여 모든 디렉토리에서 2자 파일을 찾고,
  • 두 번째 방법은 특정 디렉토리에서 2자 파일을 찾습니다.

 

5. FUSE?

FUSE(파일 시스템 사용자 공간)는 사용자 공간에서 파일 시스템을 구현할 수 있게 해주는 인터페이스입니다. 이를 통해 사용자나 개발자가 커널 모듈을 작성하지 않고도 파일 시스템을 만들 수 있습니다. FUSE와 전통적인 커널 기반 파일 시스템의 차이점과 FUSE의 유용성에 대해 설명하겠습니다.

FUSE와 전통적인 파일 시스템의 차이점

  1. 구현 위치:
    • FUSE: 사용자 공간에서 실행됩니다. 이는 개발자가 파일 시스템 코드를 쉽게 작성하고 테스트할 수 있게 해줍니다.
    • 전통적인 파일 시스템: 커널 공간에서 실행되며, 커널 모듈로 작성되어야 합니다. 성능과 안정성 측면에서 더 효율적입니다.
  2. 성능:
    • FUSE: 사용자 공간과 커널 공간 간의 컨텍스트 전환이 발생하므로, 일반적으로 성능이 저하될 수 있습니다.
    • 전통적인 파일 시스템: 더 빠르고 효율적인 성능을 제공합니다.
  3. 개발 용이성:
    • FUSE: 개발이 상대적으로 쉽고, 다양한 언어(예: Python, Ruby 등)로 구현할 수 있습니다.
    • 전통적인 파일 시스템: 커널 프로그래밍에 대한 깊은 이해가 필요하며, 디버깅이 복잡합니다.

FUSE의 유용성

  • 프로토타입 및 실험: FUSE는 새로운 파일 시스템 아이디어를 신속하게 테스트하고 구현할 수 있는 좋은 방법입니다.
  • 특정 요구 사항: 특정 애플리케이션이나 사용 사례에 맞춘 커스텀 파일 시스템을 만들 수 있습니다. 예를 들어, 클라우드 스토리지, 데이터베이스, 암호화된 파일 시스템 등에서 유용합니다.
  • 이식성: 다양한 플랫폼에서 사용 가능하며, 커널 모듈을 작성할 필요가 없어 이식성이 좋습니다.

성능 차이를 무시하더라도 FUSE는 충분히 쓸만합니다. 특히 개발 및 테스트 환경에서 유용하며, 특정 용도에 맞는 기능을 구현하는 데 매우 적합합니다. 단, 성능이 중요한 프로덕션 환경에서는 전통적인 파일 시스템이 더 나은 선택이 될 수 있습니다.

 


6. Device Tree

Device Tree는 하드웨어 구성 정보를 서술하는 데이터 구조로, 주로 임베디드 시스템과 ARM 기반 시스템에서 사용됩니다. 이를 통해 운영 체제나 커널이 하드웨어를 인식하고 설정할 수 있도록 정보를 제공합니다.

주요 특징

  1. 구조:
    • Device Tree는 트리 형태로 구성되어 있으며, 각 노드는 하드웨어 장치나 버스, 프로퍼티에 대한 정보를 담고 있습니다.
    • 각 노드는 장치의 주소, IRQ(인터럽트 요청), 드라이버 정보 등을 포함할 수 있습니다.
  2. 포맷:
    • 주로 두 가지 포맷으로 사용됩니다: 소스 포맷(.dts)과 바인딩된 바이너리 포맷(.dtb).
    • .dts 파일은 텍스트 형식으로 하드웨어 정보를 명시하고, 이를 컴파일하여 .dtb 파일로 변환합니다.
  3. 운영 체제와의 통합:
    • Linux 커널은 Device Tree를 사용하여 부팅 시 하드웨어 정보를 읽고, 필요한 드라이버를 로드합니다.
    • 이를 통해 다양한 하드웨어 플랫폼에서 동일한 커널 이미지를 사용할 수 있게 해줍니다.
  4. 장점:
    • 유연성: 하드웨어 변경 시 소스 파일만 수정하면 되므로, 커널을 재컴파일할 필요가 없습니다.
    • 재사용성: 다양한 하드웨어 플랫폼에 대해 동일한 커널을 사용할 수 있어, 유지보수가 용이합니다.
  5. 사용 예:
    • ARM 아키텍처의 다양한 개발 보드 및 임베디드 시스템에서 널리 사용됩니다.
    • 부트로더(예: U-Boot)와 함께 사용되어, 커널 부팅 시 하드웨어 정보를 전달합니다.

Device Tree는 하드웨어를 서술하는 효율적이고 유연한 데이터 구조로, 다양한 플랫폼에서 하드웨어 인식을 간소화하고, 커널의 이식성을 높이는 데 기여합니다. 특히 임베디드 시스템에서 중요한 역할을 하고 있습니다.

 


7. 좀비(zombie) 프로세스

좀비(zombie) 프로세스는 자식 프로세스가 종료되었지만, 부모 프로세스가 아직 종료된 자식 프로세스의 종료 상태를 수집하지 않아 메모리에 남아 있는 상태를 의미합니다. 이 상태는 자식 프로세스의 PID(프로세스 ID)와 종료 상태 정보가 시스템에 남아 있지만, 실제로는 더 이상 실행 중이지 않은 프로세스입니다.

좀비 프로세스의 특징

  1. 상태:
    • 좀비 프로세스는 실제로 실행되지 않지만, 프로세스 테이블에 여전히 존재합니다.
    • 종료된 자식 프로세스의 정보를 유지하여 부모 프로세스가 이를 확인할 수 있도록 합니다.
  2. 발생 원인:
    • 자식 프로세스가 종료되면, 시스템은 종료 상태를 부모 프로세스에게 전달해야 합니다.
    • 부모 프로세스가 wait() 또는 waitpid() 시스템 호출을 통해 자식의 종료 상태를 수집하지 않으면, 자식 프로세스는 좀비 상태로 남습니다.
  3. 문제점:
    • 좀비 프로세스는 시스템 자원을 차지하지 않지만, 프로세스 테이블의 슬롯을 점유합니다.
    • 만약 부모 프로세스가 종료되지 않고 좀비 프로세스가 많아지면, 시스템의 프로세스 테이블이 가득 차서 새로운 프로세스 생성에 문제가 발생할 수 있습니다.
  4. 해결 방법:
    • 부모 프로세스가 적절히 자식 프로세스의 종료 상태를 수집하도록 구현해야 합니다.
    • 부모 프로세스가 종료되면, 운영 체제가 자식 프로세스를 init 프로세스에 양도하여 정리할 수 있습니다. 이때 init 프로세스는 자식 프로세스의 종료 상태를 수집합니다.

좀비 프로세스는 자식 프로세스가 종료된 후에도 부모 프로세스가 종료 상태를 수집하지 않아 발생하는 상태로, 시스템 자원을 낭비하지 않지만, 프로세스 테이블의 슬롯을 차지하여 새로운 프로세스 생성을 방해할 수 있습니다. 적절한 프로세스 관리로 이를 예방하는 것이 중요합니다.

 


8. Shell

쉘(Shell)은 사용자와 운영 체제 간의 인터페이스 역할을 하는 프로그램으로, 명령어를 입력받아 실행하고 결과를 출력합니다. 주로 커맨드 라인 인터페이스(CLI) 형태로 제공되며, 사용자가 시스템과 상호작용할 수 있도록 돕습니다.

쉘의 주요 기능

  1. 명령어 해석:
    • 사용자가 입력한 명령어를 해석하고 실행합니다. 이 과정에서 명령어와 인수를 파싱하여 적절한 시스템 호출을 수행합니다.
  2. 스크립트 실행:
    • 쉘은 배치 작업을 자동화하기 위해 스크립트 파일을 실행할 수 있습니다. 이를 통해 일련의 명령어를 순차적으로 실행할 수 있습니다.
  3. 입출력 리다이렉션:
    • 표준 입력, 출력, 오류 출력을 다른 파일이나 장치로 리다이렉션할 수 있습니다. 예를 들어, 명령어의 출력을 파일로 저장하거나 파일의 내용을 명령어의 입력으로 사용할 수 있습니다.
  4. 파이프:
    • 여러 명령어를 연결하여 출력이 다음 명령어의 입력으로 사용되도록 할 수 있습니다. 이를 통해 복잡한 데이터 처리 작업을 수행할 수 있습니다.
  5. 환경 변수 관리:
    • 쉘은 시스템의 환경 변수를 설정하고 관리하는 기능을 제공합니다. 이를 통해 프로그램의 동작 방식이나 경로 등을 조정할 수 있습니다.
  6. 프로세스 관리:
    • 쉘은 프로세스를 생성하고 관리하며, 백그라운드 또는 포그라운드에서 실행할 수 있도록 지원합니다.


9. 리눅스 서버에 원격으로 접근할 수 있는 방법

리눅스 서버에 원격으로 접근할 수 있는 여러 방법이 있습니다. 각 방법은 보안 수준과 사용 용도에 따라 다릅니다. 아래는 주요 원격 접근 방법입니다.

1. SSH (Secure Shell)

  • 설명: SSH는 데이터를 암호화하여 안전하게 원격 서버에 접속할 수 있도록 해주는 프로토콜입니다.
  • 장점:
    • 높은 보안성 (암호화)
    • 포트 포워딩 및 X11 포워딩 지원
  • 사용 예: ssh username@hostname

2. Telnet

  • 설명: Telnet은 원격 서버에 텍스트 기반으로 접속할 수 있는 프로토콜입니다.
  • 단점:
    • 암호화되지 않은 데이터 전송으로 보안에 취약합니다.
  • 사용 예: telnet hostname

3. RSH (Remote Shell)

  • 설명: RSH는 원격 시스템에서 명령을 실행할 수 있는 프로토콜입니다.
  • 단점:
    • 보안성이 낮고, 암호화되지 않음
    • SSH에 비해 사용이 줄어듬
  • 사용 예: rsh hostname command

4. SCP (Secure Copy Protocol)

  • 설명: SCP는 SSH를 기반으로 파일을 안전하게 복사할 수 있는 프로토콜입니다.
  • 장점:
    • 데이터 전송이 암호화되어 안전함
  • 사용 예: scp localfile username@hostname:/path/to/destination

5. SFTP (SSH File Transfer Protocol)

  • 설명: SFTP는 SSH를 통해 파일을 안전하게 전송하는 프로토콜입니다.
  • 장점:
    • 파일 전송과 관리 기능을 제공
    • 강력한 보안
  • 사용 예: sftp username@hostname

6. VNC (Virtual Network Computing)

  • 설명: VNC는 GUI 환경에서 원격 접속을 지원하는 프로토콜입니다.
  • 장점:
    • 그래픽 사용자 인터페이스 지원
  • 단점:
    • 보안성이 낮기 때문에 SSH와 함께 사용하는 것이 좋음

리눅스 서버에 원격으로 접근할 때는 보안성과 사용 목적에 따라 적절한 방법을 선택하는 것이 중요합니다. 일반적으로 SSH가 가장 많이 사용되며, 보안이 중요한 환경에서는 SCP나 SFTP를 통해 파일 전송을 수행하는 것이 좋습니다.

 

 

10. load average (/proc/loadavg)

Load Average는 시스템의 부하를 나타내는 지표로, 일반적으로 1분, 5분, 15분 간의 평균값을 제공합니다. 이 값은 다음과 같은 의미를 가집니다:

1분 평균: 최근 1분 동안의 평균 부하를 나타냅니다.
5분 평균: 최근 5분 동안의 평균 부하를 나타냅니다.
15분 평균: 최근 15분 동안의 평균 부하를 나타냅니다.
이 값들은 시스템이 얼마나 과부하 상태인지, 또는 정상 상태인지를 판단하는 데 도움을 줍니다. 일반적으로 Load Average 값이 CPU 코어 수보다 높으면 시스템이 과부하 상태일 가능성이 큽니다.

해석 방법
0.00 - 1.00: 정상 상태, 시스템이 잘 작동 중.
1.00 - 2.00: 약간의 부하, 시스템이 여전히 반응성이 좋을 수 있음.
2.00 이상: 부하가 증가하고 있으며, 성능 저하가 발생할 수 있음.
vmstat 명령어
vmstat 명령어를 사용하면 현재 실행 중인 프로세스의 상태를 확인할 수 있습니다:

r 열: 실행 중인 프로세스의 수.
b 열: I/O 대기 중인 프로세스의 수.
이 값을 통해 현재 시스템의 부하를 좀 더 구체적으로 분석할 수 있습니다.

/proc/sched_debug 확인
cat /proc/sched_debug 명령어를 통해 더 자세한 스케줄링 정보를 확인할 수 있습니다. 여기서 중요한 항목은:

nr_running: 현재 실행 가능한 프로세스의 수.
runnable tasks: 실행 대기 중인 태스크.
이 정보를 통해 시스템의 스케줄링 상태와 부하를 보다 깊이 이해할 수 있습니다.

11. LVM structure에 대해서 설명해보시오.

로지컬 볼륨 관리자
PV(Physical Volume): 물리적인 디바이스 블록
VG(Volume Group): 물리적인 디바이스를 하나의 가상 디바이스 블록으로 그룹핑한 것
LV(Logical Volume): VG로 그룹핑된 볼륨을 논리적인 블록디바이스(파티션)으로 만드는 것

LVM(로지컬 볼륨 관리자)은 리눅스에서 스토리지 관리를 유연하게 해주는 시스템입니다. LVM의 구조는 다음과 같이 구성됩니다:

1. PV (Physical Volume)
물리적인 디스크 드라이브나 파티션을 의미합니다.
LVM에서 사용될 수 있는 기본 단위로, 물리적인 스토리지 장치를 나타냅니다.
여러 개의 PV를 하나의 VG로 묶을 수 있습니다.


2. VG (Volume Group)
하나 이상의 PV를 그룹화하여 생성된 논리적인 스토리지 풀입니다.
VG는 물리적 볼륨들로부터 할당된 공간을 관리합니다.
VG 내에서 여러 개의 LV를 생성할 수 있습니다.


3. LV (Logical Volume)
VG 내에서 생성된 논리적인 볼륨으로, 실제로 파일 시스템을 생성하고 데이터를 저장하는 데 사용됩니다.
LV는 사용자가 접근할 수 있는 장치로, 파티션처럼 사용할 수 있습니다.
필요에 따라 크기를 조정하거나 여러 LV를 생성하여 사용할 수 있습니다.


LVM의 장점
유연성: 스토리지 크기를 동적으로 조정할 수 있어, 필요에 따라 쉽게 용량을 추가하거나 줄일 수 있습니다.
스냅샷: LV의 상태를 특정 시점에서 저장할 수 있어, 데이터 백업 및 복구가 용이합니다.
다중화: 여러 PV를 결합하여 하나의 VG를 만들 수 있어, 데이터의 분산 저장이 가능합니다.
이러한 구조 덕분에 LVM은 효율적인 스토리지 관리와 유연한 용량 조정을 가능하게 합니다.

 

12. 리눅스 배포본을 비교해보시오. (Red Hat, CentOS, Oracle Linux, SUSE, Ubuntu)

리눅스 배포본은 각기 다른 특징과 사용 목적을 가지고 있어, 적절한 선택이 중요합니다. 여기서는 Red Hat, CentOS, Oracle Linux, SUSE, Ubuntu의 주요 특징을 비교해보겠습니다.

1. Red Hat Enterprise Linux (RHEL)
용도: 기업용 서버 및 고급 인프라에 주로 사용됩니다.
지원: 상업적으로 지원되며, 기술 지원과 서비스가 제공됩니다.


특징:
안정성과 보안성이 높음.
다양한 패키지와 도구를 제공.
Red Hat Subscription Model을 통해 업데이트와 지원을 받음.


2. CentOS
용도: RHEL의 무료 버전으로, 서버 환경에서 널리 사용됨.
지원: 커뮤니티 기반의 지원 체계.


특징:
RHEL의 소스를 기반으로 하여 거의 같은 성능을 제공합니다.
기관과 기업에서 비용을 절약하기 위해 많이 사용됨.
업데이트 주기가 RHEL과 비슷하지만, 커뮤니티 지원이 필요함.


3. Oracle Linux
용도: Oracle 소프트웨어 제품과 함께 사용하기 최적화됨.
지원: Oracle에서 상업적인 지원 제공.


특징:
Red Hat과 호환성을 유지하면서 Oracle의 성능 최적화를 포함.
Ksplice를 사용하여 재부팅 없이 커널 패치를 적용 가능.
Oracle 클라우드와의 통합이 뛰어남.


4. SUSE Linux Enterprise Server (SLES)
용도: 기업 환경과 미션 크리티컬 서버에 최적화됨.
지원: 상업적 지원이 제공됨.


특징:
안정성 및 효율성이 뛰어나고, 리소스 관리 능력이 뛰어남.
유연한 로드밸런싱 기능과 스토리지 관리 기능 지원.
SAP 애플리케이션에 대한 최적화가 강점.


5. Ubuntu
용도: 개인용 및 서버 환경에서 많이 사용됨.
지원: 무료로 사용 가능하고, 상업적 지원도 있음.


특징:
사용하기 쉬운 인터페이스로 개인 사용자와 초기 사용자가 선호함.
매년 LTS(장기 지원) 버전이 출시되어 안정성을 제공.
소프트웨어 생태계가 다양하고, 커뮤니티 지원이 활발함.


리눅스 배포본은 각각의 장점과 용도가 있으므로 사용자와 환경의 요구에 따라 선택하는 것이 중요합니다. Red Hat과 SUSE는 주로 기업 환경에 최적화되어 있으며, CentOS와 Oracle Linux는 비용을 절감하면서 안정성을 원할 때 유용합니다. 반면에 Ubuntu는 개인 사용자와 개발자에게 인기 있는 선택입니다. 각 배포본의 특징을 잘 이해하면 최적의 선택을 할 수 있습니다.

'Computer Science > Operating System' 카테고리의 다른 글

Linux - Security  (4) 2024.08.31

1. 네트워크 : 노드와 링크가 서로 연결되어 있으며, 리소스를 공유하는 집합을 의미

  - 노드 : 서버, 라우터, 스위치 등 장치

  - 링크(엣지) : 유선 또는 무선과 같은 연결매체 (와이파이나 LAN)

2. 트래픽 : 트래픽은 특정시점에 링크 내의 “흐르는” 데이터의 양을 말합니다.

예를 들어 서버에 저장된 파일(문서,이미지,동영상 등)을 클라이언트(사용자)가 다운로드 시 발생되는 데이터의 누적량을 뜻합니다.

트래픽과 처리량을 헷갈릴 수 있는데 이렇게 이해하면 됩니다.

  - 트래픽이 많아졌다. = 흐르는 데이터가 많아졌다.

  - 처리량이 많아졌다. = 처리되는 트래픽이 많아졌다.

 

A1. 100KB x 1,000 = 100,000KB(100MB)

A2. 10MB x 10 = 100MB

 

3. 처리량 : 처리량(throughput)은 링크 내에서 성공적으로 전달된 데이터의 양을 말하며 보통 얼만큼의 트래픽을 처리했는지를 나타냅니다. 많은 트래픽을 처리한다 = 많은 처리량을 가진다.

  - 단위 : bps(bits per second) 초당 전송 또는 수신되는 비트 수

 

처리량은 사용자들이 많이 접속할 때마다 커지는 트래픽, 네트워크 장치 간의 대역폭, 네트워크 중간에 발생하는 에러, 장치의 하드웨어 스펙에 영향을 받습니다.

 

4. 대역폭 : 대역폭(bandwidth)은 주어진 시간 동안 네트워크 연결을 통해 흐를 수 있는 최대 비트 수를 말하며 최대로 처리할 수 있는 트래픽을 말합니다.

 

예를 들어 고속도로의 차선이 2차선보다 8차선일 때 더욱 원활하게 교통이 이루어지듯이 대역폭이 높을수록 사용자에게 빠른 서비스를 제공 할 수 있습니다. 대략적인 최대동시접속자수를 유추하는데의 척도가 됩니다.

  - 단위 : bps(bits per second) 초당 전송 또는 수신되는 비트 수

 

Q. 100Mbps라는 대역폭을 가진 서버가 있고 한사용자당 100kbps로 동영상 파일을 요청한다고 해봅시다. 최대 동접자수는 어떻게 될까요?

 

A.100Mbps / 100kbps = 약 1000명

 

5. RTT : RTT(Round Trip Time : 왕복 지연시간)는 신호를 전송하고 해당 신호의 수신확인에 걸린 시간을 더한 값이자 어떤 메시지가 두 장치 사이를 왕복하는 데 걸린 시간입니다.

 

출처 : 인프런 강의, CS 지식의 정석 | 디자인패턴 네트워크 운영체제 데이터베이스 자료구조, 강사 : 큰돌

'Computer Science > Network' 카테고리의 다른 글

Linux - Network 3 / 3  (1) 2024.08.31
Linux - Network 2 / 3  (1) 2024.08.29
Linux - Network 1 / 3  (0) 2024.08.29
TCP 핸드쉐이크 프로세스  (0) 2024.08.27
HTTP Header  (0) 2024.08.21

Q. 인접행렬을 기반으로 탐색하기

 

조건 1.

정점은 0번부터 9번까지 10개의 노드가 있다. 1 - 2 / 1 - 3 / 3 - 4 라는 경로가 있다. (1번과 2번, 1번과 3번, 3번과 4번은 연결되어있다.) 이를 인접행렬로 표현한다면?

 

조건 2.

0번부터 방문하지 않은 노드를 찾고, 해당 노드부터 방문, 연결된 노드를 이어서 방문해서 출력하는 재귀함수를 만들고 싶다면 어떻게 해야할까? 또한, 정점을 방문하고 다시 방문하지 않게 만드려면 어떻게 해야할까?

 

 

정답코드

#include<bits/stdc++.h>
using namespace std;
const int V = 10;
bool a[V][V], visited[V];
void go(int from) {
    visited[from] = 1;
    cout << from << '\n';
    for(int i = 0; i < V; i++) {
        if(visited[i]) continue;
        if(a[from][i]) {
            go(i);
        }
    }
}

int main() {
    a[1][2] = 1; a[1][3] = 1; a[3][4] = 1;
    a[2][1] = 1; a[3][1] = 1; a[4][3] = 1;
    for(int i = 0; i < V; i++) {
        for(int j = 0; j < V; i++) {
            if(a[i][j] && visited[i] == 0) {
                go(i);
            }
        }
    }
}

 

출처 : 인프런 강의, CS 지식의 정석 | 디자인패턴 네트워크 운영체제 데이터베이스 자료구조, 강사 : 큰돌

'Computer Science > Data Structure' 카테고리의 다른 글

인접행렬 (1 / 2)  (0) 2024.08.22
연결리스트, 랜덤접근과 순차적 접근  (0) 2024.08.21

1. 그래프 : 정점과 간선으로 이루어져 있는 자료구조

    1-1. 정점 : 노드

    1-2. 간선 : 단방향 간선, 양방햔 간선(= 무방향 간선)

 

2. 인접행렬 : 정점과 간선을 컴퓨터에게 그래프로 알려주기 위한 방법

      - 그래프에서 정점과 간선의 관계를 나타내는 bool 타입의 정사각형 행렬을 의미

      - 정사각형 행렬의 각 요소가 0 또는 1이라는 값을 가짐을 의미

      - 표기법

         a[from][to] = 1 : from ~ to로가는 간선이 있음, 0이면 없음

         ex:)

         a[0][1] = 1, 0에서 1로 가는 간선이 존재

         a[2][0] = 1, a[2][1] = 1 ..

 

         0  1  1  1

         1  0  1  0

         1  1  0  0

         1  0  0  0

 

         - c++ 코드 예시

x, y = 4;

bool a[x][y] = {
   {0, 1, 1, 1},
   {1, 0, 1, 0},
   {1, 1, 0, 0},
   {1, 0, 0, 0},
};



# a[0][1] = 1
# a[2][1] = 1
# a[3][0] = 1
# ...

for(int i = 0; i < x; i++) { # y를 중심으로 x를 본다 (= 가로로 탐색)
	for(int j = 0; j < y; j++) {
        if(a[i][j]) {
            cout << i << "부터 " << j << "까지 경로가 있습니다.\n";
            // 해당 정점(=i)으로부터 탐색하는 로직
            bfs(i);
            dfs(i);
        }
    }
    
}

 

출처 : 인프런 강의, CS 지식의 정석 | 디자인패턴 네트워크 운영체제 데이터베이스 자료구조, 강사 : 큰돌

'Computer Science > Data Structure' 카테고리의 다른 글

인접행렬 (2 / 2)  (0) 2024.08.23
연결리스트, 랜덤접근과 순차적 접근  (0) 2024.08.21

1. 연결리스트(linked list)

연결리스트는 노드로 감싸진 요소를 인접한 메모리 위치가 아닌, 독립적으로 저장하며 각 노드는 next 또는 next, prev라는 포인터로 서로 연결된 선형적인 자료구조

Data는 Node로 감싸져 있고, 가장 처음을 Head라고 한다.

 

2. 노드

노드는 단일 연결 리스트 기준으로 data, 그리고 노드와 노드를 잇게 만드는 next라는 포인터로 이루어져 있습니다.

class Node {
public:
    int data;
    Node* next; # 포인터
    Node(){
    	data = 0;
        next = NULL;
    }
    Node(int data){
    	this->data = data;
        this->next = NULL;
    }
};

 

연결리스트에서 삽입, 삭제는 O(1)의 시간 복잡도를 가진다. (연결을 끊고, 삽입하거나 제거한 후 연결하면 되기 때문)

연결리스트에서 접근, 탐색은 O(n)의 시간 복잡도를 가진다. (직접 접근이 안되고 1부터 n까지 접근해야하기 때문)

 

3. 이중연결리스트

이중연결리스트는 prev, next 두개의 포인터(양방향)으로 연결되어 있음

 

4. 원형연결리스트(Circular Linked List)

마지막 노드와 첫번째 노드가 연결되어 원을 형성, 싱글리스트 또는 이중연결리스트로 이루어진 2가지 타입의 원형연결리스트가 있음

  4-1. 원형싱글연결리스트 : Tail(끝)이 Head로 연결되어있는 구조

  4-2. 원형이중연결리스트 : Head -> Tail, Tail -> Head 모두 연결되어있는 구조

  4-3. c++ 예시 코드

#include <bits/stdc++.h>
using namespace std;
list<int> a;
void print(list <int> a) {
    for(auto it : a) cout << it << " ";
    cout << '\n';
}
int main() {
    for(int i = 1; i <= 3; i++) a.push_back(i); # 1 2 3
    for(int i = 1; i <= 3; i++) a.push_front(i); # 3 2 1
    
    auto it = a.begin(); it++;
    a.insert(it, 1000); # 3과 2사이에 1000을 삽입
    print(a); # 3 1000 2 1 1 2 3
    
    it = a.begin(); it++;
    a.erase(it); # 1000 제거
    print(a); # 3 2 1 1 2 3
    
    a.pop_front(); # 맨 앞 3 제거
    a.pop_back(); # 맨 뒤 3 제거
    print(a); # 2 1 1 2
    
    cout << a.front() << " : " << a.back() << '\n'; # 2 : 2
    a.clear(); # 연결리스트를 모두 소거
    return 0;
}

# 출력
# 3 2 1 1 2 3
# 3 1000 2 1 1 2 3
# 3 2 1 1 2 3
# 2 1 1 2
# 2 : 2

 

5. 랜덤접근과 순차적 접근

  5-1. 순차적 접근 : 시작부터 순차적으로 접근을 하는 자료구조

    ex:) linked list

    O -- O -- O --> O --> ... --> O // O(n) 시간복잡도

 

  5-2. 랜덤 접근 : 직접 접근이라고 하며, 임의의 인덱스에 직접 접근할 수 있는 자료구조

    ex:) array, vector

    a[3] => 4, a[100] => 5 // O(1) 시간복잡도

 

출처 : 인프런 강의, CS 지식의 정석 | 디자인패턴 네트워크 운영체제 데이터베이스 자료구조, 강사 : 큰돌

'Computer Science > Data Structure' 카테고리의 다른 글

인접행렬 (2 / 2)  (0) 2024.08.23
인접행렬 (1 / 2)  (0) 2024.08.22

+ Recent posts