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