Solusi 1:
Saya berhasil menggunakan yang berikut di Linux untuk menguji throughput pada kartu 10Gbps dual-port baru dalam mode "loopback", yaitu, satu port dicolokkan langsung ke port lainnya. Ini semua hanya sedikit voodoo hanya untuk memaksa paket keluar, tetapi jika Anda tidak melakukannya, Linux hanya akan memutus lalu lintas melalui kernel (karena itu pertanyaan OP). Dalam jawaban Casey di atas, saya tidak yakin apakah benar-benar perlu memiliki router eksternal atau tidak di atas, tetapi yang berikut ini sepenuhnya mandiri. Kedua antarmuka tersebut adalah eth2 dan eth3.
Berikan IP ke antarmuka, dan letakkan di jaringan terpisah:
ifconfig eth2 10.50.0.1/24
ifconfig eth3 10.50.1.1/24
Selanjutnya kita akan menyiapkan skenario NAT ganda:dua jaringan palsu baru digunakan untuk menjangkau yang lain. Di jalan keluar, sumber NAT ke jaringan palsu Anda. Dalam perjalanan, perbaiki tujuan. Dan sebaliknya untuk jaringan lain:
# nat source IP 10.50.0.1 -> 10.60.0.1 when going to 10.60.1.1
iptables -t nat -A POSTROUTING -s 10.50.0.1 -d 10.60.1.1 -j SNAT --to-source 10.60.0.1
# nat inbound 10.60.0.1 -> 10.50.0.1
iptables -t nat -A PREROUTING -d 10.60.0.1 -j DNAT --to-destination 10.50.0.1
# nat source IP 10.50.1.1 -> 10.60.1.1 when going to 10.60.0.1
iptables -t nat -A POSTROUTING -s 10.50.1.1 -d 10.60.0.1 -j SNAT --to-source 10.60.1.1
# nat inbound 10.60.1.1 -> 10.50.1.1
iptables -t nat -A PREROUTING -d 10.60.1.1 -j DNAT --to-destination 10.50.1.1
Sekarang beri tahu sistem cara masuk ke setiap jaringan palsu, dan pra-isi entri arp (pastikan untuk mengganti alamat MAC Anda, jangan gunakan milik saya):
ip route add 10.60.1.1 dev eth2
arp -i eth2 -s 10.60.1.1 00:1B:21:C1:F6:0F # eth3's mac address
ip route add 10.60.0.1 dev eth3
arp -i eth3 -s 10.60.0.1 00:1B:21:C1:F6:0E # eth2's mac address
Ini cukup membodohi Linux untuk benar-benar memasukkan paket ke kabel. Misalnya:
ping 10.60.1.1
keluar eth2, IP sumber 10.50.0.1 mendapat NAT ke 10.60.0.1, dan saat masuk ke eth3 tujuan 10.60.1.1 mendapat NAT ke 10.50.1.1. Dan jawabannya mengambil perjalanan serupa.
Sekarang gunakan iperf untuk menguji throughput. Ikat ke IP yang benar, dan pastikan IP mana yang Anda hubungi (alamat palsu pihak lain):
# server
./iperf -B 10.50.1.1 -s
# client: your destination is the other end's fake address
./iperf -B 10.50.0.1 -c 10.60.1.1 -t 60 -i 10
Pastikan lalu lintas benar-benar mengarah ke kabel:
tcpdump -nn -i eth2 -c 500
Anda juga dapat menonton /proc/interrupts hanya untuk memastikan bahwa kartu tersebut digunakan:
while true ; do egrep 'eth2|eth3' /proc/interrupts ; sleep 1 ; done
Bagaimanapun, saya menemukan postingan ini sedang mencari cara melakukan ini, terima kasih untuk orang-orang Q&A, dan semoga ini membantu orang lain menemukan postingan ini di masa mendatang.
Solusi 2:
Seperti biasa - saya sedikit terlambat - tetapi saat ini orang dapat menggunakan ruang nama jaringan untuk mengisolasi antarmuka dan mencegah penerusan lokal (dan mengutak-atik iptables :)).
Buat ruang nama (semua dilakukan dengan izin yang diperlukan, misalnya sebagai root):
ip netns add ns_server
ip netns add ns_client
Perhatikan bahwa status / konfigurasi antarmuka sekarang harus diakses dalam konteks ruang nama yang ditetapkan - sehingga tidak akan muncul jika Anda menjalankan tautan ip telanjang karena dijalankan dalam konteks namespace default. Menjalankan perintah dalam namespace dapat dilakukan menggunakan
ip netns exec <namespace-name> <command>
sebagai awalan.
Sekarang tetapkan ruang nama ke antarmuka, terapkan konfigurasi dan atur antarmuka:
ip link set eth1 netns ns_server
ip netns exec ns_server ip addr add dev eth1 192.168.1.1/24
ip netns exec ns_server ip link set dev eth1 up
ip link set eth2 netns ns_client
ip netns exec ns_client ip addr add dev eth2 192.168.1.2/24
ip netns exec ns_client ip link set dev eth2 up
Sekarang Anda dapat menjalankan aplikasi di dalam namespace - untuk menjalankan server iperf
ip netns exec ns_server iperf -s -B 192.168.1.1
dan klien:
ip netns exec ns_client iperf -c 192.168.1.1 -B 192.168.1.2
Lalu lintas sekarang akan dikirim melalui antarmuka fisik karena seluruh tumpukan jaringan, antarmuka, perutean ... diisolasi oleh ruang nama sehingga kernel tidak dapat mencocokkan alamat yang digunakan dalam lalu lintas dengan antarmuka lokal (tersedia).
Jika Anda selesai dengan eksperimen, cukup hapus ruang nama:
ip netns del <namespace-name>
Antarmuka akan dipindahkan ke namespace default dan semua konfigurasi yang dilakukan di dalam namespace menghilang (mis. tidak perlu menghapus alamat IP yang ditetapkan).
Solusi 3:
Saya memperluas jawaban caladona karena saya tidak dapat melihat paket respons. Untuk contoh ini:
- Di PC lokal saya, saya memiliki NIC di subnet yang berbeda, 192.168.1/24 , 192.168.2/24
- Ada router/PC eksternal yang memiliki akses ke kedua subnet.
- Saya ingin mengirim lalu lintas dua arah melalui NIC di PC lokal.
- Konfigurasi memerlukan dua alamat IP yang tidak terpakai untuk setiap subnet.
Rute iptable PC lokal disetel ke lalu lintas keluar SNAT dan DNAT ke IP 'palsu'.
iptables -t nat -A POSTROUTING -d 192.168.1.100 -s 192.168.2.0/24 -j SNAT --to-source 192.168.2.100
iptables -t nat -A PREROUTING -d 192.168.1.100 -i eth0 -j DNAT --to-destination 192.168.1.1
iptables -t nat -A POSTROUTING -d 192.168.2.100 -s 192.168.1.0/24 -j SNAT --to-source 192.168.1.100
iptables -t nat -A PREROUTING -d 192.168.2.100 -i eth1 -j DNAT --to-destination 192.168.2.1
Aturan melakukan hal berikut:
- Tulis ulang sumber 192.168.2.1 menjadi 192.168.2.100 pada paket keluar
- Tulis ulang tujuan 192.168.1.100 ke 192.168.1.1 pada paket masuk
- Tulis ulang sumber 192.168.1.1 menjadi 192.168.1.100 pada paket keluar
- Tulis ulang tujuan 192.168.2.100 ke 192.168.2.1 pada paket masuk
Singkatnya, sistem lokal sekarang dapat berbicara dengan mesin 'virtual' dengan alamat 192.168.1.100 dan 192.168.2.100.
Selanjutnya Anda harus memaksa PC lokal Anda untuk menggunakan router eksternal untuk mencapai IP palsu Anda. Anda melakukan ini dengan membuat rute langsung ke IP melalui melalui router. Anda ingin memastikan bahwa Anda memaksa paket ke kebalikan dari subnet tujuan.
ip route 192.168.1.100 via $ROUTER_2_SUBNET_IP
ip route 192.168.2.100 via $ROUTER_1_SUBNET_IP
Akhirnya untuk membuat semua ini berfungsi, router eksternal perlu mengetahui cara menjangkau IP palsu di PC lokal Anda. Anda dapat melakukannya dengan mengaktifkan ARP proxy untuk sistem Anda.
echo 1 | sudo tee /proc/sys/net/ipv4/conf/all/proxy_arp
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
Dengan pengaturan ini, Anda sekarang dapat memperlakukan IP palsu sebagai sistem nyata di PC lokal Anda. Mengirim data ke subnet .1 akan memaksa paket keluar dari antarmuka .2. Mengirim data ke subnet .2 akan memaksa paket keluar dari antarmuka .1.
ping 192.168.1.100
ping 192.168.2.100
Solusi 4:
Oke, akhirnya saya berhasil menyiapkan konfigurasi saya.
Idenya adalah menggunakan alamat palsu lain, untuk memaksa rute alamat palsu ini ke antarmuka 2 , lalu menerjemahkan alamat palsu dengan alamat asli 2 dengan NAT/iptables.
Pengaturan saya sebenarnya terbuat dari satu router yang dapat saya telnet antara IF1 (antarmuka 1) dan IF2
Dalam penyiapan saya, FAKE_ADDR dan IF1_ADDR berada di subnet yang sama.
ifconfig $IF1 $IF1_ADDR netmask 255.255.255.0
ifconfig $IF2 $IF2_ADDR netmask 255.255.255.0
iptables -t nat -A PREROUTING -d $FAKE_ADDR -i $IF2 -j DNAT --to-destination $IF2_ADDR
iptables -t nat -A POSTROUTING -s $IF2_ADDR -d $IF1_ADDR/24 -j SNAT --to-source $FAKE_ADDR
route add $FAKE_ADDR gw $ROUTER_ADDR
Dan di router:
route add $FAKE_ADDR gw $IF2_ADDR
Jika saya mengirim sesuatu ke FAKE_ADDR, pkt diteruskan melalui IF1 ke router, diteruskan lagi ke IF2, lalu FAKE_IP diganti dengan IF2_ADDR. Paket diproses oleh server, hasilnya dikirim kembali ke IF1_ADDR, dari IF2_ADDR diganti dengan FAKE_ADDR.
Mungkin dimungkinkan untuk menggunakan konfigurasi yang lebih sederhana hanya dengan satu kabel crossover, tetapi karena saya tidak mencobanya, saya lebih memilih untuk memberikan solusi kerja saya.