Chapter 34. 고급 네트워킹
34.1. 요약
이 장에서는 여러 가지 고급 네트워킹 주제를 다룹니다.
이 장을 읽고 나면 다음 사항을 알게 될 것입니다:
- 게이트웨이와 라우팅의 기본 사항.
- USB 테더링을 설정하는 방법.
- IEEE® 802.11 및 Bluetooth® 장치를 설정하는 방법.
- FreeBSD가 브리지 역할을 하도록 하는 방법.
- 네트워크 PXE 부팅을 설정하는 방법.
- FreeBSD에서 공통 주소 중복 프로토콜(CARP)의 기능을 활성화하고 활용하는 방법.
- FreeBSD에서 여러 VLAN을 구성하는 방법.
- 블루투스 헤드셋 구성하기.
이 장을 읽기 전에 먼저 다음 사항을 이해해야 합니다:
- /etc/rc 스크립트의 기본 사항을 이해합니다.
- 기본적인 네트워크 용어를 숙지합니다.
- FreeBSD의 기본 네트워크 구성을 이해합니다(FreeBSD 네트워크).
- 새로운 FreeBSD 커널을 구성하고 설치하는 방법을 알 수 있습니다(FreeBSD 커널 구성하기).
- 추가 서드파티 소프트웨어를 설치하는 방법을 알 수 있습니다(애플리케이션 설치하기: 패키지 및 포트).
34.2. 게이트웨이와 라우팅
라우팅은 한 시스템이 다른 시스템으로 가는 네트워크 경로를 찾을 수 있도록 하는 메커니즘입니다. 라우팅은 '목적지'와 '게이트웨이'를 나타내는 정의된 주소 쌍입니다. 경로는 지정된 목적지로 가려고 할 때 지정된 게이트웨이를 통해 패킷을 보내도록 지정합니다. 목적지에는 개별 호스트, 서브넷, "default"의 세 가지 유형이 있습니다. "default"는 다른 경로가 적용되지 않는 경우 사용됩니다. 또한 게이트웨이에는 개별 호스트, 인터페이스라고도 하는 링크, 이더넷 하드웨어(MAC) 주소의 세 가지 유형이 있습니다. 알려진 경로는 라우팅 테이블에 저장됩니다.
이 섹션에서는 라우팅 기본 사항에 대한 개요를 제공합니다. 그런 다음 FreeBSD 시스템을 라우터로 구성하는 방법을 시연하고 몇 가지 문제 해결 팁을 제공합니다.
34.2.1. 라우팅 기초
FreeBSD 시스템의 라우팅 테이블을 보려면 netstat(1)을 사용하세요:
% netstat -r
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
default outside-gw UGS 37 418 em0
localhost localhost UH 0 181 lo0
test0 0:e0:b5:36:cf:4f UHLW 5 63288 re0 77
10.20.30.255 link#1 UHLW 1 2421
example.com link#1 UC 0 0
host1 0:e0:a8:37:8:1e UHLW 3 4601 lo0
host2 0:e0:a8:37:8:1e UHLW 0 5 lo0 =>
host2.example.com link#1 UC 0 0
224 link#1 UC 0 0
이 예제의 항목은 다음과 같습니다:
default
이 표의 첫 번째 경로는 default 경로를 지정합니다. 로컬 시스템이 원격 호스트에 연결해야 할 때 라우팅 테이블을 확인하여 알려진 경로가 존재하는지 확인합니다. 원격 호스트가 테이블의 항목과 일치하면 시스템은 해당 항목에 지정된 인터페이스를 사용하여 연결할 수 있는지 확인합니다.
목적지가 항목과 일치하지 않거나 알려진 경로가 모두 실패하면 시스템은 해당 항목을 기본 경로로 사용합니다. 로컬 영역 네트워크에 있는 호스트의 경우 기본 경로의 Gateway 필드는 인터넷에 직접 연결되어 있는 시스템으로 설정됩니다. 이 항목을 읽을 때 Flags 열에 게이트웨이가 사용 가능(UG)임을 나타내는지 확인합니다.
자체적으로 외부 세계의 게이트웨이로 작동하는 시스템의 기본 경로는 인터넷 서비스 제공업체(ISP)의 게이트웨이 시스템이 됩니다.
localhost
두 번째 경로는 localhost 경로입니다. localhost의 Netif 열에 지정된 인터페이스는 루프백 장치라고도 하는 lo0입니다. 이는 이 대상에 대한 모든 트래픽이 네트워크를 통해 전송되지 않고 내부에 있어야 함을 나타냅니다.
MAC 주소
0:e0: 로 시작하는 주소는 MAC 주소입니다. FreeBSD는 로컬 이더넷에서 호스트(예제에서는 test0)를 자동으로 식별하고 이더넷 인터페이스를 통해 해당 호스트에 대한 경로(re0)를 추가합니다. 이 유형의 경로에는 Expire 열에서 볼 수 있는 시간 제한이 있으며, 호스트가 특정 시간 동안 응답하지 않을 때 사용됩니다. 이 경우 이 호스트에 대한 경로는 자동으로 삭제됩니다. 이러한 호스트는 최단 경로 결정을 기반으로 로컬 호스트에 대한 경로를 계산하는 RIP(라우팅 정보 프로토콜)를 사용하여 식별됩니다.
subnet
FreeBSD는 로컬 서브넷에 대한 서브넷 경로를 자동으로 추가합니다. 이 예에서 10.20.30.255는 서브넷 10.20.30의 브로드캐스트 주소이고 example.com은 해당 서브넷과 연결된 도메인 이름입니다. 지정 link#1은 머신의 첫 번째 이더넷 카드를 나타냅니다.
로컬 네트워크 호스트와 로컬 서브넷은 routed(8)이라는 데몬에 의해 경로가 자동으로 구성됩니다. 이 데몬이 실행되지 않으면 관리자가 정적으로 정의한 경로만 존재합니다.
host
host1 줄은 이더넷 주소로 호스트를 나타냅니다. 이 호스트는 보내는 호스트이므로 FreeBSD는 이더넷 인터페이스가 아닌 루프백 인터페이스(lo0)를 사용한다는 것을 알고 있습니다.
두 개의 host2 줄은 ifconfig(8)을 사용하여 생성된 별칭을 나타냅니다. lo0 인터페이스 뒤의 ⇒ 기호는 루프백 주소 외에 별칭이 설정되었음을 나타냅니다. 이러한 경로는 해당 별칭을 지원하는 호스트에만 표시되며 로컬 네트워크의 다른 모든 호스트에는 해당 경로에 대한 link#1 줄이 있습니다.
224
마지막 줄(대상 서브넷 224)은 멀티캐스팅을 처리합니다.
각 경로의 다양한 속성은 Flags 열에서 볼 수 있습니다. 흔히 볼 수 있는 라우팅 테이블 플래그에는 이러한 플래그 중 일부와 그 의미가 요약되어 있습니다:
플래그 |
목적 |
U |
경로가 활성(up)입니다. |
H |
경로 대상은 단일 호스트입니다. |
G |
이 대상에 대한 모든 것을 이 게이트웨이로 보내면 이 게이트웨이에서 어디로 보낼지 알아냅니다. |
S |
이 경로는 정적으로 구성되었습니다. |
C |
이 경로를 기반으로 새 경로를 복제하여 머신이 연결할 수 있도록 합니다. 이 유형의 경로는 일반적으로 로컬 네트워크에 사용됩니다. |
W |
경로는 로컬 영역 네트워크(복제) 경로를 기반으로 자동 구성되었습니다. |
L |
경로에는 이더넷(링크) 하드웨어에 대한 참조가 포함됩니다. |
FreeBSD 시스템에서는 기본 게이트웨이의 IP 주소를 지정하여 /etc/rc.conf에서 기본 경로를 정의할 수 있습니다:
defaultrouter="10.20.30.1"
route를 사용하여 수동으로 경로를 추가할 수도 있습니다:
$ route add default 10.20.30.1
수동으로 추가한 경로는 재부팅 후에도 유지되지 않습니다. 네트워크 라우팅 테이블의 수동 조작에 대한 자세한 내용은 route(8)을 참조하세요.
34.2.2. 정적 경로로 라우터 구성하기
듀얼 홈 시스템인 경우 FreeBSD 시스템을 네트워크의 기본 게이트웨이 또는 라우터로 구성할 수 있습니다. 듀얼 홈 시스템은 적어도 두 개의 서로 다른 네트워크에 상주하는 호스트입니다. 일반적으로 각 네트워크는 별도의 네트워크 인터페이스에 연결되지만, IP 앨리어싱을 사용하여 각각 다른 서브넷에 있는 여러 주소를 하나의 물리적 인터페이스에 바인딩할 수 있습니다.
시스템이 인터페이스 간에 패킷을 전달하려면 FreeBSD를 라우터로 구성해야 합니다. 인터넷 표준과 좋은 엔지니어링 관행으로 인해 FreeBSD 프로젝트는 이 기능을 기본적으로 활성화하지 않지만 /etc/rc.conf에 이 줄을 추가하여 부팅 시 시작되도록 구성할 수 있습니다:
gateway_enable="YES" # Set to YES if this host will be a gateway
지금 라우팅을 사용하려면 sysctl(8) 변수 net.inet.ip.forwarding을 1로 설정하세요. 라우팅을 중지하려면 이 변수를 0으로 재설정하세요.
라우터의 라우팅 테이블에는 다른 네트워크에 도달하는 방법을 알 수 있도록 추가 경로가 필요합니다. 경로는 정적 경로를 사용하여 수동으로 추가하거나 라우팅 프로토콜을 사용하여 경로를 자동으로 학습할 수 있습니다. 정적 경로는 소규모 네트워크에 적합하며 이 섹션에서는 소규모 네트워크에 정적 라우팅 항목을 추가하는 방법을 설명합니다.
Note
대규모 네트워크의 경우, 정적 경로는 빠르게 확장할 수 없게 됩니다. FreeBSD는 라우팅 프로토콜인 RIP, 버전 1과 2, IRDP를 제공하는 표준 BSD 라우팅 데몬 routed(8)와 함께 제공됩니다. BGP 및 OSPF 라우팅 프로토콜에 대한 지원은 net/quagga 패키지 또는 포트를 사용하여 설치할 수 있습니다.
다음 네트워크를 생각해 보세요:
이 시나리오에서 라우터A는 나머지 인터넷에 대한 라우터 역할을 하는 FreeBSD 머신입니다. 기본 경로가 10.0.0.1로 설정되어 외부 세계와 연결할 수 있습니다. 라우터B는 이미 192.168.1.1을 기본 게이트웨이로 사용하도록 구성되어 있습니다.
정적 경로를 추가하기 전 라우터A의 라우팅 테이블은 다음과 같습니다:
$ netstat -nr
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 10.0.0.1 UGS 0 49378 xl0
127.0.0.1 127.0.0.1 UH 0 6 lo0
10.0.0.0/24 link#1 UC 0 0 xl0
192.168.1.0/24 link#2 UC 0 0 xl1
현재 라우팅 테이블을 사용하면 라우터A에 192.168.2.0/24 네트워크에 대한 경로가 없습니다. 다음 명령은 192.168.1.2를 다음 홉으로 사용하여 라우터A의 라우팅 테이블에 Internal Net 2 네트워크를 추가합니다:
$ route add -net 192.168.2.0/24 192.168.1.2
이제 라우터A는 192.168.2.0/24 네트워크의 모든 호스트에 연결할 수 있습니다. 그러나 FreeBSD 시스템이 재부팅되면 라우팅 정보가 유지되지 않습니다. 정적 경로를 영구적으로 유지해야 하는 경우 /etc/rc.conf에 추가하세요:
# Add Internal Net 2 as a persistent static route
static_routes="internalnet2"
route_internalnet2="-net 192.168.2.0/24 192.168.1.2"
static_routes 구성 변수는 공백으로 구분된 문자열 목록으로, 각 문자열은 경로 이름을 참조합니다. route_internalnet2 변수에는 해당 경로 이름에 대한 정적 경로가 포함됩니다.
static_routes에 둘 이상의 문자열을 사용하면 여러 개의 정적 경로가 생성됩니다. 다음은 192.168.0.0/24 및 192.168.1.0/24 네트워크에 대한 정적 경로를 추가하는 예제입니다:
static_routes="net1 net2"
route_net1="-net 192.168.0.0/24 192.168.0.1"
route_net2="-net 192.168.1.0/24 192.168.1.1"
34.2.3. 문제 해결
주소 공간이 네트워크에 할당되면 서비스 제공업체는 네트워크의 모든 트래픽이 해당 사이트의 링크로 전송되도록 라우팅 테이블을 구성합니다. 그렇다면 외부 사이트는 네트워크의 ISP에 패킷을 보낼지 어떻게 알 수 있을까요?
할당된 모든 주소 공간을 추적하고 인터넷 백본 또는 전국 및 전 세계 인터넷 트래픽을 전송하는 주요 간선 회선에 대한 연결 지점을 정의하는 시스템이 있습니다. 각 백본 머신에는 특정 네트워크의 트래픽을 특정 백본 캐리어로, 그리고 거기에서 특정 네트워크에 도달할 때까지 서비스 제공업체 체인을 따라 내려가는 마스터 테이블 세트의 사본이 있습니다.
서비스 제공업체는 백본 사이트에 자신이 사이트의 연결 지점, 즉 내부 경로임을 알리는 것이 서비스 제공업체의 임무입니다. 이를 경로 전파라고 합니다.
간혹 경로 전파에 문제가 발생하여 일부 사이트에 연결할 수 없는 경우가 있습니다. 라우팅이 고장난 위치를 파악하는 데 가장 유용한 명령은 traceroute 입니다. ping이 실패할 때 유용합니다.
traceroute를 사용할 때는 연결할 원격 호스트의 주소를 포함하세요. 출력에는 시도 경로를 따라 게이트웨이 호스트가 표시되며, 결국 대상 호스트에 도달하거나 연결 부족으로 인해 종료됩니다. 자세한 내용은 traceroute(8)을 참조하세요.
34.2.4. 멀티캐스트 고려 사항
FreeBSD는 기본적으로 멀티캐스트 애플리케이션과 멀티캐스트 라우팅을 모두 지원합니다. 멀티캐스트 애플리케이션은 FreeBSD에서 실행하기 위해 특별한 구성이 필요하지 않습니다. 멀티캐스트 라우팅을 지원하려면 다음 옵션을 커스텀 커널에 컴파일해야 합니다:
options MROUTING
멀티캐스트 라우팅 데몬인 mrouted는 net/mrouted 패키지 또는 포트를 사용하여 설치할 수 있습니다. 이 데몬은 DVMRP 멀티캐스트 라우팅 프로토콜을 구현하며 터널과 DVMRP를 설정하기 위해 /usr/local/etc/mrouted.conf를 편집하여 구성합니다. mrouted를 설치하면 map-mbone 및 mrinfo와 관련 매뉴얼 페이지도 설치됩니다. 구성 예제는 이를 참조하세요.
Note
많은 멀티캐스트 설치에서 DVMRP는 대부분 PIM 프로토콜로 대체되었습니다. 자세한 내용은 pim(4)를 참조하세요.
34.3. 가상 호스트