GNU/Linux >> Znalost Linux >  >> Linux

Vynutit místní provoz IP na externí rozhraní

Ř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:

  1. 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
  2. Externí router/PC má přístup k oběma podsítím.
  3. Chci odesílat obousměrný provoz přes síťové karty na místním počítači.
  4. 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ě:

  1. Přepište zdroj 192.168.2.1 na 192.168.2.100 u odchozích paketů
  2. Přepište cíl 192.168.1.100 na 192.168.1.1 u příchozích paketů
  3. Přepište zdroj 192.168.1.1 na 192.168.1.100 u odchozích paketů
  4. 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í.


Linux
  1. Externí proměnná v Awk?

  2. Rozhraní Sftp k Scp?

  3. Získat adresy místního síťového rozhraní pouze pomocí proc?

  1. chmod čerstvě připojený externí disk pro nastavení přístupu pro zápis

  2. Nainstalujte gem do místní složky

  3. Vynutit vypnutí externího pevného disku na linuxu (raspberry pi)

  1. Spadl IP provoz se serverem s více adresami

  2. Jak vyřadit provoz z USB?

  3. Jak donutím Linux, aby znovu získal novou IP adresu ze serveru DHCP?