Linux'ta bir alt işlem “çevrimdışı” (harici ağ yok) çalıştırma komutu


15

Gerçek ağımı kaldırmadan çevrimdışı modda test etmek istediğim bir programım var. Bu programın hala unix etki alanı yuvaları ve geri döngü de dahil olmak üzere yerel soketlere bağlanması gerekir. Ayrıca geri döngüde dinlemeli ve diğer uygulamalar tarafından görülebilir olmalıdır.

Ancak uzaktaki bir makineye bağlanma denemeleri başarısız olmalıdır.

strace/ unshare/ Gibi sudoçalışan ve sadece Internet (ve LAN) gizlenmiş ve diğer her şey hala çalışan bir komut çalıştıran bir yardımcı program istiyorum :

$ offline my-program-to-test

Bu sorunun cevabında ipuçları var: Bir sürecin ağ erişimi engellensin mi?

Orada birkaç öneri vardır, örneğin başka bir kullanıcı olarak çalıştırmak sonra iptables manipüle, veya unshare -n. Ancak her iki durumda da, unix alan soketlerini ve geri dönüşün ana sistemle paylaşılmasını sağlama büyüsünü bilmiyorum - bu sorunun cevapları sadece tüm ağın nasıl paylaşılacağını söylüyor .

Test ettiğim programın hala X sunucuma ve dbus'uma bağlanması ve hatta sistemdeki diğer uygulamalardan gelen bağlantıları geri döngüde dinlemesi gerekiyor.

İdeal olarak, ağ kablosunu çıkarmak kadar can sıkıcı hale geldiğinden, kroket veya kullanıcı veya VM veya benzeri oluşturmaktan kaçınmak istiyorum. yani sorunun amacı bunu nasıl bir kadar basit hale getirebilirim sudo.

Yerel olmayan bir adres belirterek ağ çağrıları başarısız olur dışında işlemi normal olarak% 100 çalıştırmak isterim. İdeal olarak aynı uid, aynı homedir, aynı pwd, aynı hariç her şey ... çevrimdışı.

Fedora 18 kullanıyorum, bu yüzden kaydedilemeyen Linux cevapları gayet iyi (beklenen, hatta).

Bunu bir C programı yazarak çözmekten bile mutluyum, eğer işin içine giriyorsa, C yazmayı içeren cevaplar iyi. Sadece C programının yerel ağı tutarken harici ağ erişimini iptal etmek için ne yapması gerektiğini bilmiyorum.

"Çevrimdışı modu" desteklemeye çalışan herhangi bir geliştirici muhtemelen bu yardımcı program için teşekkür ederiz!

Yanıtlar:


9

Geleneksel cevap programı başka bir kullanıcı olarak çalıştırmak ve kullanmaktır iptables -m owner. Bu şekilde ağ yapılandırması paylaşılır. Ancak, ad alanlarının ortaya çıkması ile daha kolay bir yol var.

Ad alanlarıyla ağı paylaşmayın, ardından sınırlı ağ erişimine ihtiyacınız varsa bir sanal ağ bağlantısı oluşturun.

Unix alan soketlerini paylaşmak için ihtiyacınız olan tek şey, bu 2010 yamasından sonra yeterince yakın bir çekirdeğe sahip olmaktır , bu nedenle 2.6.36 veya üstü (bu, RHEL / CentOS hariç yazma sırasındaki tüm geçerli dağıtımlarda olduğu gibi).

Programı kendi IP ad alanında çalıştırın. Programa başlamadan önce bir sanal ethernet arayüzü oluşturun. Çok fazla belge yok gibi görünüyor; Birkaç blogda doğru büyüyü buldum:

Aşağıda pasajı, ben kullanmak ns_execolduğunu etrafında bu sarıcısetns kısıtlı ad alanında çalışan sürecinden ağ bağlantısının konak tarafını ekrana getirmek için man sayfasında bulabilirsiniz. Aslında buna ihtiyacınız yoktur: bağlantının ana bilgisayar tarafını kısıtlı ad alanının dışından ayarlayabilirsiniz. İçeriden yapmak sadece akış kontrolünü kolaylaştırır, aksi takdirde bağlantı kurulduktan sonra ancak programınıza başlamadan önce kurmak için bazı senkronizasyonlara ihtiyacınız vardır.

unshare -n -- sh -c '
  # Create a virtual ethernet interface called "confined",
  # with the other end called "global" in the namespace of PID 1
  ip link add confined type veth peer name global netns 1

  # Bring up the confined end of the network link
  ip addr add 172.16.0.2/30 dev confined
  ip link set confined up

  # Bring up the global end of the network link
  ns_exec /proc/1/ns/net ifconfig global 172.16.0.1 netmask 255.255.255.252 up

  # Execute the test program
  exec sudo -E -u "$TARGET_USER" "$0" "$@"
' /path/to/program --argument

Tüm bunları kök olarak yapmanız gerekir. Kernel 3.8 kullanıcı ad giriş ağ bağlantısının küresel ucunu kurma dışında hiçbir özel izinlerle Bu yapılabilir hale getirebilir.

Localhost'u iki ad alanı arasında nasıl paylaşacağımı bilmiyorum. Sanal ethernet arabirimleri bir noktadan noktaya köprü oluşturur. İsterseniz iptablestrafiği / yönünden trafiğe yönlendirmek için yönlendirme kurallarını kullanabilirsiniz lo.


İyi ek bilgi, teşekkürler. Ben veth bana ad alanı "dışında" bir bağlantı verir düşünüyorum ama yeni ad alanı hala aynı ağ düğümü eksi yerel olmayan arabirimler yerine, ayrı bir ağ düğümü tutar. Etkileri (?): Unix etki alanı / soyut yuvaları yine de başarısız olur ve geri döngü iptables yoluyla iletilebilir, ancak yönlendirme paylaşıma ulaşmaz - yani, hem orijinal hem de kısıtlanmış ad alanı geri döngüde dinliyor olabilir ve her iki (dinamik olarak) -changing) bağlantı noktaları her iki isim alanında görünür olması gerekir ... ne istediğimi tahmin etmeye başlamak burada imkansız: - /
Havoc P

1

Bu, iptables kural eşleştirme gruplarıyla da gerçekleştirilebilir. Adımları özetlemek için bir araç yazdım. İlk kurulum için kök izinleri gerektirir ve aksi takdirde setuid bir ikili olsa da, bu sorudaki sorunla başa çıkmak için oldukça basit bir yol sunuyor düşünüyorum. Yeterince yeni bir iptables sürümü gerektirir ve uygun netfilter modülleri kullanılabilir.

https://github.com/quitesimpleorg/qsni


0

/ !! \ Bu muhtemelen geçerli bir yanıt değildir, çünkü bu sadece tek bir pidenin trafiğini değil tüm trafiğinizi de azaltacaktır.

Kullanmadım, ancak Comcast'i potansiyel olarak kullanabileceğinizi düşünüyorum:

https://github.com/tylertreat/Comcast

% 100 paket kaybına ayarla

Yine, bunu test etmedim, ancak teorik olarak, benioku dosyalarından değiştirildi:


Linux

Linux'ta, iptablesgelen ve giden paketleri bırakmak için kullanabilirsiniz .

$ iptables -A INPUT -m statistic --mode random --probability 1 -j DROP
$ iptables -A OUTPUT -m statistic --mode random --probability 1 -j DROP

Alternatif olarak, tcbazı ek seçenekleri destekleyen kullanabilirsiniz .

$ tc qdisc change dev eth0 root netem reorder 0 duplicate 0 corrupt 1

Sıfırlamak:

$ tc qdisc del dev eth0 root netem
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.