อนุญาตการรับส่งข้อมูลขาออกบางอย่างในอินเทอร์เฟซบางอย่างเท่านั้น


15

ฉันมีปัญหาค่อนข้างแปลก ฉันมีเซิร์ฟเวอร์ที่มีสองเชื่อมต่อเครือข่ายและeth0 eth1แต่ละคนเชื่อมต่อกับเครือข่ายที่แตกต่างกัน แต่ละเครือข่ายมีเกตเวย์อินเทอร์เน็ต เซิร์ฟเวอร์มีการเชื่อมต่อขาออกต่าง ๆ: http (สคริปต์บางตัวบนเว็บไซต์ของเซิร์ฟเวอร์ขูด), ไคลเอนต์ nfs, ไคลเอนต์แซมบ้า, ไคลเอนต์ DNS และตัวดึงข้อมูลอีเมลที่จะตั้งชื่อ

สำหรับเหตุผลที่ฉันจะไม่ไปลงที่ฉันจำเป็นต้องแยกขาออกลูกค้าเหล่านี้ขึ้นเพื่อให้ขาออก HTTP, NFS, samba DNS และการจราจรที่มีการร้องขอเท่านั้นมากกว่าในขณะที่ทุกอย่างอื่นออกไปผ่านeth0eth1

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

ใครบางคนสามารถเริ่มต้นฉันด้วยกฎตัวอย่างบางอย่างและบอกฉันว่าจะให้ระบบนำกฎเหล่านี้มาใช้ในการบูตได้อย่างไร เป็นการดีถ้าไม่มีการล็อคฉันออกจากการเชื่อมต่อ SSH ของฉัน (ฉันสามารถเข้าถึงได้ แต่ฉันไม่ต้องการ)

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

คำตอบ:


12

ฉันจะตั้งค่าตารางเส้นทางที่แยกต่างหากและนโยบายเพื่อกำหนดเส้นทางแพ็กเก็ตที่ทำเครื่องหมายโดยใช้ตารางนั้นและมี iptables / netfilter ทำเครื่องหมายแพ็คเก็ตบางอย่าง

สร้างตาราง: echo 1 known >> /etc/iproute2/rt_tables

สร้างกฎการเราต์ ( ipคำสั่งมาจากiproute2 ): ip rule add from all fwmark 1 table known

เราสร้างตารางที่เรียกว่า "รู้จัก" และสร้างกฎการกำหนดเส้นทางที่ระบุว่าแพ็กเก็ตใด ๆ ที่มีเครื่องหมายเท่ากับ 1 จะถูกกำหนดเส้นทางตามตาราง "รู้จัก" ฉันเรียกมันว่ารู้จักเพราะมันเป็นรายการของโปรโตคอลที่รู้จัก - คุณสามารถตั้งชื่อสิ่งที่คุณต้องการ ตอนนี้เราตั้งค่าตารางที่รู้จักกันเพื่อกำหนดเส้นทางที่เหมาะสม

ip route add default dev eth0 table known

สร้างกฎ iptables:

iptables -t mangle -I PREROUTING -p tcp --dport 111 -j MARK --set-mark 1
iptables -t mangle -I PREROUTING -p tcp --dport 2049 -j MARK --set-mark 1

ตัวอย่างทำเครื่องหมายแพ็กเก็ตบนพอร์ต NFS (111, 2049) ด้วย 1 เรากำลังเพิ่มกฎนี้ใน iptable 'mangle' สิ่งนี้แตกต่างจากตารางเส้นทางและไม่สามารถเปลี่ยนแปลงได้ ตาราง mangle นั้นใช้สำหรับการแก้ไขแพ็กเก็ตในลักษณะอื่นใดนอกเหนือจาก NAT

ตอนนี้เพื่อกำหนดเส้นทางทุกอย่างผ่านอินเทอร์เฟซอื่นเราเพิ่มเส้นทางไปยังตารางเส้นทางมาตรฐาน

ip route add default dev eth1

เพื่อให้เข้าใจสิ่งนี้จริงๆอ่านส่วนที่ 4 และ 11 ของLARTCอย่างไร


ที่จริงแล้วง่ายกว่าที่ฉันกลัวมาก สแต็กเครือข่าย Linux เป็นสัตว์ที่สวยงามจริง ๆ ใช่มั้ย! ฉันได้รับการทดสอบอย่างรวดเร็วและดูเหมือนว่าทุกอย่างจะทำงานตามที่คาดไว้ ฉันกำลังตรวจสอบแต่ละอินเทอร์เฟซผ่านiftopและพวกเขาแต่ละคนแสดงการรับส่งข้อมูลที่ถูกต้อง ขอบคุณมาก.
Oli

ฉันไม่รู้ว่า iptables หรือ iproute2 เก็บการตั้งค่าไว้อย่างไร ฉันต้องปิดกฎเหล่านี้ทุกครั้งหรือไม่
Oli

@Oli พวกเขาจะถูกล้างออกเมื่อคุณรีบูต คุณสามารถบันทึกและเรียกคืนกฎระเบียบที่มีและiptables-save iptables-restoreหากคุณใช้ NetworkManager คุณสามารถตั้งค่าสคริปต์โปรแกรมเลือกจ่ายงานเพื่อดำเนินการอัตโนมัติ น่าเสียดายที่หน้า NM อย่างเป็นทางการไม่มีเอกสารเกี่ยวกับคุณลักษณะนี้ แต่เอกสารUbuntuและArch Linuxทั้งคู่พูดถึงมัน
Shawn J. Goff

5

ด้วยวิธีที่ " ง่ายที่สุด " ควรจะแนะนำให้โปรแกรมเดียวใช้อินเทอร์เฟซเฉพาะ (หรือไอพีของอินเทอร์เฟซตัวอย่าง:

ping -I eth1 8.8.8.8

สั่ง ping ให้ใช้ eth1 เป็นส่วนต่อประสานแหล่งที่มาขณะที่

wget --bind-address 10.0.0.1 http://www.google.it/

สั่งให้ wget ผ่านส่วนต่อประสานซึ่งมี10.0.0.1ที่อยู่ IP

สุจริตฉันไม่รู้ว่ามันเป็นไปได้กับทุกโปรแกรมที่คุณต้องการ แต่มันเป็นการเริ่มต้นที่จะตัดทอนกฎที่คุณต้องเขียนiptablesและiprouteโปรแกรม

เป็นการเริ่มต้นคุณควรอ่านบทช่วยสอนนี้เกี่ยวกับการเชื่อมต่ออินเทอร์เน็ตหลายจุด การอ่านที่ดีนอกจากนี้ยังเป็นหนึ่งในพันของบทเรียน iptables, expecially บนoutbound filtering, process/ และpid filteringport filtering


4

วิธีที่เหมาะสมในการทำเช่นนี้คือการผูก () กับอินเทอร์เฟซที่คุณต้องการใช้สำหรับแพ็กเก็ตขาออก เนื่องจากคุณสามารถตั้งค่าเส้นทางด้วยip routeและip ruleคำสั่งเพื่อควบคุมวิธีการส่งแพ็กเก็ตที่กำหนดเส้นทางตามส่วนต่อประสานขาออก สำหรับตัวอย่างของฉันฉันจะถือว่าเครือข่ายต่อไปนี้:

  • eth0:
    • ที่อยู่: 192.168.0.2/24
    • เกตเวย์เริ่มต้น: 192.168.0.1
  • eth1:
    • ที่อยู่: 192.168.1.2/24
    • เกตเวย์เริ่มต้น: 192.168.1.1

ฉันจะสร้างตารางเส้นทางสองตารางหนึ่งตารางสำหรับการรับส่งข้อมูลสำหรับ eth0 เรียกว่าสำรองและหนึ่งตารางสำหรับ eth1 เรียกว่า main มีตารางหลักเส้นทางอยู่เสมอและเป็นตารางปกติที่ใช้โดยคำสั่งrouteและ ip routeคนส่วนใหญ่ไม่เคยจัดการกับตารางอื่น ๆ ในการสร้างตารางที่เรียกว่าสำรองเราจะเพิ่มบรรทัดต่อไปนี้ลงใน/etc/iproute2/rt_tables:

10    alternate

ตารางหลักมีความสำคัญเริ่มต้นที่ 254 กฎที่ตารางเส้นทางมีผลบังคับใช้จะถูกควบคุมโดยip ruleคำสั่ง โดยค่าเริ่มต้นคำสั่งนั้นจะพิมพ์รายการกฎที่มีอยู่ซึ่งควรมีลักษณะดังนี้:

0:      from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

สิ่งนี้บอกว่ามันจะหาเส้นทางในตารางlocalซึ่งเป็นตารางพิเศษที่เคอร์เนลดูแลสำหรับเส้นทางภายในเช่นที่อยู่ IP ของฉันเอง จากนั้นจะลองตารางหลักและตารางเริ่มต้น โดยปกติแล้วค่าเริ่มต้นของตารางจะว่างเปล่าดังนั้นหากไม่มีหลักที่ตรงกันจะไม่มีเส้นทางไปยังโฮสต์ ก่อนอื่นให้เติมตารางอื่นด้วยกฎสำหรับ eth0

sudo ip route add table alternate 192.168.0.0/24 dev eth0
sudo ip route add table alternate 192.168.1.0/24 dev eth1
sudo ip route add table alternate default via 192.168.0.1

โดยปกติคุณจะต้องการalternateตารางให้มีลักษณะคล้ายกับmainตาราง ความแตกต่างเพียงอย่างเดียวคือเมื่อการกำหนดเส้นทางควรแตกต่างกัน คุณอาจไม่ต้องการรวมบรรทัดที่สองด้านบนหากคุณต้องการให้ปริมาณการรับส่งข้อมูล NFS, HTTP และอื่น ๆ ทั้งหมดผ่านเกตเวย์เริ่มต้นบน eth0 แม้ว่าจะเป็นปลายทางสำหรับเครือข่ายบน eth1 ขั้นตอนต่อไปคือการเพิ่มกฎสำหรับเมื่อใช้ตารางการเราติ้งสำรองนี้:

sudo ip rule add from 192.168.0.0/24 pref 10 table alternate

กฎนี้บอกว่าการรับส่งข้อมูลใด ๆ ที่มาจากที่อยู่บนเครือข่าย 192.168.0 จะใช้alternateตารางเส้นทางแทนmainตารางปกติ ขั้นตอนสุดท้ายคือการทำให้แน่ใจว่าไคลเอนต์ทั้งหมดที่ต้องใช้การeth0เชื่อมโยงนั้น ด้วยwgetตัวอย่างเช่น set --bind-address=192.168.0.2สำหรับ NFS ตั้งค่าclientaddr=192.168.0.2ตัวเลือกการเมานต์ หากใช้ LibWWW กับ Perl คุณสามารถตั้งค่าตัวเลือก localaddr ใน LWP :: UserAgent เพื่อควบคุมส่วนต่อประสานภายในที่เชื่อมกับ หากคุณมีไคลเอนต์ที่คุณไม่สามารถควบคุมการรวมและแหล่งรวบรวมไม่ได้เป็นตัวเลือกคุณอาจจะสามารถใช้กฎ iptables เพื่อแก้ไขที่อยู่ของมัน แต่นี่เป็นแฮ็คมากกว่าและอาจไม่ทำงาน คุณจะต้องตั้งค่ากฎ SNAT ในโซ่ PREROUTING ของตาราง nat หรือตาราง mangle คุณจะต้องใช้ตารางการเราต์ที่ถูกแก้ไขด้านบนเพื่อให้มันใช้งานได้

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