Yerel IP trafiğini harici bir arayüze zorla


30

İstediğim gibi yapılandırabileceğim birkaç arayüze sahip bir makinem var, örneğin:

  • eth1: 192.168.1.1
  • eth2: 192.168.2.2

Bu yerel adreslerden birine gönderilen tüm trafiği diğer arayüz üzerinden iletmek istiyorum. Örneğin, 192.168.1.1'deki bir iperf, ftp, http sunucusuna yapılan tüm istekler yalnızca dahili olarak yönlendirilmemeli, aynı zamanda eth2 aracılığıyla iletilmelidir (ve harici ağ paketi tekrar eth1'e yönlendirmekle ilgilenir).

Iptables, ip route, vb. Gibi birkaç komuta denedim ve baktım ama hiçbir şey işe yaramadı.

Alabileceğim en yakın davranış şuydu:

ip route change to 192.168.1.1/24 dev eth2

192.168.1.x’i, yine de dahili olarak yönlendirilen 192.168.1.1 dışında, eth2’ye gönderir. Daha sonra, dahili olarak 192.168.1.1’e yönlendirilen, 192.168.1.2’ye sahte olan tüm trafiğin NAT’ını yönlendirebilir miyim? Aslında iptables ile mücadele ediyorum, ama benim için çok zor.

Bu kurulumun amacı iki bilgisayar kullanmadan arayüz sürücü testi yapmaktır.

Linux kullanıyorum, ancak bunu Windows ile nasıl yapacağınızı biliyorsanız, satın alırım!

Düzenle:

Dış ağ, eth1 ve eth2 arasındaki sadece bir geçit kablo. Diyelim ki makinemde bir http sunucum var. Şimdi bu sunucuya aynı makineden erişmek istiyorum, ancak TCP / IP trafiğini bu eth1 / eth2 kablosundan geçmesi için zorlamak istiyorum. Bunun için arayüzlerimi nasıl yapılandırmalıyım?


Tüm trafiğin arabirim 1 ve 2 üzerinden yansıtılmasını mı istediğinizi ancak yalnızca başka bir yönlendiriciden arabirim 2'ye dönmesini istediğinizi mi söylüyorsunuz? Bu ağda oldukça garip şeyler yapamaz mıydı? Yansıtılmış trafiği, arabirim 2'den trafiği düşüren başka bir sisteme yönlendirmek ve ardından izleyebilmek veya trafiği yakalamak için sanallaştırma yazılımı kullanmak daha iyi olur mu? Belki açıklamada bir şeyleri özlüyorumdur.
Bart Silverstrim

Örneğin, eth1'in IP'si olan 192.168.1.1'e bir paket oluşturmak istiyor gibi geliyor. Ancak bu paketi tamamen dahili olarak alan Linux yığını yerine, paketin eth2'yi (dışarıdan eth1'e ve ardından Linux yığınına geri teslim edilecek) zorla verilmesini istiyor. Bunun mümkün olup olmadığından emin değilim; Ağ katmanı adresin dahili bir arayüz olduğunu tespit ettiğinde, yönlendirme tablolarına bakmak için çok az nedeni olacaktır. Başka biri daha iyi biliyor olabilir.
PP.

Yanıtlar:


14

Yanıt paketlerini göremediğim için caladona'nın cevabını genişlettim. Bu örnek için:

  1. Yerel bilgisayarımda, farklı alt ağlarda NIC var, 192.168.1 / 24 , 192.168.2 / 24
  2. Her iki alt ağa da erişebilen harici bir yönlendirici / PC vardır.
  3. Yerel bilgisayardaki NIC'ler üzerinden iki yönlü trafik göndermek istiyorum.
  4. Yapılandırma, her alt ağ için iki kullanılmamış IP adresi gerektirir.

Yerel PC iptable rotaları 'sahte' IP'ye giden SNAT ve DNAT giden trafiğini ayarlar.

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

Kurallar aşağıdakileri yapar:

  1. Giden paketlerde 192.168.2.1 kaynağını 192.168.2.100 olarak yeniden yazın
  2. 192.168.1.100 hedefini, gelen paketlerde 192.168.1.1 olarak yeniden yaz
  3. Giden paketlerde 192.168.1.1 kaynağını 192.168.1.100 olarak yeniden yazın
  4. 192.168.2.100 hedefini gelen paketlerde 192.168.2.1 olarak yeniden yaz

Özetlemek gerekirse, yerel sistem artık 192.168.1.100 ve 192.168.2.100 adreslerine sahip 'sanal' bir makineyle konuşabiliyor.

Daha sonra, yerel bilgisayarınızı, sahte IP'nize ulaşmak için harici yönlendiriciyi kullanmaya zorlamanız gerekir. Bunu, yönlendiriciden IP'ye doğrudan bir rota oluşturarak yaparsınız. Paketleri hedef alt ağın karşısına zorladığınızdan emin olmak istiyorsunuz.

ip route 192.168.1.100 via $ROUTER_2_SUBNET_IP 
ip route 192.168.2.100 via $ROUTER_1_SUBNET_IP

Son olarak, tüm bunların çalışması için, harici yönlendiricinin yerel bilgisayarınızdaki sahte IP'lere nasıl ulaşacağını bilmesi gerekir. Sisteminiz için proxy ARP'leri açarak inceltebilirsiniz.

echo 1 | sudo tee /proc/sys/net/ipv4/conf/all/proxy_arp
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

Bu kurulumla, artık sahte IP'leri yerel bilgisayarınızda gerçek bir sistem olarak değerlendirebilirsiniz. Verileri .1 alt ağa göndermek, paketleri .2 arayüzünü zorlar. .2 alt ağına veri göndermek, paketleri .1 arayüzünü zorlar.

ping 192.168.1.100
ping 192.168.2.100

Yolunuz çok daha iyi! Ayrıca ARP'nin çalışmasını sağlamak için bir ip_forward'a ihtiyacım olduğunu unutmayın: echo 1> / proc / sys / net / ipv4 / ip_forward
calandoa

28

Linux'ta "loopback" modunda yeni bir çift bağlantı noktalı 10Gbps kartta iş akışını test etmek için başarıyla kullandım, yani bir bağlantı doğrudan diğerine takılı. Bunların hepsi paketleri kabloyu zorlamak için sadece bir parça vudu. Ancak bunu yapmazsanız, Linux çekirdeğin içindeki trafiği kısa devre yapacak (dolayısıyla OP'nin sorusu). Casey'nin yukarıdaki cevabında, harici bir yönlendiriciye sahip olmanın gerçekten gerekli olup olmadığından emin değilim, ancak aşağıdaki tamamen kendi kendine yetiyor. İki arabirim eth2 ve eth3'tür.

IP'leri arayüzlere verin ve ayrı ağlara koyun:

ifconfig eth2 10.50.0.1/24
ifconfig eth3 10.50.1.1/24

Daha sonra çift NAT senaryosu hazırlayacağız: diğerine ulaşmak için kullanılan iki yeni sahte ağ. Dışarı çıkarken, NAT'ı sahte ağınıza yönlendirin. İçeri girerken hedefi düzeltin. Ve diğer ağ için tam tersi:

# 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

Şimdi sisteme her sahte ağa nasıl gideceğinizi söyleyin ve arp girişlerini hazırlayın (MAC adreslerinizi değiştirdiğinizden emin olun, benimkini kullanma):

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

Bu, Linux'u aslında telleri üzerine paketler koymak için yeterince kandırıyor. Örneğin:

ping 10.60.1.1

eth2 dışarı çıkar, IP 10.50.0.1 kaynağı 10.60.0.1'e NAT alır ve eth3'e gelince 10.60.1.1 hedefi 10.50.1.1'e NAT alır. Cevap da benzer bir yolculuk yapıyor.

Şimdi verimi test etmek için iperf kullanın. Doğru IP'lere bağlanın ve hangi IP ile iletişim kurduğunuzdan emin olun (diğer ucun sahte adresi):

# 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

Trafiğin gerçekten kabloya gittiğinden emin olun:

tcpdump -nn -i eth2 -c 500

Ayrıca, kartın kullanıldığından kesinlikle emin olmak için sadece / proc / interrupts komutunu izleyebilirsiniz:

while true ; do egrep 'eth2|eth3' /proc/interrupts ; sleep 1 ; done

Her neyse, bu yazıyı nasıl yapacağımı ararken buldum, soru cevaplarınız için teşekkürler ve bunun gelecekte bu yazıyı bulmasına yardımcı olacaklarını umuyorum.


+1 Mükemmel çözüm - ip iletmeyi aktif hale getirme bile gerektirmiyor! Bu tam şu anda ihtiyacım olan şeydi (geri döngü üzerinden 10 GB test için).
Nils

16

Her zamanki gibi - biraz geç kaldım - ama bugünlerde biri arayüzleri izole etmek ve herhangi bir yerel iletmeyi önlemek (ve iptables ile uğraşmak :)) için ağ ad alanlarını kullanabilir.

İsim alanları oluşturun (hepsi root gibi gerekli izinlerle yapılır):

ip netns add ns_server
ip netns add ns_client

Arabirim durumuna / config'e şimdi atanan ad alanı bağlamında erişilmesi gerektiğine dikkat edin - bu nedenle , varsayılan ad alanı bağlamında çalıştırıldığı için çıplak bir ip bağlantısı çalıştırırsanız görünmezler . Bir isim alanı içinde bir komut çalıştırmak kullanılarak yapılabilir.

ip netns exec <namespace-name> <command>

önek olarak.

Şimdi arayüzlere ad alanları atayın, config uygulayın ve arayüzleri ayarlayın:

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

Artık uygulamaları ad alanı içinde çalıştırabilirsiniz - iperf sunucusu çalışması için

ip netns exec ns_server iperf -s -B 192.168.1.1

ve müşteri:

ip netns exec ns_client iperf -c 192.168.1.1 -B 192.168.1.2

Artık tüm ağ bağlantısı, arayüz, yönlendirme ... ad alanları tarafından yalıtıldığı için trafik artık fiziksel arayüzler üzerinden gönderilecektir, böylece çekirdek trafikte kullanılan adresleri yerel (mevcut) arayüzlerle eşleştiremez.

Denemelerinizi tamamladıysanız, sadece ad alanlarını silin:

ip netns del <namespace-name>

Arabirimler varsayılan ad alanına atanır ve ad alanı içinde yapılan tüm yapılandırmalar kaybolur (örneğin atanan IP adreslerini silmeye gerek yoktur).


Bu, önerilen çift taraflı büyüden çok daha basittir ve ağdaki diğer bilgisayarlardan herhangi bir koordinasyon gerektirmez ve herhangi bir fiziksel topoloji üstlenmez. Benim tek isteğim rota eklemek için komut eklemek.
Huckle

2

Tamam, nihayet config ayarımı kurmayı başardım.

Fikir, başka bir sahte adres kullanmak, bu sahte adresin yolunu ara yüz 2'ye zorlamak, sonra sahte adresi gerçek adres 2 ile NAT / iptables ile çevirmektir.

Kurulumum aslında IF1 (arayüz 1) ve IF2 arasında telnet kurabildiğim bir yönlendiriciden oluşuyor

Ayarlarımda, FAKE_ADDR ve IF1_ADDR aynı alt ağda.

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

Ve yönlendiricide:

route add $FAKE_ADDR gw $IF2_ADDR

FAKE_ADDR'ye bir şey gönderirsem, pkt, IF1 üzerinden yönlendiriciye iletilir, yeniden IF2'ye iletilir, ardından FAKE_IP, IF2_ADDR ile değiştirilir. Paket sunucu tarafından işlenir, sonuç FAKE_ADDR ile değiştirilen IF2_ADDR'den IF1_ADDR'ye geri gönderilir.

Tek bir çapraz kabloyla daha basit bir konfigürasyon kullanmak mümkün olabilir, ancak denemediğim gibi çalışma çözümümü vermeyi tercih ediyorum.


Eğer yönlendirici $ FAKE_ADDR'yi $ IF2_ADDR'ye gönderiyorsa, DNAT kuralınızın "-i $ IF1" yerine "-i $ IF2" olması gerekmez mi?
cmcginty

Haklısın Casey, düzeltme yapıldı.
calandoa

1

Thomas Tannhäuser tarafından yukarıda verilen cevap çok açıktı!

Benzer bir durum vardı: iki enet arayüzlü tek bir makine. Planım bir arayüzü sunucu (alıcı), diğeri istemci (gönderici) olarak kullanmaktı. Her arayüz yönlendiriciye bağlanır ve iperf, iş hacmini, PPS'yi, gecikmeyi vb. Ölçmek için trafiği yönlendiriciden geçirir.

Maalesef, iptables yaklaşımı sezgisel değildi ve sorunlarla doluydu. Birkaç sinir bozucu saat sonra, bu saldırı planını bıraktım. Thomas'ın önerisinden esinlenerek, Linux IP Ad Alanları üzerinde küçük bir ödev yaptım ve bu çözümün sadeliği ve şıklığını takdir etmeye başladım.

Aşağıda, Fedora FC26'mı bu kapasitede hizmet verecek şekilde yapılandırırken kullandığım komutların tam bir listesi bulunmaktadır. İki arayüz enp1s0 ve enp3s0. Yönelticinin 192.168.2.112 ve 172.16.16.2 adresleri ile iki arayüzü vardır. Her FC26 ENET konektörü doğrudan ilgili yönlendirici arayüzüne kablolanır.

# How to configure the IP Namespaces
ip netns add iperf-server
ip netns add iperf-client
ip link set enp1s0 netns iperf-server
ip link set enp3s0 netns iperf-client
ip netns exec iperf-server ip addr add dev enp1s0 192.168.2.139/20
ip netns exec iperf-client ip addr add dev enp3s0 172.16.16.2/24
ip netns exec iperf-client ip link set dev enp3s0 up
ip netns exec iperf-server ip link set dev enp1s0 up
ip netns exec iperf-server route add default gw 192.168.2.112
ip netns exec iperf-client route add default gw 172.16.16.1

# Test the interfaces and network using ping
ip netns exec iperf-client ping -c1 172.16.16.1
ip netns exec iperf-server ping -c1 192.168.2.112
ip netns exec iperf-server ping -c1 172.16.16.2
ip netns exec iperf-client ping -c1 192.168.2.139

# Start Iperf Server for UDP test
ip netns exec iperf-server iperf -u -s
# Run Client against Iperf server for UDP test
ip netns exec iperf-client iperf -u -c 192.168.2.139

0

Linux kutunuzu bir yönlendirici / köprü / ağ geçidi / güvenlik duvarı tipi kutusuna dönüştürmek istediğiniz gibi geliyor. Aşağıdaki kaynaklar aradığınız şey olabilir:

Linux Router Projesi

Yönlendirici veya güvenlik duvarı dağıtımlarının listesi

Linux LiveCD Router

Linux Journal - Linux Yönlendirici

Daha fazla bilgiye dayalı güncelleme:

Ne istersen yapabileceğini sanmıyorum. İşletim sistemi her zaman kendi iç yönlendirme tablosuna bakacak ve yerel olarak her iki IP adresini de “görecek”. Daha sonra işletim sistemi içindeki trafiği yönlendirecek ve asla kabloya koyamayacaktır. İkinci bir makineye veya iki sanal makineye ihtiyacınız olacak ( Xen'i inceleyin ).


0

Burada geçirilecek çok şey var, bu yüzden kesinliğimi tam olarak garanti edemiyorum, ancak asıl soru "kendine gönder" tekniği olarak bilinen şeyi arıyor gibi görünüyor . Bağlantılı arama, en iyi link kernel yaması olduğunu düşündüğüm şeyi, en iyi link + tartışmaları ve çeşitli posta listelerinde diğer yaklaşımlarla gösteren yamalar gibi gösterir. LKML.

Birinin iproute2'nin "ip ağları" ile yapılan ağ ad alanlarına da bakması gerektiğini düşünüyorum . Bu aynı zamanda bazı ekstra arayüz ve yönlendirme sihirbazı gerektirir, bu yüzden diğer cevaplardaki dev iptables çemberinden bile daha az karmaşık olmayabilir.

Herhangi biri bunlarla ilgili faydalı bir şey bulduysa, yorumlarınız kesinlikle kabul edilir - nasıl, ne, nerede uygulamanız hakkında.



-1

IPV6 için nasıl çalıştıracağım

atanmış statik ips

/sbin/ifconfig eth1 inet6 add 2001:db8::1/127 
/sbin/ifconfig eth3 inet6 add 2001:db8::2/127 

"FAKE" adreslerine sadece ana bilgisayar rotaları ayarla

ip -6 route add 2001:db8::2/128 dev eth1 metric 1
ip -6 route add 2001:db8::1/128 dev eth3 metric 1

Komşu masasını doldurdu ... arp gibi

ip -6 neighbor add 2001:db8::1 lladdr 90:e2:ba:0d:75:e8 dev eth3 # eth1's mac address
ip -6 neighbor add 2001:db8::2 lladdr 90:e2:ba:0d:75:e9 dev eth1 # eth3's mac address

ip6tables girişlerini ekledi

ip6tables -t nat -A POSTROUTING -s 2001:db8::1 -d 2013::2 -j SNAT --to-source 2001:db8::1
ip6tables -t nat -A PREROUTING -d 2001:db8::1 -j DNAT --to-destination 2001:db8::1
ip6tables -t nat -A POSTROUTING -s 2001:db8::2 -d 2013::1 -j SNAT --to-source 2001:db8::2
ip6tables -t nat -A PREROUTING -d 2001:db8::2 -j DNAT --to-destination 2001:db8::2

Hangi dağıtımı kullanıyorsunuz? Son kontrol ettiğimde çekirdeğin IPv6 için bir NAT tablosu yok.
fukawi2
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.