คำสั่งให้เรียกใช้กระบวนการลูก "ออฟไลน์" (ไม่มีเครือข่ายภายนอก) บน Linux


15

ฉันมีโปรแกรมที่ฉันต้องการทดสอบในโหมดออฟไลน์โดยไม่ต้องถอดเครือข่ายจริงของฉัน โปรแกรมนี้จะยังคงต้องเชื่อมต่อกับซ็อกเก็ตท้องถิ่นรวมถึงซ็อกเก็ตโดเมนยูนิกซ์และลูปแบ็ค นอกจากนี้ยังต้องฟังลูปแบ็คและสามารถมองเห็นแอปอื่น ๆ ได้

แต่ความพยายามเชื่อมต่อกับเครื่องระยะไกลควรล้มเหลว

ฉันต้องการที่จะมียูทิลิตี้ที่ทำงานเหมือนstrace/ unshare/ sudoและเพียงแค่เรียกใช้คำสั่งกับอินเทอร์เน็ต (และ LAN) ที่ซ่อนอยู่และทุกอย่างอื่นยังคงทำงาน:

$ offline my-program-to-test

คำถามนี้มีคำแนะนำที่คำตอบ: ปิดกั้นการเข้าถึงกระบวนการหรือไม่

มีคู่ของข้อเสนอแนะที่มีเช่นการทำงานเป็นผู้ใช้อื่นแล้วจัดการ iptables unshare -nหรือ แต่ในทั้งสองกรณีฉันไม่รู้ว่าคาถาที่จะได้รับซ็อกเก็ตโดเมนยูนิกซ์และลูปแบ็คเพื่อใช้ร่วมกับระบบหลัก - คำตอบสำหรับคำถามนั้นเพียงบอกฉันว่าจะแบ่งเครือข่ายทั้งหมดอย่างไร

โปรแกรมที่ฉันกำลังทดสอบยังต้องเชื่อมต่อกับเซิร์ฟเวอร์ X และ dbus ของฉันและยังสามารถฟังลูปแบ็คสำหรับการเชื่อมต่อจากแอพอื่น ๆ ในระบบ

เป็นการดีที่ฉันต้องการหลีกเลี่ยงการสร้าง chroots หรือผู้ใช้หรือ VM หรือสิ่งที่คล้ายกันเนื่องจากมันกลายเป็นเรื่องที่น่ารำคาญเหมือนการถอดสายเคเบิลเครือข่าย sudoคือจุดของคำถามคือวิธีที่ฉันสามารถทำให้เป็นง่ายๆเป็น

ฉันชอบกระบวนการที่จะเรียกใช้ 100% ตามปกติยกเว้นการโทรผ่านเครือข่ายที่ระบุที่อยู่นอกพื้นที่จะล้มเหลว เป็นการดีที่จะรักษา uid เดียวกัน homedir เดียวกัน pwd เดียวกันทุกอย่างเดียวกันยกเว้น ... ออฟไลน์

ฉันใช้ Fedora 18 ดังนั้นคำตอบของ Linux ที่ไม่สามารถตอบสนองได้ดี

ฉันยินดีที่จะแก้ปัญหานี้ด้วยการเขียนโปรแกรม C หากเกี่ยวข้องนั่นคือคำตอบที่เกี่ยวข้องกับการเขียน C ก็ดี ฉันไม่รู้ว่า syscalls ใดที่โปรแกรม C จะต้องทำการเพิกถอนการเข้าถึงเครือข่ายภายนอกในขณะที่รักษาเครือข่ายท้องถิ่น

นักพัฒนาใด ๆ ที่พยายามให้การสนับสนุน "โหมดออฟไลน์" อาจจะขอบคุณอรรถประโยชน์นี้!

คำตอบ:


9

iptables -m ownerคำตอบแบบดั้งเดิมคือการเรียกใช้โปรแกรมเป็นผู้ใช้อื่นและการใช้งาน ด้วยวิธีนี้การกำหนดค่าเครือข่ายจะถูกแชร์ อย่างไรก็ตามด้วยแอดเวนต์ของ namespaces มีวิธีที่ง่ายขึ้น

ด้วยเนมสเปซคุณจะปลดเครือข่ายจากนั้นสร้างลิงก์เครือข่ายเสมือนหากคุณต้องการ จำกัด การเข้าถึงเครือข่าย

ในการแบ่งปันซ็อกเก็ตโดเมน unix สิ่งที่คุณต้องมีคือเคอร์เนลที่เพียงพอล่าสุดหลังจากแพตช์ 2010 นี้ดังนั้น 2.6.36 หรือสูงกว่า (ซึ่งเป็นกรณีของการแจกแจงปัจจุบันทั้งหมด ณ เวลาที่เขียนยกเว้น RHEL / CentOS)

เรียกใช้โปรแกรมในเนมสเปซ IP ของตนเอง ก่อนเริ่มโปรแกรมให้สร้างอินเตอร์เฟสอีเธอร์เน็ตเสมือน ดูเหมือนจะมีเอกสารไม่มากนัก ฉันพบคาถาที่ถูกต้องในไม่กี่บล็อก:

ในตัวอย่างด้านล่างฉันใช้ns_execเป็นตัวล้อมรอบนี้setnsแสดงรายการไว้ใน man page เพื่อแสดงด้านโฮสต์ของลิงก์เครือข่ายจากกระบวนการทำงานใน namespace ที่ จำกัด คุณไม่ต้องการสิ่งนี้จริง ๆ : คุณสามารถตั้งค่าด้านโฮสต์ของลิงก์จากภายนอกเนมสเปซที่ จำกัด การดำเนินการจากภายในช่วยอำนวยความสะดวกในการควบคุมการไหลมิฉะนั้นคุณต้องมีการซิงโครไนซ์เพื่อตั้งค่าลิงค์หลังจากสร้างแล้ว แต่ก่อนเริ่มโปรแกรม

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

คุณต้องทำทั้งหมดนี้เพื่อรูท การแนะนำเนมสเปซผู้ใช้ในเคอร์เนล 3.8อาจทำให้สิ่งนี้ทำได้โดยไม่มีสิทธิ์พิเศษยกเว้นการตั้งค่าการเชื่อมโยงเครือข่ายทั่วโลก

ฉันไม่รู้วิธีแชร์ localhost ระหว่างสอง namespaces อินเตอร์เฟสอีเทอร์เน็ตเสมือนสร้างบริดจ์แบบจุดต่อจุด คุณสามารถใช้iptablesกฎการส่งต่อเพื่อเปลี่ยนเส้นทางการรับส่งข้อมูลจาก / ไปยังloหากต้องการ


ข้อมูลเพิ่มเติมที่ดีขอบคุณ ฉันคิดว่า veth ให้ลิงก์ไปที่ "นอก" เนมสเปซ แต่เนมสเปซใหม่ของฉันยังคงมีจำนวนไปที่โหนดเครือข่ายที่แยกต่างหากแทนที่จะเป็นโหนดเครือข่ายเดียวกันกับส่วนที่ไม่ใช่โลคอล ความหมายคือ (?): ซ็อกเก็ตโดเมน Unix / นามธรรมจะยังคงล้มเหลวและลูปแบ็คสามารถส่งต่อผ่าน iptables แต่การส่งต่อไม่สามารถทำการแบ่งปันได้นั่นคือทั้งเนมสเปซดั้งเดิมและ จำกัด อาจฟังบนลูปแบ็คและทั้งสองชุด เปลี่ยน) พอร์ตจะต้องปรากฏในเนมสเปซทั้งสอง ... เริ่มเดาว่าฉันต้องการอะไรที่เป็นไปไม่ได้ที่นี่: - /
Havoc P

1

สิ่งนี้สามารถทำได้ด้วย iptables การจับคู่กลุ่ม cg ฉันเขียนเครื่องมือเพื่อสรุปขั้นตอน ในขณะที่มันต้องการการอนุญาตรูทสำหรับการตั้งค่าเริ่มต้นและเป็นไบนารี setuid ฉันคิดว่ามันมีวิธีที่ตรงไปตรงมาในการจัดการกับปัญหาในคำถาม มันต้องการเวอร์ชัน iptables ที่เร็วพอและโมดูล netfilter ที่เหมาะสมนั้นมีอยู่

https://github.com/quitesimpleorg/qsni


0

/ !! \ นี่อาจไม่ใช่คำตอบที่ถูกต้องเพราะจะทำให้ปริมาณการใช้ข้อมูลของคุณลดลงพร้อมกับคุณไม่ใช่แค่ปริมาณข้อมูล pid เดียว

ฉันไม่ได้ใช้ แต่ฉันคิดว่าคุณสามารถใช้ Comcast:

https://github.com/tylertreat/Comcast

ตั้งค่าการสูญเสียต 100%

อีกครั้งฉันไม่ได้ทดสอบสิ่งนี้ แต่ในทางทฤษฎีปรับเปลี่ยนจาก readme ของพวกเขาคุณสามารถทำได้:


ลินุกซ์

บน Linux คุณสามารถใช้iptablesเพื่อวางแพ็กเก็ตขาเข้าและขาออก

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

หรือคุณสามารถใช้tcซึ่งรองรับตัวเลือกเพิ่มเติมบางอย่าง

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

วิธีรีเซ็ต:

$ tc qdisc del dev eth0 root netem
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.