Constructing a Linux-Based Network Testing System?
10Brett-T asks: "Is it possible to build a Linux box with two interfaces to test a network's ability to carry traffic between two ports? I work for a company developing ethernet switching hardware. We need to test its ability to carry traffic correctly under a variety of conditions. Various vendors have expensive test platforms available that may or may not do the tests we want, but we have a tight budget. We decided to try building a Linux system with two ethernet interfaces, and modify the routes to force the traffic to go across the network. Testing would be as simple as running an FTP connection between a client on one interface and a server on the other. This would be a great victory for Linux in our company, if I could get it working. The problem is that I cannot figure out how to bypass the Linux kernel's TCP/IP stack routing optimization. All the combinations of routing table modifications and iptables that I've tried still don't make the packets flow out the interfaces and on the wire instead of within the stack. Has anyone else tried something like this before? How did/would you approach this?"
Wouldn't the easy solution be to use two machines instead of one? Am I missing something?
/ZL
You want to send packets from one NIC and catch them on another? Why not use two machines?
I have been pwned because my
I know that I accidently 'tested' a cross-over cable once. I did not notice any problems with IP traffic. No kernel oops. But I agree with the two machine approach.
You are being MICROattacked, from various angles, in a SOFT manner.
It's really portable and flexible, and you can test all sorts of things easily.
Incidentally, for wireless neworks - there are tools for helping you check wireless signal strength. Grab a supported WLAN card, plug it in, and wander around the building checking if your wireless network's okay.
This could help answer my next question. If your switching hardware has van routing, or routing moduale say like a Cisco 6509 you could set up a NAT or PAT on the switch. This would allow you to have an outgoing address that was not on your ipstack that could be rerouted back to the box. Just a thought, I am very tired and could just be out of my mind here at 4am and 6 coffee's to the wind.
Blue Warrior, needs sleep badly....
Neck_of_the_Woods
#/usr/local/surf/glassy/overhead
FWIW -- all UNIXes I've worked with have reported results from all responding systems on a broadcast ping, unlike Windows which only shows the first to respond. So you'll want to filter through grep if there are other systems on the network, as you'll get responses from many systems you don't likely care about.
Says the RIAA: When you EQ, you're stealing bass!
Could you do this with two firewalls on the machine running inside user-mode linux?
Other than that, I would say get into the network code. You might be better with an older kernel (2.2.x) since the 2.4.x have the fancy zero-copy network stuff which is probably what is your problem.
How about a second box? Hardware capable of saturating a 10MB ethernet connection should be really cheap, and even saturating a 100MB connection isn't hard.
Get two interfaces on each, one interface to an internal 'management' network, the other interface to the equipment you're testing. That way you can operate both boxes out of a single computer, possibly using SSH (or X or Telnet or whatever).
You might also try some other tools besides ftp -- some of the cracker tools can be tuned to blast out an amazing amount of traffic, and even ping can saturate a link if you make the packets big enough and have enough processes sending them.
I dunno. Just a thought.
"But actually trying to use m4 as a general-purpose langage would be deeply perverse" --ESR
OpenBSD has a number of features to do the "transparent" routing which you desire - basically, you can plug in two interfaces and route from one to the other without changing the packets at all. The OpenBSD box basically looks just like a hub or a dumb switch to its peers, eg, it doesn't even have an IP address assigned to either interface, it doesn't decrement ttl, it doesn't do TCP optimizations, etc. As far as I know, this is not possible with Linux and it sounds like this is exactly what you want. See this page for more information.
I work in a lab at The University of New Hampshire called IOL (InterOperability Lab) that does a lot of device testing for vendors in conformance with ITU and ANSI standards. I don't work in the Ethernet group myself (I do DSL), but I know that they have lots of tests written up that may be a big help in analyzing traffic. I'm not sure what the other "expensive" services you mentioned cost, but IOL's may be very competitively priced, certainly worth a look.
Somewhere on this page I have hidden my signature.
You could do something along the lines of the Frame Diverter project but instead of just tcp port 80 for transparent caching proxy, you could divert everything so that you can test.
To summarize, you take a system with 2 nics and replace the destination mac address of all frames passing through with the Linux box's input interface. Bridge the 2 interfaces and run the tests of your choice.
When you want to take this out of if, God forbid, something breaks in hardware or software, if it, say, between to switches, you replace it with an Ethernet Crossover cable and your network is restored to operation.
The problem is that I cannot figure out how to bypass the Linux kernel's TCP/IP stack routing optimization. All the combinations of routing table modifications and iptables that I've tried still don't make the packets flow out the interfaces and on the wire instead of within the stack.
Nor could I. I spent the past year working on a thesis-like project for undergraduates building a new queueing mechanism using the Linux kernel. Using only one 300 Mhz processor and saturating two 100 BaseT interfaces would suck down about 1/3 of the CPU, and I found no way to bypass the stack. FreeBSD and OpenBSD can do it transparently if you want to give them a try.
Is your browser retarded?
Go to www.packetstorm.com
I've used them very, inexpensive easy to use, can create just about any IP test.
I'd look into what IBM did to get multiple instances of Linux running on a mainframe. It might be possible to modify their code to run on a standard PC. Then it should be possible to associate each interface with one of the instances.
"From my cold, dead hands you damn, dirty apes!" - CH
What if you sent out a broadcast out one interface? As long as the other interface is in the same VLAN, the switch should forward it.
This doesn't test backplane bandwidth, though. Just connectivity.
I am currently working on a patch to enable this to happen, but I dont see this getting ready soon enough for your needs. If you are constrained for time, you might want to look at the kernel, espcially the ip_output(), ip_route_output() and corresponding routines.
Does some other OS really implement this? Would be interesting to see what then do at the IP layer.
The statement below is true.
The statement above is false.
How about writing raw frames? If you make your own IP Packets they should skip
any internal routing thats going on. Its not that tricky and it will give you
a lot more control if you want to experiment with stuff like TTL and ToS.