다음으로 사용 가능한 네트워크 인터페이스 이름과 IP 범위를 결정하는 방법은 무엇입니까?

다음으로 사용 가능한 네트워크 인터페이스 이름과 IP 범위를 결정하는 방법은 무엇입니까?

호스트에서 TUN/TAP 인터페이스를 생성하는 애플리케이션을 개발 중입니다. 다음을 사용하여 이러한 인터페이스를 만들 수 있습니다.

sudo ip tuntap add tap0 mode tap

이제 문제는 tap0여기에 하드코딩되어 있다는 것입니다. 역동적이어야 합니다.

다음 클릭 장치를 만들 때는 tap1다음과 같아야 합니다.

이제 장치에 대한 범위 제공을 진행할 때 다음을 수동으로 수행할 수 있습니다.

sudo ip addr add 172.16.0.1/24 dev tap0

이제 tap1을 생성할 때 IP가 겹치는 것을 원하지 않습니다.

이러한 탭 장치를 관리하는 쉬운 방법이 있습니까?

답변1

#!/bin/bash
i=0;
while [ $i -ne 5 ]
do
  sudo ip tuntap add tap$i mode tap &>/dev/null
  if [[ $? -eq 0 ]]; then
   echo "$i"
   exit 0
  fi
  i=$(($i+1))
done
exit 1

tun0부터 tun4까지 시도해보고, 첫 번째 무료 인터페이스를 만들고 번호를 반환하세요.

답변2

다음으로 사용 가능한 클릭 장치에 대해 다음 기능을 사용할 수 있습니다.

function nextTapDevice() {
    counter=-1
    while [ $? -eq 0 ]; do
        counter=$(($counter+1))
        ip link show tap$counter &> /dev/null 
    done

    echo tap$counter
}

nextTapDevice

설명된 @stony와 동일하게 작동하지만 ip link show오류가 발생할 때까지 실행됩니다. 이는 지정된 장치를 tap$counter사용할 수 없음을 의미합니다. 이 장치 이름은 다음으로 사용 가능한 장치 이름이 됩니다.


다음으로 사용 가능한 IP 범위를 얻으려면 먼저 정책이나 IP 범위를 준수해야 합니다. 이 IP 범위가 Docker 등의 다른 애플리케이션과 충돌하지 않는지 확인하세요.

내 사용 사례에서는 를 사용하기로 결정했습니다 172.16.0.0/16. 각 가상 머신(사용 중인 애플리케이션)에 마지막 옥텟을 할당하겠습니다. 256개의 가상 머신을 실행할 수 있습니다.

nextTapDevice위에서 작성한 함수의 수정된 버전을 재사용하겠습니다 . tap$counter대신 위 함수에서 카운터를 반환하겠습니다.

나머지 코드는 다음과 같습니다.

function nextTapDevice() {
    counter=-1
    while [ $? -eq 0 ]; do
        counter=$(($counter+1))
        ip link show tap$counter &> /dev/null 
    done

    echo $counter
}

# nextTapDevice

function nextIPRange() {
    for ((i=0; i<$(nextTapDevice);++i)); do
        output=$(ip -br addr show tap$i | awk '{print $3}')
    done
    echo $output | awk -F. '{ print $1"."$2"."$3+1"."$4 }'
}

nextIPRange

단점: 세 번째 옥텟은 256 이후에도 계속 증가합니다. 사용 사례가 해당 지점을 넘어서는 경우 추가 검사를 구현해야 할 수도 있습니다.

답변3

재미삼아 여기에 tunN이 로컬 IP 172.16.N.1과 원격 IP 10.172.N.1을 사용할 것이라는 가정을 기반으로 한 FreeBSD 솔루션이 있습니다.

#!/usr/bin/env bash

# what's the base name of the network interface?  NO SPACES!
devBase='tun'

# Maximum of N interfaces, numbered 0 .. N-1   NO HIGHER THAN 256!
N=256

# what's the printf spec of the tun's local address?  NO SPACES!
ipLocal='172.16.%d.1'

# what's the printf spec of the tun's remote address?  NO SPACES!
ipRemote='10.172.%d.1'

nextTun() {
# $1 is the device base name

  result="$(jot -w "${1}%d" $N 0 | grep -vxFf <(ifconfig -l | grep -ow "${1}[0-9]\+") | head -1)"
  if [[ -n "$result" ]]
  then
    printf '%s\n' "$result"
  else
    exit $?
  fi
}

if tun="$(nextTun $devBase)"
then
        devN=${tun#$devBase}
        printf 'Creating %s ...\n' "$tun"
        ipl=$(printf $ipLocal  $devN)
        ipr=$(printf $ipRemote $devN)
        ifcfg="$(printf 'sudo ifconfig %s create %s %s' "$tun" $ipl $ipr )"
        sudo $ifcfg || {
                printf '"%s" failed.\n' $tun
                exit 2
        }
else
        printf 'No %s devices available.\n' "$devBase"
        exit 1
fi

이는 기본 인터페이스 이름을 허용하는 함수를 선언합니다 nextTun. 예를 들어 tun가능한 장치 목록을 빠르게 만들고 jot, 이미 사용 중인 모든 장치를 제거하고, 사용 가능한 첫 번째(가장 낮은) 장치를 가져옵니다. 사용 가능한 장치가 없으면 함수는 결과를 반환하지 않고 0이 아닌 종료 코드를 반환합니다.Ntuntuntuntun

메인 코드 테스트가 성공했습니다 nextTun. 발견되면 ifconfig적절한 로컬 및 원격 IP를 사용하여 장치 번호를 생성하는 데 필요한 구문을 구성합니다 tun. devN문법이 구성되면 sudo실행 단계로 전달됩니다. nextTun사용 가능한 장치 할당에 실패했음을 나타내는 경우 tun이 코드는 더 이상 사용 가능한 장치가 없음을 나타내고 0이 아닌 종료 코드를 반환합니다.

관련 정보