Ubuntu 16.04.6 LTS에 작성한 DHCP 클라이언트를 테스트하고 싶습니다. 내 노트북에서 로컬로 이 작업을 수행하고 싶습니다. 즉, 내부적으로 DHCP 패킷을 보내고 받습니다.
내가 시도한 것은 다음과 같습니다.
- 두 개의 가상 인터페이스가 생성됩니다
dummy0
:dummy1
- 다음 두 인터페이스에 대해 브리지가 생성됩니다.
br0
목표는 dummy0
인터페이스에서 DHCP 검색을 보내고 받는 것 입니다 dummy1
. 인터페이스에서 DHCP 검색을 보냈으나 불행하게도 dummy0
인터페이스에 패킷이 표시되지 않습니다. dummy1
수신할 수 있으면 다음 단계는 DHCP 서버를 실행하여 dummy1
클라이언트의 작동을 테스트하는 것입니다.
wireshark
인터페이스에 DHCP 검색이 표시됩니다 . dummy0
나는 온라인에서 아무것도 본 적이 없습니다 dummy1
. 또한: 에서 패킷을 봤습니다 br0
.
더 좋은 방법이 있을 것 같은데, 어떻게 하는지 알려주실 수 있나요?
답변1
"부메랑 패킷"(한 로컬 인터페이스에서 방출되고 다른 인터페이스에서 수신됨)은 라우팅 오류(어딘가에서 루프됨)로 간주되며 기본적으로 커널에 의해 삭제됩니다.
게다가 가상 장치를 사용하는 것도 번거롭습니다.
더 나은 접근 방식: 네트워크 네임스페이스를 하나(또는 두 개) 만들고 네트워크 네임스페이스와 기본 네임스페이스(또는 두 네트워크 네임스페이스 모두) 사이에 veth 쌍을 배치하는 것입니다. 브리지가 필요하지 않습니다. 그런 다음 원하는 모든 것을 테스트하십시오.
xterm
삶을 더 쉽게 만들려면 각 네임스페이스에서 하나씩 실행하세요 .
이 작업을 수행하는 데 사용하는 스크립트는 다음과 같습니다. 자유롭게 수정해 보세요.
#!/bin/bash
# Setup network namespace with veth pair, start xterm in it
# nsterm ns0 veth0 10.0.0 yellow 24
#
# tested: yellow, lime, orange, cyan
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root" 1>&2
exit 1
fi
NS=${1:-ns0}
DEV=${2:-veth0}
DEV_A=${DEV}a
DEV_B=${DEV}b
ADDR=${3:-10.0.0}
ADDR_A=${ADDR}.254
ADDR_B=${ADDR}.1
MASK=${5:-24}
COL=${4:-yellow}
# echo ns=$NS dev=$DEV col=$COL mask=$MASK
ip netns add $NS
ip link add $DEV_A type veth peer name $DEV_B netns $NS
ip addr add $ADDR_A/$MASK dev $DEV_A
ip link set ${DEV}a up
ip netns exec $NS ip addr add $ADDR_B/$MASK dev $DEV_B
ip netns exec $NS ip link set ${DEV}b up
ip netns exec $NS ip link set lo up
ip netns exec $NS ip route add default via $ADDR_A dev $DEV_B
ip netns exec $NS su -c "xterm -bg $COL &" your_username
답변2
여기에 있는 답변(명령)은 이해하고 따르기 쉽다고 생각합니다. veth 쌍의 경우 ping이 인터페이스 이름을 인식하지 못하고 tc qdisc netem이 작동하지 않습니다.