Soru Yerel IP trafiğini harici bir arabirime zorlar


İstediğim gibi yapılandırabileceğim çeşitli arayüzlere 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 talepler yalnızca dahili olarak yönlendirilmemeli, et2 üzerinden yönlendirilmemelidir (ve dış ağ paketi yeniden eth1'e yönlendirmekle ilgilenecektir).

Iptables, ip rotası gibi çeşitli komutları denedim ve inceledim ... ama hiçbir şey işe yaramadı.

Alabildiğim en yakın davranış ile yapıldı:

ip route change to 192.168.1.1/24 dev eth2

192.168.1.x dosyasını eth2 üzerine gönderir, 192.168.1.1 dışında, hala dahili olarak yönlendirilir. Daha sonra, 192.168.1.1'de sahte olan 192.168.1.1'e yönlendirilen tüm trafiğin NAT iletimini yapabilir miyim? Aslında iptables ile uğraşıyorum ama benim için çok zor.

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

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

Düzenle:

Harici ağ sadece eth1 ve eth2 arasındaki bir çapraz kablodur. Makinemde bir http sunucum olduğunu varsayalım. Şimdi bu sunucuya aynı makineden erişmek istiyorum, ancak TCP / IP trafiğini bu eth1 / eth2 kablosundan geçmek için zorlamak istiyorum. Arayüzlerimi bunun için nasıl yapılandırmalıyım?


29
2018-03-30 12:09


Menşei


Tüm trafiğin 1. ve 2. arabirim üzerinden yansıtılmasını istediğinizi mi söylüyorsunuz, ancak sadece başka bir yönlendiriciden 2. arabirime dönün mü? Bu ağda bazı garip şeyler yapamaz mı? Arabirim 2'den yansıtılan trafiği yalnızca trafiği düşüren başka bir sisteme yönlendirmek daha iyi olur mu, yoksa onu izleyebilir veya trafiği yakalamak için sanallaştırma yazılımını kullanabilir misiniz? Belki açıklamasında bir şey eksik. - Bart Silverstrim
Bir paket üretmek istiyormuş gibi geliyor, söz gelimi, et.1'in IP'si olan 192.168.1.1. Ancak bu paketi tamamen dahili olarak alan Linux yığını yerine, paketin eth2'yi (dışarıdan et1'e ve sonra Linux yığınına geri gönderilecek) zorlamasını istiyor. Bunun mümkün olup olmadığından emin değilim; Ağ katmanı adresin bir iç arabirim olduğunu algıladığında, yönlendirme tablolarına bakmak için çok az sebebi olacaktır. Başka biri daha iyi biliyor olabilir. - PP.


Cevaplar:


Yanıt paketlerini göremediğimden 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şimi olan harici bir yönlendirici / PC var.
  3. Yerel PC'de NIC'ler üzerinden çift yönlü trafik göndermek istiyorum.
  4. Yapılandırma, her alt ağ için iki kullanılmayan IP adresi gerektirir.

Yerel PC otomatik rotaları, 'sahte' IP'ye SNAT ve DNAT giden trafiğine ayarlandı.

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ğına 192.168.2.100 yeniden yaz
  2. Gelen paketler üzerinde 192.168.1.1 hedefini 192.168.1.1 olarak yeniden yaz
  3. Giden paketlerde 192.168.1.1 kaynağına 192.168.1.100 yeniden yaz
  4. Gelen paketler için 192.168.2.1 hedefini 192.168.2.1 olarak yeniden yaz

Özetlemek gerekirse, yerel sistem şimdi 192.168.1.100 ve 192.168.2.100 adresli bir 'sanal' makine ile konuşabilir.

Ardından, yerel PC'nizi sahte IP'nize ulaşmak için harici yönlendiriciyi kullanmaya zorlamak zorundasınız. Bunu, yönlendiriciden geçerek IP'lere doğrudan bir yol oluşturarak yaparsınız. Paketleri hedef alt ağın karşısına zorladığınızdan emin olmak istersiniz.

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ı yapmak için, harici yönlendiricinin yerel PC'nizdeki sahte IP'lere nasıl ulaşacağını bilmesi gerekir. Sisteminiz için proxy ARP'leri açarak incelemeler yapabilirsiniz.

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

Bu kurulum ile artık sahte IP'leri yerel PC'nizde gerçek bir sistem olarak ele alabilirsiniz. Verilerin .1 alt ağına gönderilmesi, paketleri .2 arabiriminden dışarı zorlayacaktır. Verilerin .2 alt ağına gönderilmesi, paketleri .1 arayüzünden dışarı zorlayacaktır.

ping 192.168.1.100
ping 192.168.2.100

15
2018-04-02 03:34



Yolun ç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


"Loopback" modunda yeni bir çift portlu 10Gbps kartta çıkışı test etmek için Linux'ta aşağıdakileri başarıyla kullandım, yani bir bağlantı noktası doğrudan diğerine takıldı. Bu sadece paketleri telden zorlamak için sadece bir miktar voodoo'dur, fakat eğer yapmazsanız, Linux çekirdeği trafiğe kısa devre yapar (bu nedenle OP'nin sorusu). Yukarıdaki Casey'nin cevabında, bir dış yönlendiriciye sahip olmanın gerçekten gerekli olup olmadığından emin değilim, ancak aşağıdakiler tamamen kendi kendine yeten bir şey. İki arayüz eth2 ve eth3'tür.

Arayüzlere IP'ler verin ve bunları ayrı ağlara yerleştirin:

ifconfig eth2 10.50.0.1/24
ifconfig eth3 10.50.1.1/24

Daha sonra, bir çift NAT senaryosu oluşturacağız: diğerine ulaşmak için kullanılan iki yeni sahte ağ. Çıkış yolunda, sahte ağınıza NAT kaynak. Yolda, hedefi düzeltin. Ve diğer ağ için 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 bir sahte ağa nasıl ulaşılacağını söyleyin ve arp girişlerini önceden doldurun (MAC adreslerini değiştirdiğinizden emin olun, benimkini kullanmayın):

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, paketleri tellere asacak kadar Linux'u kandırıyor. Örneğin:

ping 10.60.1.1

eth2 dışarı çıkar, kaynak IP 10.50.0.1 10.60.0.1 ile NAT alır ve eth3'e gelince 10.60.1.1 varış noktası 10.50.1.1 ile NAT alır. Ve cevap benzer bir yolculuğa çıkıyor.

Şimdi çıkışı 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 tele doğru gittiğinden emin olun:

tcpdump -nn -i eth2 -c 500

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

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

Her nasılsa, bu yazıyı nasıl bulacağınızı araştırdım, Soru-Cevapçıları için teşekkürler, ve bu durumun gelecekte bu gönderiyi bulmasına yardımcı olacağını umuyorum.


28
2017-09-08 16:31



+1 Mükemmel çözüm - bu, ip iletmeyi etkinleştirmeyi bile gerektirmez! Bu sadece şu anda ihtiyacım olan şey (geri döngü yoluyla 10GB testi için). - Nils
Vay, teşekkür @ lütuf için nils! - Steve Kehlet


Her zamanki gibi - biraz geç kaldım - ancak günümüzde arayüzleri izole etmek ve herhangi bir yerel iletimi önlemek (ve iptables ile uğraşmak) için ağ ad alanlarını kullanabiliriz).

İsim alanları oluşturun (tümü gerekli izinlerle, ör. Kök olarak yapılır):

ip netns add ns_server
ip netns add ns_client

Arayüzlerin durum / konfigürasyonunun artık şuna erişilebileceğini unutmayın. Atanan ad alanının içeriği - böylece çıplak koşarsanız görünmezler ip bağlantısı Bu, varsayılan ad alanı bağlamında çalıştırıldığı için. Bir isim alanında komut çalıştırmak,

ip netns exec <namespace-name> <command>

önek olarak.

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

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 ad alanı içindeki uygulamaları çalıştırabilirsiniz - iperf sunucusu çalıştırmak 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

Trafik artık tüm networktack, interface, yönlendirme ... isimleri tarafından izole edildiğinden, fiziksel arayüzler üzerinden gönderilecek ve böylece çekirdek, trafiğin içinde kullanılan adresleri yerel (mevcut) arayüzlerle eşleştiremeyecektir.

Denemeniz bittiyse sadece ad alanlarını silin:

ip netns del <namespace-name>

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


7
2017-07-11 09:12





Tamam, sonunda yapılandırmamı kurmayı başardım.

Buradaki bir başka sahte adres, bu sahte adresin rotasının ara yüzüne (2) zorlanması ve daha sonra sahte adresin NAT / iptables ile gerçek adres (2) ile çevrilmesidir.

Kurulumum aslında bir yönlendiriciden yapıldığında IF1 (arayüz 1) ile IF2 arasında telnet yapabilirim

Kurulumda 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önderirsek, pkt IF1 üzerinden yönlendiriciye iletilir, yeniden IF2'ye iletilir, sonra FAKE_IP yerini IF2_ADDR alır. Paket sunucu tarafından işlenir, sonuç FAKE_ADDR ile değiştirilen IF2_ADDR'den IF1_ADDR'ye geri gönderilir.

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


3
2018-03-30 15:52



Eğer yönlendirici $ FAKE_ADDR $ IF2_ADDR'ye gönderiyorsa, DNAT kuralınızın "-i $ IF1" yerine "-i $ IF2" olması gerekmiyor mu? - cmcginty
Haklısın Casey, düzeltme tamam. - calandoa


Yukarıda Thomas Tannhäuser tarafından verilen cevap nokta!

Benzer bir durum vardı: iki enet arabirimine sahip tek bir makine. Planım bir arabirimi sunucu (alıcı) ve diğeri istemci (gönderici) olarak kullanmaktı. Her bir arayüz yönlendiriciye bağlanacak ve iperf, trafoyu çıktı, PPS, gecikme vb.

Ne yazık ki, iptables yaklaşımı sezgisel olmayan ve sorunları ile doluydu. Birkaç sinir bozucu saatten sonra, bu saldırı planından vazgeçtim. Thomas'ın önerisinden esinlenerek, Linux IP Ad Alanı üzerinde küçük bir ödev yaptım ve bu çözümün sadeliğini ve şıklığını takdir etmeye başladım.

Aşağıda Fedora FC26'yı bu kapasitede hizmet verecek şekilde yapılandırmak için kullandığım komutların bir listesi bulunmaktadır. İki arayüz enp1s0 ve enp3s0'dır. Yönlendirici, 192.168.2.112 ve 172.16.16.2 adresli iki arabirime sahiptir. Her FC26 ENET konnektö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

1
2017-08-22 22:51





Linux'unuzu 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 Yönlendirici Projesi

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

Linux LiveCD Yönlendirici

Linux Dergisi - Linux Router

Daha fazla bilgiye dayanarak güncelleme yapın:

İstediğini yapabileceğini düşünmüyorum. İşletim sistemi her zaman kendi yönlendirme tablosuna bakacak ve her iki IP adresini de yerel olarak görecektir. Daha sonra trafiği işletim sistemi içinde yönlendirecek ve asla tele koyamayacaktır. İkinci bir makineye veya iki sanal makineye ihtiyacınız olacak (check out Xen).


0
2018-03-30 12:35





Buradan geçmek için pek çok şey var, bu yüzden doğruluğumu tam olarak garanti edemem, ama asıl soru şu şekilde bilinen şeyi arıyor gibi görünüyor. "kendine gönder" tekniği. Bağlantılı arama, ne düşündüğümü gösterir en iyi korunmuş çekirdek yama üst link + tartışmalar ve çeşitli e-posta listeleriyle ilgili diğer yaklaşımları içeren yamalar. LKML.

Bence aynı zamanda bakmak gerekir ağ ad alanlarıiproute2 ile bitti "ip ağları". Bu da bazı ekstra arayüz ve yönlendirme sihri gerektirir, bu yüzden diğer cevaplarda masif iptables hoopla daha az karmaşık bile olmayabilir.

Yorumlar, eğer bunlarla yararlı bir şeyler bulmuşsa - nasıl, ne, uygulama hakkında nerede - bir şey olursa, kesinlikle hoş geldiniz.


0
2017-12-28 15:29





Bu makaleyi kontrol et. Burada, NAT iletimini kullanarak bir sanal kutuya internet erişimini sağlamak için detaylı adımlar anlatılmaktadır.

http://jackal777.wordpress.com/2012/02/13/virtualbox-host-only-networking-nat-for-internet-access/


0
2018-02-13 14:45



Bu teorik olarak soruyu cevaplayabilirken, tercih edilirdi Burada cevabın önemli kısımlarını dahil etmek ve referans için bağlantıyı sağlamak. - Scott Pack


IPV6 için nasıl çalışıyoruz

atanmış statik ips

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

ana bilgisayarı "FAKE" adreslerine yönlendirmek

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

-1
2017-12-11 22:27



Hangi dağılımı kullanıyorsunuz? En son kontrol ettiğimde, çekirdeğin IPv6 için bir NAT tablosu yok. - fukawi2