질문/프로젝트

질문/프로젝트

Linux 네트워킹 네임스페이스를 사용하여 소규모 프로젝트를 구축하려고 하는데 사용 가능한 모든 Linux 네트워킹 기능과 컨테이너화 기술에 약간 압도되어 이 문제를 올바른 방식으로 진행하고 있는지 확신할 수 없습니다.

질문/프로젝트

eth0나는 현재 12개의 정적 공용 IPv4 주소( 1.1.1.1, 1.1.1.2, 1.1.1.3, ..., )가 할당된 네트워크 장치( )가 있는 간단한 Linux 상자를 가지고 있습니다 1.1.1.12. 나는 여러 개의 (네트워크) 네임스페이스가 있는 상황을 만들고 싶습니다. 각 네임스페이스는 실제로 자체 단일 네임스페이스를 가지고 있습니다.독점적인공용 IPv4 주소/인터페이스.

내 목표는 여러 개의 껍질을 회전시키는 것입니다.각각은 자체 네트워크 네임스페이스로 격리됩니다.(pid, ipc... 네임스페이스도 있습니다). 예를 들어,7번셸은 ns7고정 IP가 있는 단일(가상) 이더넷 인터페이스가 있는 네트워크 네임스페이스를 사용합니다 1.1.1.7. 예를 들어 해당 셸에서 apache/nginx를 시작하고 *:80에서 수신 대기하도록 하면 1.1.1.7:80다른 IPv4 주소의 포트 80으로 전달되는 트래픽은 ns7다시는 도착하지 않습니다. 80명도 1.1.1.7도착해야 합니다.오직네임스페이스의 프로세스에 도달합니다 ns7.

기본 아이디어는 네임스페이스가 실제로 영구적이라는 것입니다. 네임스페이스 자체와 관련 가상 네트워크 장치는 시스템 시작 시 (재)생성되어 시작됩니다.

잠재적인 해결책(내가 올바른 길을 가고 있는가?)

제가 직접 실험하지 않고 종합할 수 있었던 것에서 해결책은 아래에 설명된 것과 유사해야 합니다. 제가 여기서 올바른 길을 가고 있습니까?

  1. (가상) 레이어 2 브리지 장치를 생성하고 시작합니다 br0. L2(L3 아님)에서 작동하는지 확인하세요.

  2. 현재 이더넷 장치 eth0구성을 변경하여 부팅 시 계속 표시되지만 더 이상 IP 주소가 설정되거나(정적 또는 DHCP가 아님) 브리지 eth0에 할당되지 않도록 합니다.br0

  3. 일부 네트워크 네임스페이스 ip netns add ns2, ip netns add ns3, ..., 을 만듭니다 ip netns add ns12. 기본/루트 네임스페이스를 ns1.

  4. 가상 이더넷 인터페이스 net2a~ net2b, net3a~ net3b, net4a~ net4b, ... 의 여러 쌍을 생성합니다. 각 쌍에 대해 -version을 브리지 a에 연결하고 해당 네임스페이스에 -version을 할당합니다.br0b

  5. 각 네임스페이스 내에서 적절한 IPv4 주소 정보를 로컬 veth 장치(예: veth)에 net2b할당 하고 장치를 시작합니다.ns2

  6. IPv4 전달을 활성화해야 할 수도 있습니다(?)( /proc/sys/net/ipv4/ip_forward) 및/또는 ARP 필터링 활성화(?)( /proc/sys/net/ipv4/conf/all/arp_filter).

  7. 각 네임스페이스에는 (내가 아는 한) 자체 방화벽 구성이 있으므로 각 네임스페이스 내에서 일부 iptables/nftables 쉘 스크립트를 실행하고 일부 합리적인 기본값을 설정하고 로컬 요구에 맞게 조정하십시오.

이러한 가상 Linux 네트워크 장치에 더 익숙한 사람들에게 이것이 (거의) 실현 가능한 계획처럼 들리나요?

추가 세부정보(중요한 경우)

  • 운영 체제 정보:저는 수동 방화벽 구성 에만 사용하는 kernel 4.18, systemd및 가 포함된 CentOS 8을 실행하고 있습니다 (firewalld 항목은 아님).SELinuxnftables

  • 배경:제공된 모든 주소(예: 1.1.1.1) 및 인터페이스 이름(예: eth0) 등은분명히 희망이것은 어느 정도 개인 정보 보호상의 이유로 허구이지만, 더 중요한 것은 "각 네임스페이스에서 쉘을 실행한다"고 말하는 내 의도와 마찬가지로 간결성/단순성을 위한 것입니다.

  • 실제 요구사항:이러한 네임스페이스 환경에서 실행되는 다양한 유형의 소프트웨어가 있으며 각 네임스페이스에는 고유한 작업이 있으며 종종 여러 서비스가 포함됩니다. 또한 IPv4 주소를 서로 완전히 격리하는 것이 좋습니다. 대상 프로그램은 서버/데몬(아파치 httpd 예제와 같은)이며 바인딩하기를 원합니다.실제개인용 ipv4 또는 unixsocket의 포트에 바인딩하고 루트 네임스페이스의 소프트웨어가 역방향 프록시 미들웨어로 작동하도록 하는 대신 공용 인터페이스/포트입니다.

  • 왜 docker가 아닌가?(TL/DR) 이것은 옵션이지만 재미를 위해 뭔가를 사용자 정의하고 싶었습니다. (더 긴 호언장담) 이러한 네임스페이스 환경은 거의 모두 개인용이며, 그 중 하나는 내 개인 메일 서버를 실행하고 다른 하나는 개인용 저수준 웹 호스팅용입니다. 서버 트래픽 사이트, 일부 라이브 웹 개발 작업을 위한 웹 서버, 일부 취미 친구를 위한 무료 미니 VPS 역할을 하기 위해 내 자신의 sshd+webstack을 실행하는 쌍, 기본적으로 자동화된 프로세스를 실행하는 일부 등. 제가 하려는 작업과 docker와 같은 일반적인 컨테이너화 스택이 제공하는 것 사이에 큰 중복이 있다는 것을 알고 있습니다. 사실 제가 설명하는 시스템은 이미 대부분의 작업을 수행하고 있으며 대부분 Podman을 사용하고 있습니다(docker Same과 거의 동일). ) 나머지 대부분은 공통 루트 네임스페이스에서 병렬로 실행됩니다. 저는 여러 가지 이유로 이 중 일부를 깔끔하게 세세하게 관리하는 것을 좋아하며, 항목을 여러 개의 영구 네임스페이스로 분리할 수 있다면 훨씬 쉬울 것입니다. 내 방식. 내가 실제로 사용하는 컨테이너 소프트웨어가 제공하는 유일한 것은 Linux 커널 기능이므로 포기할 가치가 있는 프로젝트라고 생각합니다.포장지그리고 그것 없이도 이러한 일을 수행하는 방법을 알아내십시오. 나는 또한 이 일을 탐구하는 것의 교육적 가치를 즐깁니다. 왜냐하면 그것은 제가 일반적으로 하는 일이 아니기 때문입니다.

  • 산업용 컴퓨터:(단일) 네임스페이스 내의 프로세스가 IP를 통해 다른 네임스페이스(기본 네임스페이스도 아님)와 통신해야 하는 심각한 이유는 없습니다. 그러나 마음이 바뀌면 (지금까지의 내 생각이 대부분 맞다고 가정하면), 추가 L2 브리지를 설정하여 프로세스의 일부를 반복할 수 있다고 생각했습니다.와이즈-각 네임스페이스를 쌍으로 연결하고 해당 개인 192.168.x.x스타일 IPv4 주소를 할당합니다.

  • VPS/클라우드:이 머신은 물리적 머신이 아닌 VPS/가상서버/클라우드 서버입니다. 현재 컴퓨터에 존재하는 유일한/단일 네트워크 장치입니다. 이것은 eth0실제로 ens3CentOS 설치가 완료되기 직전에 자동으로 호출되고 실행되므로 이미 그 자체로 가상 장치입니다. lsmod현재 표시되어 veth로드 virtio_net되어 있습니다. 내 호스팅 제공업체가 Qemu를 사용하여 이 VPS를 제공하는 것 같습니다. 이것이 중요한지 확실하지 않습니다. 나는 그렇게해서는 안된다고 생각합니다. 비록 현재처럼 인터페이스를 복제(또는 더 생성)하고 인터페이스에 IPv4 및 네임스페이스를 직접 할당할 수 있는지 조사하는 데 시간을 보냈기 때문에 ens3브리지 장치와 veth 쌍이 필요하지 않았습니다. 이 검색에서는 실제로 아무 것도 나오지 않았으며 궁극적으로 하이퍼바이저 수준에서 설정을 변경하는 호스팅 공급자의 누군가의 도움 없이는 불가능하다고 결정했습니다. 일반적으로 도움이 되고 그러한 작업에 개방적일 수 있다고 생각하지만 이로 인해 내 솔루션이 향후 변경에 덜 유연해질 수 있으므로 가능하다면 이 문제를 완벽하게 제어할 수 있는 곳에서 수행하는 것을 선호합니다. 장치.

  • IPv6:간결함을 위해 IPv6에 대한 언급은 생략하겠습니다. 또한 IPv6 주소 블록이 있으며 비슷한 방식으로 사용할 계획입니다. 하지만 내 생각에는 IPv4를 먼저 작동시킨 다음 IPv6를 활성화하고 거기에서 진행하는 것이 가장 좋다고 생각합니다. 크게 다를 것이라고는 상상할 수 없습니다.

  • 내 구현:실제로 처음으로 작업을 수행한 후에는 모든 것을 구현하는 방법을 완전히 확신할 수 없었습니다. 프로젝트의 네트워킹 부분에서는 network-setup.sh모든 네트워킹 관련 필수 사항(예: 네임스페이스, 브리지 장치, veth 장치 등)이 있는지 테스트하기 위한 쉘 스크립트를 만든 다음 누락된 항목을 다시 생성하거나 설정하겠습니다. 그럼 그걸로 가세요시스템 단위 파일쉘 스크립트를 실행하고 표시하십시오.유닛 파일요구 사항에 따라 network-online.target. 그럼 또 다른쉘 스크립트그리고유닛 파일(부팅) 프로세스 중에 나중에 실행하려면 unshare또는체계init-문제의 프로세스를 실제로 시작하는 버전입니다. 하지만 누군가 더 좋은 아이디어가 있다면 듣고 싶습니다.

  • 다양한 네임스페이스 구현:man unshare내가 느낀 잠재적인 문제 중 하나는 util-linux( )가 호출 한다는 인상을 받았다는 것입니다.네트워크 네임스페이스man ip-netns같은 용어의 iproute2( )와는 의미가 다릅니다. 그러나 전자가 후자의 상위 집합/확장인지, 아니면 완전히 다르고 호환되지 않는 구현인지는 여전히 확실하지 않습니다. 실제로 컨테이너 관련 기술을 읽으면 이런 질문이 반복적으로 나오는 것 같습니다.

답변1

veth-pair를 사용한 연결 접근 방식이 작동하지만 더 쉬운 방법이 있습니다.

를 사용하세요 macvlan. 예를 들면 다음을 참조하세요.여기또는여기몇 가지 세부 사항 및 토론.

이는 물리적 인터페이스(귀하의 경우 eth0)를 상위 인터페이스(또는 "마스터 인터페이스")로 사용하고 동일한 상위 인터페이스를 사용하는 다른 장치에 완전히 투명하며 네트워크 네임스페이스로 이동할 수 있는 가상 인터페이스입니다.

그런 다음 네임스페이스 내의 IPv4 또는 IPv6 주소를 인터페이스에 할당하면 컨테이너 전용의 추가 물리적 네트워크 인터페이스가 있는 것처럼 작동합니다.

컨테이너가 서로 통신하기를 원하는지 여부에 따라 맛이 다릅니다. 자세한 내용은 설명서를 읽어보세요.

예, 방화벽(iptables)을 원한다면 각 네임스페이스에서도 그렇게 해야 합니다.

네임스페이스를 사용하는 BTW, Docker 및 기타 가상화 방법도 macvlans를 사용하므로 Apache, nginx 등만 원하는 경우 나머지 모든 작업(다른 파일 시스템, 로컬 DNS, 포트)을 수행하는 Docker 및/또는 Docker Compose 사용을 고려하세요. 매핑).

관련 정보