ค้นหาเว็บไซต์

วิธีเปลี่ยนเซิร์ฟเวอร์ Linux ให้เป็นเราเตอร์เพื่อจัดการการรับส่งข้อมูลแบบคงที่และไดนามิก - ตอนที่ 10


ตามที่เราคาดหวังไว้ในบทช่วยสอนก่อนหน้าของซีรีส์ LFCE (Linux Foundation Certified Engineer) นี้ ในบทความนี้ เราจะพูดถึงการกำหนดเส้นทางการรับส่งข้อมูล IP แบบคงที่และไดนามิกกับแอปพลิเคชันเฉพาะ

ขอแนะนำโปรแกรมการรับรอง Linux Foundation

ก่อนอื่น เรามาทำความเข้าใจคำจำกัดความกันก่อน:

  1. พูดง่ายๆ ก็คือ แพ็กเก็ตเป็นหน่วยพื้นฐานที่ใช้ในการส่งข้อมูลภายในเครือข่าย เครือข่ายที่ใช้ TCP/IP เป็นโปรโตคอลเครือข่ายจะปฏิบัติตามกฎเดียวกันในการส่งข้อมูล: ข้อมูลจริงจะถูกแบ่งออกเป็นแพ็กเก็ตที่ทำจากทั้งข้อมูลและที่อยู่ที่ควรส่งไป
  2. การกำหนดเส้นทางเป็นกระบวนการของ “การนำทาง ” ข้อมูลจากต้นทางไปยังปลายทางภายในเครือข่าย
  3. การกำหนดเส้นทางแบบคงที่ ต้องใช้ชุดกฎที่กำหนดค่าด้วยตนเองซึ่งกำหนดไว้ในตารางเส้นทาง กฎเหล่านี้ได้รับการแก้ไขแล้วและใช้เพื่อกำหนดวิธีที่แพ็กเก็ตจะต้องผ่านขณะเดินทางจากเครื่องหนึ่งไปยังอีกเครื่องหนึ่ง
  4. การกำหนดเส้นทางแบบไดนามิก หรือ การกำหนดเส้นทางอัจฉริยะ (หากคุณต้องการ) หมายความว่าระบบสามารถเปลี่ยนแปลงเส้นทางที่แพ็กเก็ตติดตามโดยอัตโนมัติตามความจำเป็น

การกำหนดค่า IP และอุปกรณ์เครือข่ายขั้นสูง

แพ็คเกจ iproute มีชุดเครื่องมือสำหรับจัดการเครือข่ายและการควบคุมการรับส่งข้อมูลที่เราจะใช้ตลอดบทความนี้ เนื่องจากเป็นเครื่องมือทดแทนเครื่องมือแบบเดิม เช่น ifconfig และ เส้นทาง

ยูทิลิตี้ส่วนกลางในชุด iproute เรียกง่ายๆ ว่า ip ไวยากรณ์พื้นฐานมีดังนี้:

ip object command

โดยที่ อ็อบเจ็กต์ สามารถเป็นหนึ่งในรายการต่อไปนี้ได้ (แสดงเฉพาะออบเจ็กต์ที่พบบ่อยที่สุด - คุณสามารถอ้างอิงถึง man ip สำหรับรายการทั้งหมด):

  1. ลิงก์: อุปกรณ์เครือข่าย
  2. addr: ที่อยู่โปรโตคอล (IP หรือ IPv6) บนอุปกรณ์
  3. เส้นทาง: รายการตารางเส้นทาง
  4. กฎ: กฎในฐานข้อมูลนโยบายการกำหนดเส้นทาง

ในขณะที่ คำสั่ง แสดงถึงการกระทำเฉพาะที่สามารถทำได้บนวัตถุ คุณสามารถเรียกใช้คำสั่งต่อไปนี้เพื่อแสดงรายการคำสั่งทั้งหมดที่สามารถนำไปใช้กับวัตถุใดวัตถุหนึ่งได้:

ip object help

ตัวอย่างเช่น,

ip link help

รูปภาพด้านบนแสดงให้เห็นว่า คุณสามารถเปลี่ยนสถานะของอินเทอร์เฟซเครือข่ายได้ด้วยคำสั่งต่อไปนี้:

ip link set interface {up | down}

สำหรับตัวอย่างเพิ่มเติมของคำสั่ง 'ip' โปรดอ่านคำสั่ง 'ip' ที่มีประโยชน์ 10 คำสั่งเพื่อกำหนดค่าที่อยู่ IP

ตัวอย่างที่ 1: การปิดใช้งานและเปิดใช้งานอินเทอร์เฟซเครือข่าย

ในตัวอย่างนี้ เราจะปิดการใช้งานและเปิดใช้งาน eth1:

ip link show
ip link set eth1 down
ip link show

หากคุณต้องการเปิดใช้งาน eth1 อีกครั้ง

ip link set eth1 up

แทนที่จะแสดงอินเทอร์เฟซเครือข่ายทั้งหมด เราสามารถระบุหนึ่งในนั้นได้:

ip link show eth1

ซึ่งจะส่งคืนข้อมูลทั้งหมดสำหรับ eth1

ตัวอย่างที่ 2: การแสดงตารางเส้นทางหลัก

คุณสามารถดูตารางเส้นทางหลักปัจจุบันของคุณด้วยคำสั่งใดคำสั่งหนึ่งจาก 3 คำสั่งต่อไปนี้:

ip route show
route -n
netstat -rn

คอลัมน์แรกในเอาต์พุตของคำสั่งทั้งสามจะระบุเครือข่ายเป้าหมาย ผลลัพธ์ของการแสดง เส้นทาง ip (ตามหลังคำหลัก dev) ยังนำเสนออุปกรณ์เครือข่ายที่ทำหน้าที่เป็นเกตเวย์ทางกายภาพไปยังเครือข่ายเหล่านั้น

แม้ว่าในปัจจุบัน คำสั่ง ip จะถูกเลือกใช้มากกว่าเส้นทาง แต่คุณยังคงสามารถอ้างถึง man ip-route และ man route เพื่อดูคำอธิบายโดยละเอียดเกี่ยวกับส่วนที่เหลือ ของคอลัมน์

ตัวอย่างที่ 3: การใช้เซิร์ฟเวอร์ Linux เพื่อกำหนดเส้นทางแพ็กเก็ตระหว่างเครือข่ายส่วนตัวสองเครือข่าย

เราต้องการกำหนดเส้นทางแพ็กเก็ต icmp (ping) จาก dev2 ไปยัง dev4 และในทางกลับกันด้วย (โปรดทราบว่าเครื่องไคลเอ็นต์ทั้งสองเครื่องอยู่บนเครือข่ายต่างกัน) ชื่อของแต่ละ NIC พร้อมด้วยที่อยู่ IPv4 ที่สอดคล้องกันนั้นจะมีอยู่ในวงเล็บเหลี่ยม

สภาพแวดล้อมการทดสอบของเรามีดังนี้:

Client 1: CentOS 7 [enp0s3: 192.168.0.17/24] - dev1
Router: Debian Wheezy 7.7 [eth0: 192.168.0.15/24, eth1: 10.0.0.15/24] - dev2
Client 2: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4

มาดูตารางเส้นทางใน dev1 (กล่อง CentOS):

ip route show

จากนั้นแก้ไขเพื่อใช้ enp0s3 NIC และการเชื่อมต่อกับ 192.168.0.15 เพื่อเข้าถึงโฮสต์ในเครือข่าย 10.0.0.0/24:

ip route add 10.0.0.0/24 via 192.168.0.15 dev enp0s3

ซึ่งโดยพื้นฐานแล้วอ่านว่า “เพิ่มเส้นทางไปยังเครือข่าย 10.0.0.0/24 ผ่านอินเทอร์เฟซเครือข่าย enp0s3 โดยใช้ 192.168.0.15 เป็นเกตเวย์”

ในทำนองเดียวกันใน dev4 (กล่อง openSUSE) ไปยังโฮสต์ ping ในเครือข่าย 192.168.0.0/24:

ip route add 192.168.0.0/24 via 10.0.0.15 dev enp0s3

สุดท้ายนี้ เราจำเป็นต้องเปิดใช้งานการส่งต่อในเราเตอร์ Debian ของเรา:

echo 1 > /proc/sys/net/ipv4/ip_forward

ตอนนี้เรามาปิงกัน:

และ,

หากต้องการให้การตั้งค่าเหล่านี้คงอยู่ตลอดการบู๊ต ให้แก้ไข /etc/sysctl.conf บนเราเตอร์ และตรวจสอบว่าตัวแปร net.ipv4.ip_forward ได้รับการตั้งค่าเป็นจริงดังนี้:

net.ipv4.ip_forward = 1

นอกจากนี้ ให้กำหนดค่า NIC บนไคลเอ็นต์ทั้งสองเครื่อง (มองหาไฟล์การกำหนดค่าภายใน /etc/sysconfig/network บน openSUSE และ /etc/sysconfig/network-scripts บน CentOS – ในทั้งสองกรณีจะเรียกว่า ifcfg-enp0s3)

นี่คือไฟล์การกำหนดค่าจากกล่อง openSUSE:

BOOTPROTO=static
BROADCAST=10.0.0.255
IPADDR=10.0.0.18
NETMASK=255.255.255.0
GATEWAY=10.0.0.15
NAME=enp0s3
NETWORK=10.0.0.0
ONBOOT=yes
ตัวอย่างที่ 4: การใช้เซิร์ฟเวอร์ Linux เพื่อกำหนดเส้นทางแพ็คเกจระหว่างเครือข่ายส่วนตัวและอินเทอร์เน็ต

อีกสถานการณ์หนึ่งที่เครื่อง Linux สามารถใช้เป็นเราเตอร์ได้คือเมื่อคุณต้องการแชร์การเชื่อมต่ออินเทอร์เน็ตกับ LAN ส่วนตัว

Router: Debian Wheezy 7.7 [eth0: Public IP, eth1: 10.0.0.15/24] - dev2
Client: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4

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

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

คำสั่งแรกจะเพิ่มกฎให้กับเชน POSTROUTING ในตาราง nat (การแปลที่อยู่เครือข่าย) ซึ่งบ่งชี้ว่าควรใช้ eth0 NIC สำหรับแพ็คเกจขาออก

MASQUERADE ระบุว่า NIC นี้มี IP แบบไดนามิก และก่อนที่จะส่งแพ็กเกจไปยัง "โลกแห่งป่าเถื่อน ของอินเทอร์เน็ต ที่อยู่ต้นทางส่วนตัวของแพ็กเก็ตจะต้องเป็น เปลี่ยนเป็น IP สาธารณะของเราเตอร์

ใน LAN ที่มีโฮสต์จำนวนมาก เราเตอร์จะติดตามการเชื่อมต่อที่สร้างไว้ใน /proc/net/ip_conntrack เพื่อให้รู้ว่าจะส่งการตอบสนองจากอินเทอร์เน็ตไปที่ใด

เพียงส่วนหนึ่งของผลลัพธ์ของ:

cat /proc/net/ip_conntrack

แสดงอยู่ในภาพหน้าจอต่อไปนี้

โดยที่ต้นทาง (IP ส่วนตัวของกล่อง openSUSE) และปลายทาง (Google DNS) ของแพ็กเก็ตถูกเน้น นี่คือผลลัพธ์ของการวิ่ง:

curl linux-console.net

บนกล่อง openSUSE

อย่างที่ฉันแน่ใจว่าคุณสามารถเดาได้แล้ว เราเตอร์ใช้ 8.8.8.8 ของ Google เป็นเนมเซิร์ฟเวอร์ ซึ่งอธิบายว่าทำไมปลายทางของแพ็กเก็ตขาออกจึงชี้ไปยังที่อยู่นั้น

หมายเหตุ: แพ็คเกจขาเข้าจากอินเทอร์เน็ตนั้นได้รับการยอมรับก็ต่อเมื่อแพ็คเกจเหล่านั้นเป็นส่วนหนึ่งของการเชื่อมต่อที่สร้างไว้แล้ว (คำสั่ง #2) ในขณะที่แพ็คเกจขาออกจะได้รับอนุญาต “ออกฟรี ” (คำสั่ง #3)

อย่าลืมทำให้กฎ iptables ของคุณคงอยู่โดยทำตามขั้นตอนที่อธิบายไว้ในส่วนที่ 8 - กำหนดค่าไฟร์วอลล์ Iptables ของซีรี่ส์นี้

การกำหนดเส้นทางแบบไดนามิกด้วย Quagga

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

เครื่องมือนี้ไม่ได้จัดการการกำหนดเส้นทาง แต่จะปรับเปลี่ยนตารางเส้นทางเคอร์เนลเนื่องจากเรียนรู้เส้นทางใหม่ที่ดีที่สุดในการจัดการแพ็กเก็ต

เนื่องจากเป็นทางแยกของ zebra ซึ่งเป็นโปรแกรมที่การพัฒนาหยุดไประยะหนึ่งแล้ว จึงรักษาคำสั่งและโครงสร้างเดียวกันด้วยเหตุผลทางประวัติศาสตร์มากกว่าม้าลาย นั่นคือเหตุผลที่คุณจะเห็นการอ้างอิงถึงม้าลายมากมายตั้งแต่จุดนี้เป็นต้นไป

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

การติดตั้ง Quagga ใน Linux

วิธีติดตั้ง quagga บนการกระจายที่คุณเลือก:

aptitude update && aptitude install quagga 				[On Ubuntu]
yum update && yum install quagga 					[CentOS/RHEL]
zypper refresh && zypper install quagga 				[openSUSE]

เราจะใช้สภาพแวดล้อมเดียวกันกับตัวอย่างที่ 3 โดยมีข้อแตกต่างเพียงอย่างเดียวคือ eth0 เชื่อมต่อกับเราเตอร์เกตเวย์หลักที่มี IP 192.168.0.1

ถัดไป แก้ไข /etc/quagga/daemons ด้วย

zebra=1
ripd=1

ตอนนี้สร้างไฟล์การกำหนดค่าต่อไปนี้

/etc/quagga/zebra.conf
/etc/quagga/ripd.conf

และเพิ่มบรรทัดเหล่านี้ (แทนที่ด้วยชื่อโฮสต์และรหัสผ่านที่คุณเลือก):

service quagga restart
hostname    	dev2
password    	quagga
service quagga restart

หมายเหตุ: ripd.conf นั้นเป็นไฟล์การกำหนดค่าสำหรับ Routing Information Protocol ซึ่งให้ข้อมูลแก่เราเตอร์ว่าเครือข่ายใดบ้างที่สามารถ ไปถึงและไกลแค่ไหน (ในแง่ของจำนวนฮ็อพ)

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

chown quagga:quaggavty /etc/quagga/*.conf
chmod 640 /etc/quagga/*.conf 
ตัวอย่างที่ 5: การตั้งค่า quagga เพื่อกำหนดเส้นทางการรับส่งข้อมูล IP แบบไดนามิก

ในตัวอย่างนี้ เราจะใช้การตั้งค่าต่อไปนี้กับเราเตอร์สองตัว (อย่าลืมสร้างไฟล์การกำหนดค่าสำหรับ เราเตอร์ #2 ตามที่อธิบายไว้ก่อนหน้านี้):

ข้อสำคัญ: อย่าลืมทำการตั้งค่าต่อไปนี้ซ้ำสำหรับเราเตอร์ทั้งสองตัว

เชื่อมต่อกับม้าลาย (ฟังบนพอร์ต 2601) ซึ่งเป็นตัวกลางทางตรรกะระหว่างเราเตอร์และเคอร์เนล:

telnet localhost 2601

ป้อนรหัสผ่านที่ตั้งไว้ในไฟล์ /etc/quagga/zebra.conf จากนั้นเปิดใช้งานการกำหนดค่า:

enable
configure terminal

ป้อนที่อยู่ IP และเน็ตเวิร์กมาสก์ของ NIC แต่ละตัว:

inter eth0
ip addr 192.168.0.15
inter eth1
ip addr 10.0.0.15
exit
exit
write

ตอนนี้เราต้องเชื่อมต่อกับเทอร์มินัล RIP daemon (พอร์ต 2602):

telnet localhost 2602

ป้อนชื่อผู้ใช้และรหัสผ่านตามที่กำหนดไว้ในไฟล์ /etc/quagga/ripd.conf จากนั้นพิมพ์คำสั่งต่อไปนี้เป็นตัวหนา (เพิ่มความคิดเห็นเพื่อความกระจ่าง):

enable turns on privileged mode command.
configure terminal changes to configuration mode. This command is the first step to configuration
router rip enables RIP.
network 10.0.0.0/24 sets the RIP enable interface for the 10.0.0.0/24 network. 
exit
exit
write writes current configuration to configuration file.

หมายเหตุ: ในทั้งสองกรณี การกำหนดค่าจะถูกผนวกเข้ากับบรรทัดที่เราเพิ่มไว้ก่อนหน้านี้ (/etc/quagga/zebra.conf และ < b>/etc/quagga/ripd.conf)

สุดท้าย ให้เชื่อมต่อกับบริการ zebra บนเราเตอร์ทั้งสองตัวอีกครั้ง และสังเกตว่าแต่ละตัวมี “เรียนรู้ ” เส้นทางไปยังเครือข่ายที่อยู่ด้านหลังเราเตอร์ตัวอื่นได้อย่างไร และซึ่งเป็นการกระโดดครั้งต่อไปเพื่อไปยังจุดนั้น เครือข่ายโดยการรันคำสั่ง แสดงเส้นทาง IP:

show ip route

หากคุณต้องการลองใช้โปรโตคอลหรือการตั้งค่าอื่น คุณอาจต้องการดูเอกสารเพิ่มเติมที่ไซต์โครงการ Quagga

บทสรุป

ในบทความนี้ เราได้อธิบายวิธีการตั้งค่าการกำหนดเส้นทางแบบคงที่และไดนามิกโดยใช้เราเตอร์กล่อง Linux คุณสามารถเพิ่มเราเตอร์ได้มากเท่าที่คุณต้องการและทดลองได้มากเท่าที่คุณต้องการ อย่าลังเลที่จะติดต่อเราโดยใช้แบบฟอร์มติดต่อด้านล่าง หากคุณมีความคิดเห็นหรือคำถามใดๆ