Řešení 1:
Následující jsem úspěšně použil na Linuxu k testování propustnosti na nové dvouportové 10Gbps kartě v režimu „loopback“, tedy jeden port zapojený přímo do druhého. Je to všechno jen trochu voodoo, aby se pakety dostaly ven, ale pokud to neuděláte, Linux pouze zkratuje provoz v jádře (proto otázka OP). V odpovědi Casey výše si nejsem jistý, zda bylo opravdu nutné mít externí router nebo ne výše, ale následující je zcela soběstačné. Dvě rozhraní jsou eth2 a eth3.
Dejte IP rozhraním a umístěte je do samostatných sítí:
ifconfig eth2 10.50.0.1/24
ifconfig eth3 10.50.1.1/24
Dále nastavíme scénář dvojitého NAT:dvě nové falešné sítě používané k dosažení druhé. Na cestě ven použijte NAT do své falešné sítě. Na cestě dovnitř upravte cíl. A naopak pro druhou síť:
# 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
Nyní řekněte systému, jak se dostat do každé falešné sítě, a předvyplňte položky arp (nezapomeňte nahradit své MAC adresy, nepoužívejte moji):
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
To oklame Linux natolik, že skutečně umístí pakety na drát. Například:
ping 10.60.1.1
zhasne eth2, zdrojová IP 10.50.0.1 se NAT převede na 10.60.0.1, a když přijde do eth3, cíl 10.60.1.1 se přeloží na 10.50.1.1. A odpověď trvá podobnou cestu.
Nyní použijte iperf k testování propustnosti. Navažte na správné IP adresy a ujistěte se, kterou IP adresu kontaktujete (falešná adresa druhého konce):
# 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
Ujistěte se, že provoz skutečně směřuje k drátu:
tcpdump -nn -i eth2 -c 500
Můžete také sledovat /proc/interrupts, abyste si byli naprosto jisti, že se karta používá:
while true ; do egrep 'eth2|eth3' /proc/interrupts ; sleep 1 ; done
Každopádně jsem našel tento příspěvek při hledání toho, jak to udělat, díky za otázky a odpovědi a doufám, že to pomůže někomu dalšímu najít tento příspěvek v budoucnu.
Řešení 2:
Jako vždy - trochu jsem se opozdil - ale v dnešní době by se dalo použít síťové jmenné prostory k izolaci rozhraní a zabránění jakémukoli místnímu přeposílání (a pohrávání si s iptables :)).
Vytvořte jmenné prostory (vše s požadovanými oprávněními, např. jako root):
ip netns add ns_server
ip netns add ns_client
Všimněte si, že stav / konfigurace rozhraní musí být nyní přístupné v kontextu přiřazeného jmenného prostoru - takže se nezobrazí, pokud spustíte odkaz na IP protože se to spouští v kontextu výchozího jmenného prostoru. Spuštění příkazu v rámci jmenného prostoru lze provést pomocí
ip netns exec <namespace-name> <command>
jako prefix.
Nyní přiřaďte jmenné prostory k rozhraním, použijte konfiguraci a nastavte rozhraní:
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
Nyní můžete spouštět aplikace v rámci jmenného prostoru - pro běh serveru iperf
ip netns exec ns_server iperf -s -B 192.168.1.1
a klient:
ip netns exec ns_client iperf -c 192.168.1.1 -B 192.168.1.2
Provoz bude nyní odesílán přes fyzická rozhraní, protože celý networkstack, rozhraní, směrování... je izolován jmennými prostory, takže jádro není schopno porovnat adresy používané v rámci provozu s místními (dostupnými) rozhraními.
Pokud jste se svými experimenty skončili, jednoduše odstraňte jmenné prostory:
ip netns del <namespace-name>
Rozhraní budou znovu přiřazena k výchozímu jmennému prostoru a veškerá konfigurace provedená v rámci jmenného prostoru zmizí (např. není třeba mazat přiřazené IP adresy).
Řešení 3:
Rozvinul jsem odpověď Caladony, protože jsem neviděl pakety odpovědí. Pro tento příklad:
- Na svém místním počítači mám síťové karty v různých podsítích, 192.168.1/24 , 192.168.2/24
- Externí router/PC má přístup k oběma podsítím.
- Chci odesílat obousměrný provoz přes síťové karty na místním počítači.
- Konfigurace vyžaduje dvě nepoužívané IP adresy pro každou podsíť.
Trasy místního PC iptable jsou nastaveny na odchozí provoz SNAT a DNAT na „falešnou“ IP.
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
Pravidla fungují následovně:
- Přepište zdroj 192.168.2.1 na 192.168.2.100 u odchozích paketů
- Přepište cíl 192.168.1.100 na 192.168.1.1 u příchozích paketů
- Přepište zdroj 192.168.1.1 na 192.168.1.100 u odchozích paketů
- Přepište cíl 192.168.2.100 na 192.168.2.1 u příchozích paketů
Abychom to shrnuli, místní systém nyní může mluvit s „virtuálním“ počítačem s adresami 192.168.1.100 a 192.168.2.100.
Dále musíte donutit místní počítač, aby použil externí router k dosažení vaší falešné IP. Toho dosáhnete vytvořením přímé cesty k IP přes router. Chcete se ujistit, že vynutíte pakety na opačné straně cílové podsítě.
ip route 192.168.1.100 via $ROUTER_2_SUBNET_IP
ip route 192.168.2.100 via $ROUTER_1_SUBNET_IP
Aby to všechno fungovalo, musí externí router vědět, jak dosáhnout falešných IP adres na vašem místním počítači. Zapnutím proxy ARP pro váš systém můžete udělat věci.
echo 1 | sudo tee /proc/sys/net/ipv4/conf/all/proxy_arp
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
S tímto nastavením nyní můžete zacházet s falešnými IP jako se skutečným systémem na vašem místním počítači. Odeslání dat do podsítě .1 vytlačí pakety z rozhraní .2. Odeslání dat do podsítě .2 vytlačí pakety z rozhraní .1.
ping 192.168.1.100
ping 192.168.2.100
Řešení 4:
Ok, konečně se mi podařilo nastavit konfiguraci.
Cílem je použít jinou falešnou adresu, vynutit směrování této falešné adresy k rozhraní 2 a poté přeložit falešnou adresu skutečnou adresou 2 pomocí NAT/iptables.
Moje nastavení se ve skutečnosti skládá z jednoho routeru, který mohu telnetovat mezi IF1 (rozhraní 1) a IF2
V mém nastavení jsou FAKE_ADDR a IF1_ADDR ve stejné podsíti.
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
A na routeru:
route add $FAKE_ADDR gw $IF2_ADDR
Pokud něco pošlu na FAKE_ADDR, pkt se přesměruje přes IF1 do routeru, znovu se přepošle na IF2, pak se FAKE_IP nahradí IF2_ADDR. Paket je zpracován serverem, výsledek je odeslán zpět na IF1_ADDR, z IF2_ADDR, který je nahrazen FAKE_ADDR.
Možná je možné použít jednodušší konfiguraci pouze s jedním kříženým kabelem, ale protože jsem to nezkoušel, dávám přednost svému funkčnímu řešení.