2장. Linux 네트워킹
이 작품은 AI를 사용하여 번역되었습니다. 여러분의 피드백과 의견을 환영합니다: translation-feedback@oreilly.com
Kubernetes에서 네트워킹 구현을 이해하려면 Linux에서 네트워킹의 기본을 이해해야 합니다. 궁극적으로 Kubernetes는 Linux(또는 Windows!) 머신을 위한 복잡한 관리 도구이며, Kubernetes 네트워크 스택으로 작업하는 동안 이를 무시하기는 어렵습니다. 이 장에서는 Kubernetes에서 주목해야 할 영역에 중점을 두고 Linux 네트워킹 스택에 대한 개요를 제공합니다. Linux 네트워킹과 네트워크 관리에 매우 익숙하다면 이 장을 훑어보거나 건너뛸 수 있다.
팁
이 장( )에서는 많은 Linux 프로그램을 소개합니다. man <program> 으로 액세스할 수 있는 매뉴얼 또는 맨 페이지에서 자세한 내용을 확인할 수 있습니다.
기본 사항
1장에서 사용한 Go 웹 서버를 다시 살펴보겠습니다. 이 웹 서버는 포트 8080에서 수신 대기하고 /에 대한 HTTP 요청에 대해 "Hello"를 반환합니다( 예제 2-1 참조).
예제 2-1. Go의 최소 웹 서버
packagemainimport("fmt""net/http")funchello(whttp.ResponseWriter,_*http.Request){fmt.Fprintf(w,"Hello")}funcmain(){http.HandleFunc("/",hello)http.ListenAndServe("0.0.0.0:8080",nil)}
경고
포트 1-1023( 잘 알려진 포트라고도 함)에 바인딩하려면 루트 권한이 필요합니다.
프로그램에는 항상 작동에 필요한 최소한의 권한만 부여해야 하며, 이는 일반적인 웹 서비스를 루트 사용자로 실행해서는 안 된다는 의미입니다. 이 때문에 많은 프로그램이 포트 1024 이상에서 수신 대기합니다(특히 HTTP 서비스의 경우 포트 8080이 일반적으로 선택됨). 가능하면 권한이 없는 포트에서 수신하고 인프라 리디렉션(로드 밸런서 포워딩, Kubernetes 서비스 등)을 사용하여 외부에서 보이는 권한이 있는 포트를 권한이 없는 포트에서 수신하는 프로그램에 전달하세요.
이렇게 하면 서비스의 취약점을 악용하는 공격자가 지나치게 광범위한 권한을 사용할 수 없게 됩니다.
이 프로그램이 Linux 서버 컴퓨터에서 실행 중이고 외부 클라이언트가 / 으로 요청을 한다고 가정해 보겠습니다. 서버에서는 어떤 일이 발생할까요? 먼저 프로그램이 주소와 포트를 수신해야 합니다. 프로그램은 해당 주소와 포트에 대한 소켓을 만들고 여기에 바인딩합니다. 소켓은 지정된 주소와 포트(이 경우 모든 IP 주소로8080 ) 모두에 대한 요청을 수신합니다.
참고
0.0.0.0 [::] 는 와일드카드 주소이며, 해당 프로토콜의 모든 주소와 일치하므로 소켓 바인딩에 사용될 때 사용 가능한 모든 IP 주소에서 수신 대기합니다.
이는 서비스를 실행하는 컴퓨터의 IP 주소에 ...