Farklı işlemler için farklı ağ arayüzleri nasıl kullanılır?


59

Bir Linux PC'de iki ağ arayüzüm var ve verilen bir işlemin kullanacağı arayüzü manuel olarak ayarlamam gerekiyor.

Programın (Twinkle softphone) benzer bir seçeneği yok, bu yüzden harici olarak ayarlanması gerektiğine inanıyorum.

Nasıl yapabilirim?

Düzenleme: Bir sunucu işlemi belirli bir arabirime bağlamayı denemiyorum, bunun yerine bir istemci programının belirli bir arabirim kullanarak bir sunucuya ulaşmasını sağlamak.


istemciler de bind / connect kullanıyorlar, ircII'nin (bir irc-istemci programı) belirli bir ip için nasıl zorlanacağına ilişkin bind.c.txt belgelerine bakın: 'Sanal IP'nizi ircII için giden kaynak adresiniz olarak kullanmak için kısaca örnek: BIND_ADDR = "your-virt-ip" LD_PRELOAD =. / Bind.so ircII '
akira

Burada farklı bir yaklaşım buldum, umarım faydalı olur ( Tanımlı
Savvas

Yanıtlar:


48

çalışma zamanında LD_PRELOAD kullanarak kodu değiştirebilirsiniz (@windows detours , oldukça süslü olarak adlandırılan benzer bir teknik kullanabilirsiniz ). Bunun amacı, dinamik linker'a önce tüm lib'leri çalıştırmak istediğiniz prosese yüklemesini ve ardından üzerine biraz daha eklemesini sağlamaktır. normalde bu şekilde kullanın:

% LD_PRELOAD=./mylib.so ls

ve bununla ne yaptığını değiştirirsin ls.

Sorununuz i denemek istiyorum http://www.ryde.net/code/bind.c.txt sizin gibi kullanabileceğiniz,:

% BIND_ADDR="ip_of_ethX" LD_PRELOAD=./bind.so twinkle

İşte nasıl inşa edersiniz:

% wget http://www.ryde.net/code/bind.c.txt -O bind.c
% gcc -nostartfiles -fpic -shared bind.c -o bind.so -ldl -D_GNU_SOURCE

http://daniel-lange.com/archives/53-Binding-applications-to-a-specific-IP.html nasıl yapılırsa daha uzun

benzer hack ve araçlar:


7
Vay be, ne halt? +1
sinni800

1
Merhaba, bu gerçekten güzel bir numara gibi görünüyor, ama benim için işe yaramıyor. Bağlandığımda iki arayüz (ppp0 ve ppp1) açan iki 3G modemim var. İki IP'den birini zorlamaya çalışırsam, her zaman aynı arayüzle çıkarım (her arayüz için bir tane olmak üzere iki wireshark örneğine sahip olduğum için görüyorum). Ayrıca hata ayıklama çıktılarını bind.c'den kaldırdım ve gerçekten de "aşırı yüklenmiş" kütüphanenin yüklü olduğunu görüyorum, bu yüzden neden işe yaramadığını bilmiyorum.
Andrea Spadaccini

3
Etkin UID'niz gerçek UID'nizle aynı değilse, LD_PRELOAD yoksayılır.
matthias krull

force_bindCatalin M. BOIE proje ipv6 desteği
BurnsBA

Harika çalışıyor ancak derlemenin başarılı olması için #include <arpa / inet.h> eklemesi gerekiyordu.
anno

31

ip ağları bunu yapabilir.

TL; DR: Ağ ad alanları oluşturun, arayüzleri onlarla ilişkilendirin ve ardından "ip netns exec NAME cmd ..." komutunu çalıştırın.

Sadece dağıtımınızın ip ağları destekleyip desteklemediğini kontrol edin ... (Backtrack 5r3 değil, Kali ise;))

DETAYLARDA:

#create netns
ip netns add myNamespace
#link iface to netns
ip link set eth0 netns myNamespace
#set ip address in namespace
ip netns exec myNamespace ifconfig eth0 192.168.0.10/24 up
#set loopback (may be needed by process run in this namespace)
ip netns exec myNamespace ifconfig lo 127.0.0.1/8 up
#set route in namespace
ip netns exec myNamespace route add default gw 192.168.0.1
#force firefox to run inside namespace (using eth0 as outgoing interface and the route)
ip netns exec myNamespace firefox

Bu neden ipi LD_PRELOAD üzerinden bağlamaktan daha iyidir? Çünkü LD_PRELOAD, işlemlerin kullandığı rotayı kontrol etmez. İlk rotayı kullanacak.

Ve her zaman aynı rotayı kullandığından, rotaya kayıtlı olan arabirime varsayılan olarak gidecektir (istediğimiz bu değildir).


2
Lütfen cevabınıza daha fazla ayrıntı eklemeye çalışın.
Renju Chandran chingath

4
eth0 kamuya açık ağ arayüzü ise uzak sunucuda bunu
yapmayın

1
son satır olmalıip netns exec myNamespace firefox
meuh

1
Gerektiğinde ad alanını kaldırmak için "sudo ip netns del <namespace-name>" kullanın!
Eduardo Lucio

1
@EduardoLucio şöyle yürütmek mümkün olmalıdır: sudo ip netns exec myNamespace su -u someUser -c firefox
olivervbk

2

Bir süreci belirli bir arayüzü kullanmaya zorlamanın mümkün olduğunu sanmıyorum.

Bununla birlikte, ipchain / iptables ile oynayabileceğinizi ve işleminizin dinlediği belirli bir bağlantı noktasının yalnızca belirli bir arabirimden gelen paketleri alabileceğini zorlayabileceğinizi düşünüyorum.

Faydalı NASIL: http://tldp.org/HOWTO/IPCHAINS-HOWTO.html


2
Yüksek oy alan iki mevki aksi ispat edildi.
Paul Gear,

2

Aşağıdaki @olivervbk cevap dayanarak benim!

Tüm komutları "root" olarak çalıştırın.

Komutu kullan ...

ip a

... kullanmak isteyeceğiniz ağ arayüzünün adını bulmak için.

Aşağıdaki komutları şablon olarak çalıştırın ...

ip netns add [INTERFACE_NAME]_ns
ip link set dev [INTERFACE_NAME] netns [INTERFACE_NAME]_ns
ip netns exec [INTERFACE_NAME]_ns ifconfig [INTERFACE_NAME] 10.1.1.10/24 up
ip netns exec [INTERFACE_NAME]_ns ifconfig lo 127.0.0.1/8 up
ip netns exec [INTERFACE_NAME]_ns route add default gw 10.1.1.1
ip netns exec [INTERFACE_NAME]_ns dhcpcd [INTERFACE_NAME]
ip netns exec [INTERFACE_NAME]_ns sudo -b -u [YOUR_USER] [APP_NAME] 2> /dev/null 1> /dev/null &
  • [INTERFACE_NAME] - Seçilen ağ arayüzünün adı ile değiştirin.
  • [YOUR_USER] - Kullanıcı adınızla değiştirin.
  • [APP_NAME] - "[INTERFACE_NAME] _ns" ad alanında yürütülecek uygulamanın adı. Ör .: "firefox".

NOT I: "sudo" komutundaki "-b -u" bayrakları uygulamanın, kullanıcı ("root" değil) kullanarak ve terminali serbest bırakan arka planda kullanarak çalışmasına izin verir. 2> /dev/null 1> /dev/null &Pasajı "[APP_NAME]" terminalinde basılan gelen çıkışların önlemektir.
Not II: "10.1.1.10" ve "10.1.1.1" iplerinin değerleri isteğe bağlıdır.
NOT III: Benim için çalışmak için dhcpcd [INTERFACE_NAME]komutu çalıştırmam gerekti.

Ad alanını kaldırmak için ...

ip netns del [INTERFACE_NAME]_ns

... veya ...

ip -all netns delete

... var olanları silmek için.


1

Genellikle, bir programın dinleme arayüzünü ayarlama seçeneği yoksa, TÜM arayüzleri dinler. (Bunu ile doğrulayabilirsiniz lsof -i).

Gelen trafiği azaltan iptables firewall kuralları oluşturmak, bağlantı noktalarının üzerinde görünmesini istemediğiniz arayüzlerde işaret ediyor. Yapılması en kolay şey.


1

Alternatif I:

Arabirim ağ geçidini zorlamak için ld_preload kullanma https://github.com/Intika-Linux-Network/App-Route-Jail

Bir uygulamayı belirli bir ağ arayüzü kullanmaya zorla

Ağ arabiriminin hangi ağ geçidini kullandığını bulmamız gerekir, o zaman bu ağ geçidini hapse atılan uygulamamıza zorlar ve böylece uygulamayı belirli bir ağ arabirimine bağlanmaya zorlar

  • Arabirim ağ geçidi nasıl bulunur (burada ağ geçidini bulmak için birçok çözüm vardır, burada kullanılan ağ geçidini bulmaya izin veren bazı komutlar vardır)
$ route
$ route -n
$ ip rule list
$ ip route show
$ netstat -rn
$ cat /etc/network/interfaces
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
$ traceroute www.google.com
$ ip route show 0.0.0.0/0 dev eth0

Uygulama ağ geçidi başına

  • App-Route-Jail oluşturun
git clone https://github.com/Intika-Linux-Network/App-Route-Jail.git
cd Approute-Utils
chown 755 make.sh
./make.sh
  • Gelecekteki işaretli paketler için (hapsedilmiş uygulama için) bu örnekte 192.168.1.1zorunlu ağ geçidi olarak kullanılan bir rota ekleyin , bu rota kuralı diğer uygulamaları etkilemeyecektir, bu manipülasyon örneğin bir sistem önyüklemesinde sadece bir kez yapılmalı, örneğin bu çözümü her gün kullanın
ip rule add fwmark 10 table 100
ip route add default via 192.168.1.1 table 100
  • Hapse atmak istediğiniz uygulamayı başlatın
MARK=10 LD_PRELOAD=./mark.so firefox
  • Wan IP adresini test etme
MARK=10 LD_PRELOAD=./mark.so wget -qO- ifconfig.me

Alternatif II:

Firejail https://firejail.wordpress.com/ , bir uygulamayı belirli bir ağ kullanmaya zorlayabilir, ancak uyumluluk sınırlıdır.

firejail --dns=8.8.8.8 --net=eth0 --ip=192.168.1.1

Bu işaret normal kullanıcılar için mümkün değildir, kök olarak çalıştırmanız gerekir.
jornane

-2

Neden bir programın sunucuya bağlanmak için sunucuya bağlı olandan başka bir arabirim kullanmasını istersiniz? Sistem, o sunucuyla konuşmak için bir sunucuya bağlı arayüzü kullanmıyorsa, bu sistem düzeyinde (yönlendirme tablosu) bir sorundur ve bu işlemin o sunucuyla konuşmak istediği şeyle ilgisi yoktur.

IP ağlarındaki farklı sunucular farklı IP adreslerine sahiptir. Çekirdek, yönlendirme tablosuna dayanarak belirli bir IP adresine ulaşmak için hangi arayüzü kullanacağını bilmelidir. Aynı IP adresine sahip iki farklı sunucuyla konuşmaya çalışıyorsanız, sistemin kafası karışır (çünkü diğer şeylerin yanı sıra, bağlantıları yalnızca dahili olarak hedef adreslerine göre dizinler). Bunu yapabilirsiniz, ancak bir sunucuya yalnızca makineye NAT yazılımı üzerinden bağlı olan ayrı bir mantıksal ağa bir sunucu yerleştirmeyi içeren sistem düzeyinde bir düzeltmedir.

Dolayısıyla, farklı IP adresleri varsa, doğru arayüzü seçmek için yolları kullanın. Aynı IP adresine sahiplerse, NAT'ı kullanmanız gerekir, böylece sistemde farklı IP adresleri vardır.


3
İlk olarak, müşteri ile sunucu arasında birçok geçerli yol olabilir, ancak farklı trafik türlerine uygun farklı özelliklere sahip olabilir; örneğin UMTS (Hücresel Veri) paraya mal olabilir, ancak WiFi'den daha geniş bir menzile sahiptir, ancak her ikisi de bir fiber bağlantısından daha yavaştır. Yukarı akış sağlayıcılar kaynak filtrelemesi yaparsa (veya NAT), 'doğru' arayüzü göndermekten başka seçeneğiniz yoktur. İkincisi, yönlendirmeyi etkilemek bir kaynak adresi seçmenin tek nedeni değildir. Her iki adresleri aynı arabirimde olduğunda bile sunucu olarak, bağlantı başlatırken için bağlı olduğu kontrol etmek yararlı olabilir

Durumlardan biri, farklı kamu IP'leriniz varsa ve giden bağlantılar için her birinde yeni bir işlem başlatmak istiyorsanız.
Rfraile
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.