웹 서버(lightttpd) 및 (curl) 클라이언트를 실행하는 Linux 서버의 격리된 테스트 네트워크

StackOverflow https://stackoverflow.com//questions/12671587

문제

저는 알려진 트래픽을 NIC(libpcap 사용)에서 캡처한 다음 테스트하려는 애플리케이션에 공급하도록 요구하는 테스트 도구를 작성 중입니다.

내가 설정하려고 하는 것은 격리된 테스트 네트워크의 동일한 시스템에서 실행되는 웹 서버(이 경우 lighttpd)와 클라이언트(curl)입니다.스크립트는 전체 설정을 구동하며 목표는 웹 서버에서 다운로드할 각 클라이언트에 대한 파일 세트는 물론 클라이언트 수를 지정할 수 있는 것입니다.

나의 초기 접근 방식은 단순히 루프백(lo) 인터페이스를 사용하는 것이었습니다...127.0.0.1에서 웹 서버를 실행하고 클라이언트가 다음에서 파일을 가져오도록 합니다. http://127.0.0.1, lo 인터페이스에서 libpcap 기반 도구를 실행합니다.루프백 인터페이스가 실제 이더넷 인터페이스를 에뮬레이트하지 않는다는 사실을 제외하면 이것은 잘 작동합니다.가장 큰 문제는 패킷의 크기가 모두 일정하지 않다는 것입니다.32KB 이상이고 다소 무작위적입니다.lo에서 MTU를 낮추는 것도 불가능합니다(글쎄, 가능하지만 효과가 없습니다!).

또한 실제 인터페이스(eth0)에서 실행해 보았지만 내부 웹 서버와 통신하는 내부 웹 클라이언트이기 때문에 트래픽이 인터페이스를 떠나지 않으므로 libpcap은 이를 볼 수 없습니다.

그래서 저는 tun/tap을 사용하게 되었습니다.나는 socat을 사용하여 두 개의 tun 인터페이스를 tcp 연결과 함께 바인딩했으므로 실제로 다음과 같은 결과를 얻었습니다.

10.0.1.1/24 <-> tun0 <-socat-> tcp connection <-socat-> tun1 <-> 10.0.2.1/24

이것은 정말 깔끔한 해결책인 것 같습니다...tun/tap 장치는 실제 이더넷 장치를 에뮬레이션하므로 tun0(10.0.1.1)에서 웹 서버를 실행하고 tun0에서 캡처 도구를 실행하고 클라이언트를 tun1(10.0.2.1)에 바인딩할 수 있습니다.tc를 사용하여 이 트래픽에 셰이핑 규칙을 적용하고 Linux 상자 내에 가상 WAN을 생성할 수도 있습니다...하지만 작동하지 않습니다 ...

내가 사용한 socat 명령은 다음과 같습니다.

$ socat -d TCP-LISTEN:11443,reuseaddr TUN:10.0.1.1/24,up &
$ socat TCP:127.0.0.1:11443 TUN:10.0.2.1/24,up &

2개의 tun 인터페이스를 생성합니다(tun0 그리고 tun1), 각각의 IP 주소를 사용합니다.

내가 달리면 ping -I tun1 10.0.1.1, 응답이 없지만 내가 tcpdump -n -i tun0, ICMP 에코 요청이 상대방에게 전달되는 것을 볼 수 있지만 응답이 돌아올 징후는 없습니다.

# tcpdump -i tun0 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 65535 bytes
16:49:16.772718 IP 10.0.2.1 > 10.0.1.1: ICMP echo request, id 4062, seq 5, length 64
<--- insert sound of crickets here (chirp, chirp)

그렇다면 제가 뭔가 분명한 것을 놓치고 있는 건가요, 아니면 이것이 잘못된 접근 방식인가요?제가 시도해 볼 수 있는 다른 것이 있나요(예:2개의 물리적 인터페이스(eth0 및 eth1???).

가장 쉬운 방법은 2대의 머신을 사용하는 것이지만, 저는 이 모든 것이 독립적으로 이루어지도록 하여 다른 종속성 없이 단일 머신에서 모두 스크립팅하고 자동화할 수 있기를 원합니다.

업데이트:

2개의 socat를 tcp 연결로 연결할 필요는 없습니다. 다음과 같이 하는 것이 가능합니다(나에게는 바람직합니다).

socat TUN:10.0.1.1/24,up TUN:10.0.2.1/24,up &

그래도 같은 문제가 여전히 존재합니다 ...

도움이 되었습니까?

해결책

좋습니다. Linux 네트워크 네임스페이스(netns)를 사용하는 솔루션을 찾았습니다.여기에 사용 방법에 대한 유용한 기사가 있습니다. http://code.google.com/p/coreemu/wiki/네임스페이스

이것이 제가 설정을 위해 한 일입니다....

먼저 CORE를 다운로드하여 설치합니다. http://cs.itd.nrl.navy.mil/work/core/index.php

다음으로 이 스크립트를 실행하세요.

#!/bin/sh

core-cleanup.sh > /dev/null 2>&1
ip link set vbridge down > /dev/null 2>&1
brctl delbr vbridge > /dev/null 2>&1

# create a server node namespace container - node 0
vnoded -c /tmp/n0.ctl -l /tmp/n0.log -p /tmp/n0.pid > /dev/null
# create a virtual Ethernet (veth) pair, installing one end into node 0
ip link add name veth0 type veth peer name n0.0
ip link set n0.0 netns `cat /tmp/n0.pid`
vcmd -c /tmp/n0.ctl -- ip link set n0.0 name eth0
vcmd -c /tmp/n0.ctl -- ifconfig eth0 10.0.0.1/24 up

# start web server on node 0
vcmd -I -c /tmp/n0.ctl -- lighttpd -f /etc/lighttpd/lighttpd.conf

# create client node namespace container - node 1
vnoded -c /tmp/n1.ctl -l /tmp/n1.log -p /tmp/n1.pid > /dev/null
# create a virtual Ethernet (veth) pair, installing one end into node 1
ip link add name veth1 type veth peer name n1.0
ip link set n1.0 netns `cat /tmp/n1.pid`
vcmd -c /tmp/n1.ctl -- ip link set n1.0 name eth0
vcmd -c /tmp/n1.ctl -- ifconfig eth0 10.0.0.2/24 up

# bridge together nodes using the other end of each veth pair
brctl addbr vbridge
brctl setfd vbridge 0
brctl addif vbridge veth0
brctl addif vbridge veth1
ip link set veth0 up
ip link set veth1 up
ip link set vbridge up

이는 기본적으로 Linux 호스트(이 경우 노드 0과 노드 1)에 2개의 가상/격리/네임스페이스 네트워크를 설정합니다.웹 서버는 노드 0에서 시작됩니다.

이제 해야 할 일은 노드 1에서 컬을 실행하는 것뿐입니다.

vcmd -c /tmp/n1.ctl -- curl --output /dev/null http://10.0.0.1

그리고 tcpdump를 사용하여 트래픽을 모니터링합니다.

tcpdump -s 1514 -i veth0 -n

이것은 꽤 잘 작동하는 것 같습니다 ...아직 실험 중이지만 문제가 해결될 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top