最近碰到這樣乙個問題,一台linux機器上裝有兩個網絡卡,分別為eth0和eth1,將這兩個網絡卡用網線直接連線起來,要進行回環測試,也就是從eth1發資料從eth0收到,從eth0發資料從eth1收到。
本來,通過原始套接字,直接繫結到指定的網絡卡上進行接收和傳送資料,是很容易完成任務。但要求是要用基於ip的協議,tcp或udp完成測試。linux的核心對從乙個網路位址發往另乙個網路位址的資料報,如果這兩個網路位址同屬乙個host,則這個資料報會直接在內部**,根本不會放到網路裝置上。後來經過一番實驗,弄出了下面的指令碼:
#!/bin/bash
eth0_mac=00:11:22:33:44:55
eth1_mac=00:11:22:33:44:66
ifconfig eth0 hw ether $eth0_mac
ifconfig eth1 hw ether $eth1_mac
ifconfig eth0 192.168.1.1 netmask 255.255.255.0
ifconfig eth1 192.168.1.2 netmask 255.255.255.0
#ip route flush table all
route add 192.168.1.11 dev eth0
route add 192.168.1.22 dev eth1
arp -i eth0 -s 192.168.1.11 $eth1_mac
arp -i eth1 -s 192.168.1.22 $eth0_mac
iptables -t nat -f
iptables -t nat -a postrouting -s 192.168.1.1 -d 192.168.1.11 -j snat --to-source 192.168.1.22
iptables -t nat -a prerouting -s 192.168.1.22 -d 192.168.1.11 -j dnat --to-destination 192.168.1.2
iptables -t nat -a postrouting -s 192.168.1.2 -d 192.168.1.22 -j snat --to-source 192.168.1.11
iptables -t nat -a prerouting -s 192.168.1.11 -d 192.168.1.22 -j dnat --to-destination 192.168.1.1
為了簡單起見,指令碼弄了兩個臨時的mac位址,分別設定在eth0和eth1上,然後分別為其設定ip位址為192.168.1.1和192.168.1.2。
然後是路由表的設定,設定了兩個到目的位址的路由,目的位址分別是192.168.1.11和192.168.1.22。這兩個位址其實是沒有主機與其對應的。
然後設定了兩條靜態arp表項,這樣發往這兩個ip位址的資料報就不會再有arp請求。注意192.168.1.11會解析到eth1的mac位址, 192.168.1.22會解析到eth0的mac位址。
最後是設定iptable snat和dnat,這是關鍵所在:
將從192.168.1.1出去的包的源位址改為192.168.1.22
將收到的目的位址為192.168.1.22的包的目的位址改為192.168.1.2
將從192.168.1.2出去的包的源位址改為192.168.1.11
將收到的目的位址為192.168.1.11的包的目的位址改為192.168.1.1
在執行了上面的指令碼後,可以繫結在192.168.1.1上向192.168.1.11發資料,該資料報就會經過網線被eth1收到, 反之亦然,可以繫結在192.168.1.2上向192.168.1.22發資料,如:
ping -i 192.168.1.1 192.168.1.11
ping -i 192.168.1.2 192.168.1.22
如果用udp或tcp測試,則要用bind()將套接字繫結在對應的位址上。
在192.168.1.1看來,另乙個網絡卡的位址是192.168.1.11, 而在192.168.1.2看來,另乙個網絡卡的位址是192.168.1.22。用iptables在中間做了轉換。
雙網絡卡的回環測試
最近碰到這樣乙個問題,一台linux機器上裝有兩個網絡卡,分別為eth0和eth1,將這兩個網絡卡用網線直接連線起來,要進行回環測試,也就是從eth1發資料從eth0收到,從eth0發資料從eth1收到。本來,通過原始套接字,直接繫結到指定的網絡卡上進行接收和傳送資料,是很容易完成任務。但要求是要用...
雙網絡卡的回環測試
最近碰到這樣乙個問題,一台linux機器上裝有兩個網絡卡,分別為eth0和eth1,將這兩個網絡卡用網線直接連線起來,要進行回環測試,也就是從eth1發資料從eth0收到,從eth0發資料從eth1收到。本來,通過原始套接字,直接繫結到指定的網絡卡上進行接收和傳送資料,是很容易完成任務。但要求是要用...
雙網絡卡的意外
給公司的內部測試伺服器再裝上乙個8139網絡卡。伺服器斷網了。ping 外網不同,ping 內網也不同。鬱悶了,奇怪了。以前沒遇到過這樣的問題呀。先看一下伺服器路由表 route n root beihai365 route n kernel ip routing table destination...