ฉันจะใช้ Linux เป็นเกตเวย์ได้อย่างไร


16

หมายเหตุ: หากอุปกรณ์ไคลเอนต์ ( computer Bในตัวอย่างนี้) ต้องการรับอินเทอร์เน็ตผ่านคอมพิวเตอร์เกตเวย์อาจจำเป็นต้องกำหนดค่าการแก้ไขเนมเซิร์ฟเวอร์ นี่ไม่ได้อธิบายที่นี่ (เกตเวย์ไม่จำเป็นต้องให้บริการอินเทอร์เน็ต)

ฉันกำลังพยายามทำความเข้าใจพื้นฐานของการกำหนดเส้นทางเครือข่าย
ดังนั้นฉันกำลังทดลองกับ LAN ของฉัน (ตอนนี้ฉันไม่ต้องการอินเทอร์เน็ตแค่ใช้การสื่อสาร LAN)

ฉันรู้ว่าการกำหนดค่าเครือข่ายเป็นเรื่องที่ค่อนข้างซับซ้อน แต่ฉันแค่พยายามทำให้คอมพิวเตอร์ (พูดว่า A) ทำหน้าที่เป็นเกตเวย์ของอีกคนหนึ่ง (พูดว่า B) (ทั้งที่ใช้ Ubuntu Linux)
ฉันต้องการเพียง B เพื่อให้สามารถเข้าถึงเราเตอร์ที่เข้าถึงได้เฉพาะ A เท่านั้น

นี่เป็นกรณี:

Router for computer A  -->  192.168.0.1
Computer A - eth0      -->  192.168.0.2
Computer A - eth1      -->  192.168.1.1

Computer B - eth0      -->  192.168.1.2

คอมพิวเตอร์A เชื่อมต่อกับเราเตอร์ได้ดี
คอมพิวเตอร์A และ Bเชื่อมต่อแบบละเอียด (ping, SSH ... ฯลฯ ) ระหว่างกัน
คอมพิวเตอร์ B ไม่สามารถเข้าถึงเราเตอร์สำหรับคอมพิวเตอร์ A.

ฉันคิดว่าการเพิ่ม B Computer A เป็นเกตเวย์เริ่มต้นและการเปิดใช้งานการส่งต่อ IP บน Aจะทำให้ B สามารถเข้าถึงเราเตอร์สำหรับ A:

luis@ComputerB:~$ sudo route add default gw 192.168.1.1
luis@ComputerB:~$ sudo routel

target            gateway      source        proto    scope  dev   tbl
127.0.0.0         broadcast    127.0.0.1     kernel   link   lo    local
127.0.0.0 8       local        127.0.0.1     kernel   host   lo    local
127.0.0.1         local        127.0.0.1     kernel   host   lo    local
127.255.255.255   broadcast    127.0.0.1     kernel   link   lo    local
192.168.1.0       broadcast    192.168.1.2   kernel   link   eth0  local
192.168.1.2       local        192.168.1.2   kernel   host   eth0  local
192.168.1.255     broadcast    192.168.1.2   kernel   link   eth0  local
default           192.168.1.1                                eth0
169.254.0.0 16                                        link   eth0
192.168.1.0 24                 192.168.1.2   kernel   link   eth0

และในคอมพิวเตอร์ A (เกตเวย์ระดับกลาง):

root@ComputerA:~$ echo 1 > /proc/sys/net/ipv4/ip_forward

คอมพิวเตอร์ B ยังคง ping คอมพิวเตอร์ A แต่เราเตอร์สำหรับ A ไม่ตอบ:

luis@ComputerB:~$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
^C

(ไม่มีการตอบสนอง ping)

นี่เป็นขั้นตอนที่ถูกต้องในการทำให้คอมพิวเตอร์ที่ใช้ Linux ทำหน้าที่เป็นเกตเวย์สำหรับคอมพิวเตอร์เครื่องอื่นในลักษณะที่เรียบง่ายหรือไม่?

คำตอบ:


21

คุณเกือบจะอยู่ที่นั่นคุณแค่ต้องแน่ใจว่าทราฟฟิกกลับมาที่ B ตอนนี้คุณได้ส่งต่อทราฟฟิกจาก B ไปสู่โลกภายนอก แต่ A ไม่ทราบวิธีที่จะได้รับทราฟฟิกกลับไปที่ B คุณต้องการ A การเชื่อมต่อจะผ่านมัน การทำเช่นนี้คุณจะต้องการเปิดใช้งานNAT คุณมีขั้นตอนเดียวที่อนุญาตให้ส่งต่อได้ จากนั้นคุณต้องเพิ่มกฎไฟร์วอลล์บางข้อโดยใช้iptables:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

สิ่งนี้บอกว่า: บนตารางการแปลที่อยู่เครือข่ายหลังจากที่เราหาเส้นทางของแพ็กเก็ตบนเอาท์พุท eth0 (ภายนอก) ให้แทนที่ข้อมูลที่อยู่ผู้ส่งด้วยของเราเองเพื่อให้แพ็กเก็ตที่ส่งคืนมาถึงเรา นอกจากนี้โปรดจำไว้ว่าเราทำเช่นนี้ (เช่นตารางการค้นหาที่จดจำการเชื่อมต่อนี้)

iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

อนุญาตให้แพ็กเก็ตที่ต้องการมาจาก eth1 (อินเทอร์เฟซภายใน) เพื่อออกไป eth0 (อินเทอร์เฟซภายนอก)

iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

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


คำอธิบายที่รัดกุมแน่นอน จะต้องดำเนินการบล็อครหัสทั้งหมดในคอมพิวเตอร์ A หรือไม่
Sopalajo de Arrierez

@SopalajodeArrierez ใช่สิ่งเหล่านี้ทั้งหมดถูกดำเนินการบนคอมพิวเตอร์ "เกตเวย์" ระบบ B ไม่จำเป็นต้องรู้อะไรเกี่ยวกับการกำหนดเส้นทางอื่นนอกจากถ้าต้องการเข้าถึงเครื่องอื่น ๆ มันจะส่งแพ็กเก็ตไปยัง B (เป็นค่าเริ่มต้น GW)
user1794469

ผ่านการทดสอบการทำงานบน Ubuntu v14 บนเดสก์ท็อปและ Ubuntu v12 บน Utilite Pro (อุปกรณ์ฝังตัวจาก CompuLabs) ขอบคุณมากสำหรับการขยายสิ่งที่แต่ละบรรทัดทำ ฉันค้นคว้าและพบคำอธิบายที่ยาวนานมาก ๆ ที่ไม่ได้ผล ฉันหวังว่าเธรดคำถามคำตอบนี้อาจเป็นประโยชน์สำหรับผู้อื่นในอนาคต
Sopalajo de Arrierez

@ user1794469 มันเหมือนกันเมื่อส่วนต่อประสานเกตเวย์เป็นเสมือนคือส่วนต่อประสานแบบแตะ? คุณสามารถดูที่นี่ได้ไหม
ram

1

เพื่อให้การกำหนดเส้นทางทำงานอย่างถูกต้องระหว่างคอมพิวเตอร์ Linux สองเครื่องที่ทำหน้าที่เป็นเกตเวย์มีหลายสิ่งที่จำเป็นต้องมี:

  • เกตเวย์ทั้งสองจำเป็นต้องมีการเชื่อมโยงทางกายภาพซึ่งกันและกัน (หรือเสมือนหากคุณกำลังเชื่อมโยงเครื่องเสมือน)
  • ต้องเพิ่มเส้นทางในส่วนต่อประสานทั้งสองบนเราเตอร์

    route add -net 192.168.0.0/24 gw 192.168.0.1
    route add -net 192.168.1.0/24 gw 192.168.1.1
    
  • ต้องระบุเกตเวย์ท้องถิ่นสำหรับเครือข่ายระยะไกลบนเกตเวย์ทั้งสอง สิ่งนี้ทำให้คอมพิวเตอร์ในเครือข่ายท้องถิ่นรู้ว่าจะส่งแพ็คเก็ตสำหรับเครือข่ายระยะไกลได้ที่ไหน เกตเวย์ควรเป็นที่อยู่ IP ของคอมพิวเตอร์ที่จะส่งแพ็คเก็ตไปยังเครือข่ายระยะไกล

  • คอมพิวเตอร์ที่ต้องการส่งปริมาณข้อมูลระหว่างเครือข่ายจะต้องรับทราบด้วยว่าเกตเวย์ท้องถิ่นใดที่รองรับปริมาณข้อมูลเข้าและออกจากเครือข่ายระยะไกล โดยปกติจะทำผ่าน Dynamic Host Control Protocol (DHCP) อย่างไรก็ตามหากคุณต้องการใช้เกตเวย์ที่แยกต่างหากสำหรับอินเทอร์เน็ตคุณจะต้องระบุทั้งสองอย่างในคอมพิวเตอร์ที่ต้องการเข้าถึงอินเทอร์เน็ตและเครือข่ายอื่น ๆ (เช่นเกตเวย์อินเทอร์เน็ตผ่าน DHCP และเกตเวย์ของเครือข่ายอื่นผ่านเส้นทาง)
  • การส่งต่อ IP ต้องใช้งานได้ทั้งเกตเวย์
  • ต้องเปิดใช้งานการปลอม IP เพื่อให้ NAT ทำงานระหว่างเกตเวย์ได้

    modprobe iptable_nat
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    iptables -A FORWARD -i eth1 -j ACCEPT
    

    คุณอาจต้องระบุแหล่งที่มาและปลายทางเนื่องจากคุณใช้อินเทอร์เฟซเดียวกันสำหรับการปลอม:

    iptables -t nat -A POSTROUTING -i eth0 -s 192.168.0.0/24 ! -d 192.168.1.0/24 -j MASQUERADE
    

    และเกตเวย์อื่น ๆ :

    iptables -t nat -A POSTROUTING -i eth1 -s 192.168.1.0/24 ! -d 192.168.0.0/24 -j MASQUERADE   
    

    สำหรับแต่ละเกตเวย์ควรยอมรับการรับส่งข้อมูลเครือข่ายท้องถิ่นในอินเทอร์เฟซที่เหมาะสมดังนี้

    iptables -A FORWARD -i eth0 -s 192.168.0.0/24 -j ACCEPT
    

    หรือ

    iptables -A FORWARD -i eth1 -s 192.168.1.0/24 -j ACCEPT
    

มีลิงก์จำนวนมาก และคำถามที่คล้ายกันซึ่งสามารถอ้างอิงเพื่อแก้ไขปัญหาที่คุณมี

สิ่งที่ดูเหมือนจะผิดในกรณีนี้คือการตั้งค่าเส้นทางและเกตเวย์ไม่สมบูรณ์ในทั้งคอมพิวเตอร์และ Network Address Translation (NAT) ไม่ได้เปิดใช้งานโดยใช้ iptables ทำให้เกตเวย์สามารถดำเนินการตามคำขอจากคอมพิวเตอร์บนเครือข่ายย่อยอื่น ๆ ในนามของพวกเขา.

การทำเช่นนี้มีความสำคัญเช่นกันเมื่อตั้งค่าการเชื่อมต่ออินเทอร์เน็ตในขณะที่คุณรับผิดชอบการเชื่อมต่อปลายด้านหนึ่ง (เช่นการใช้คอมพิวเตอร์ Linux เป็นเกตเวย์สำหรับการเชื่อมต่อ PPPoE)

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