มาต่อกันเรื่องที่น่าจะยาวและเข้าใจยากระดับนึง นั่นคือเรื่อง Bridge Interface
เนื่องจากบทความนี้ค่อนข้างยาว และจะมีภาพประกอบเยอะ เพื่อความเข้าใจแบบเข้าเส้นที่สุด ผมเลยจำเป็นที่จะต้องเกริ่น ในเรื่องที่เป็นความรู้ที่พื้นฐานมากๆ
เริ่มต้นจาก แนวคิดการตัดสินใจการไหลของข้อมูล หากมีอุปกรณ์ network เป็น star topology อยู่ตรงกลาง เช่น Hub / Switch / Router
- หากข้อมูล ถูกส่งออกมาถึง อุปกรณ์ แต่ไม่รู้ ว่าจะต้องถูกส่งไปไหน
:: กรณีเป็น HUB > ออกทุกพอร์ต (broadcast)
:: กรณีเป็น Switch > ออกทุกพอร์ต (broadcast)
:: กรณีเป็น Router > Drop ข้อมูลทิ้ง
ภาพอธิบายกรณี ส่งออกทุก port สาเหตุจาก ไม่รู้ว่าจะส่งไปไหน
อาจจะด้วยเหตุผล เพื่อเรียนรู้สมาชิกในเครือข่ายก่อนว่ามี Host อะไรเชื่อมต่ออยู่บ้าง (ARP Broadcast) เป็นต้น

กรณีเป็น Switch ก็เช่นเดียวกัน ถ้าไม่รู้ว่าจะไปไหน ก็ออกทุก Port เหมือน HUB
แต่ Switch จะฉลาดกว่า มี ARP Table ในการเก็บข้อมูลว่า MAC นี้อยู่ที่พอร์ตไหน
ซึ่งเป็นฐานความเข้าใจเรื่อง สมาชิกของพอร์ต ใน Unmanaged Switch ที่ผมจะเขียนไว้ในบทความนี้
Switch คืออุปกรณ์ที่มีหลายพอร์ต 4-48 Ports ต่อ 1 ตัว
1 Port ต่อ 1 Host
ถ้าแกะกล่องออกมาตอนซื้อ ทุก port ของ Switch เป็นสมาชิกเดียวกัน ไม่แยกกัน (Unmanaged นะ ย้ำอีกที)

อย่างที่บอกว่า Switch ฉลาดมากขึ้น มันเรียนรู้ MAC Address ได้ ดังนั้นถ้าผู้ส่งมี ARP Cache ในเครื่องแล้ว ว่า MAC นี้อยู่กับ IP อะไร ก็จะส่งไปยัง MAC นั้น
ทีนี้ Switch ก็รู้แล้ว ว่าสมาชิกในพอร์ต มี MAC + IP อะไรบ้าง
ดังนั้น
- หากข้อมูล "รู้" ว่าจะต้องถูกส่งไปไหน มีปลายทางเฉพาะเจาะจง
:: กรณีเป็น HUB > ออกทุกพอร์ต (broadcast)
:: กรณีเป็น Switch > ออก port นั้นที่เป็น host ปลายทางนั้น (unicast) พอร์ตเดียว
:: กรณีเป็น Router > ส่งข้อมูลไปอีกช่องทางอื่น หรือขาอื่น (interface) ที่มีเส้นทางส่งออกไปถึงปลายทางได้ (forward)

ในส่วนของ router นั้นเข้าใจไม่ยาก ก็แค่รู้จักหรือไม่รู้จัก ส่งต่อหรือไม่ส่งต่อ(drop) แค่นั้น เรื่อง router มันเกินขอบเขตไปนิดนึง เราจะขยับเข้ามาในหัวข้อในบทความนี้จะเป็นเรื่อง bridge ซึ่งเป็น Layer 2 ที่ต่ำลงมา เน้นไปที่จำนวนพอร์ตและสมาชิกพอร์ตที่เป็นเสมือน subnet เดียวกันมากกว่าครับ
การส่งข้อมูล flood ออกไปทุก port หรือเรียกว่า broadcast นั้น ดูผิวเผินบางคนอาจจะคิดว่าไม่มีประสิทธิภาพเลย มันก็ไปรบกวนพอร์ตอื่นหมดสิ , ไม่ต้องกังวลไป จริงๆแล้ว สิ่งนี้นั้นเป็นกลไกปกติของ Protocol ครับ การตะโกนถามทุกพอร์ต มีจุดประสงค์เพื่อเรียนรู้ข้อมูลบางอย่าง ของพอร์ตสมาชิก
switch ทั้ง managed และ unmagaed ก็ต้องทำแบบนี้เหมือนกัน เพื่อนทำความรู้จักกับสมาชิกในหลายๆ port
หรือกล่าวได้ว่า สมาชิกทุก port ของ unmanged switch เป็นกลุ่มเดียวกัน หรือ bridge ก็ได้
แต่แค่นี้ไม่พอ ต้องอธิบายละเอียดกว่านี้ จึงเป็นที่มาของบทความนี้
กรณีเราใช้ชีวิตแบบ ง่ายๆ โดยเรามีเร้าเตอร์ออกเนตที่บ้าน 1 ตัว แต่มันมี 1 WAN กับ 1 LAN แค่นั้น และเรามีคอม 1 NIC
Ref : NIC ย่อมาจาก Network Interface Card คือการ์ดแลน นะครับ ต่อไปจะเขียนย่อด้วย NIC
.
คอมบ้านเรามี NIC มี RJ45 1 port เสียบสาย LAN เข้า Router และออก Internet ใช้งานได้
ก็ดูสวย ปกติตามนั้น , จะเป็น Bridge ยังไงดีละ ?
ก่อนที่เราจะเข้าใจ Bridge เราจะต้องเข้าใจว่าสถานการณ์อะไร พาเรามาให้ใช้ Bridge และมันมีประโยชน์หรือผลกระทบอะไร
กรณีนี้ เราไม่มีความจำเป็นที่จะต้องใช้ bridge เลย ก็ใช้แบบนี้ไปตามปกติ

ต่อมา เรามี "เครื่องเพิ่มใน network" เช่น
- อาจจะเป็นเครื่อง "จริง" ที่วางอยู่ข้างๆ เครื่อง host ของเรา
- อาจจะเป็นเครื่องที่ "อยู่ภายใน" คอมเดิมของเรา (virtualization / container) ต่างๆ
และต้องการให้มันอยู่ในสมาชิก ของ port เดียวกัน
คราวนี้แหละเราจะต้องทำ bridge แล้ว เพราะพอร์ตเร้าเตอร์บ้านเรามันไม่พอ

สถานการณ์ข้างต้น ก็ถือว่าประหยัดดี ดูจะจบง่ายๆ
ภาพคอมจริง 2 เครื่องนี้ก็จบแค่นี้ ก็ขอให้เข้าใจ เมื่อเข้าใจแล้ว จะขอยกตัวอย่างอีกกรณี นั่นก็คือ
ถ้าวันนึง หากว่าเรามี Node / Device / Host เพิ่มขึ้นมาอีกล่ะ ?
ทำให้พอร์ตเรา ไม่พอมากขึ้นเรื่อยๆ จนพอร์ต physical มันไม่พอจริงๆ
ผมจะสมมติเหตุการณ์ง่ายๆ ในอุปกรณ์ชุดเดิมนะครับ คือที่บ้านไม่มีพอร์ต Rj45 ที่เป็น LAN Port เหลือให้เสียบอีกแล้ว
สถานการณ์ที่ผมจะสมมติในการเพิ่ม Host ก็คือ ------
ผมได้ทำการเพิ่ม VM ขึ้นมาอีก 1 เครื่อง อยู่ภายใน Host : Computer#1
นั่นแปลว่า network บ้านผมมี Host 2 Host แล้ว แต่พอร์ตมีเท่าเดิม
ทำยังไง ผมจึงจะสามารถให้ Windows 10 VM นี้สามารถเป็นสมาชิกเดียวกันกับ Subnet ของ Computer#1 ได้ ?
คำตอบก็คือ : ขั้นตอนนี้เราต้องใช้ความสามารถของ OS ครับ คือการสร้าง Bridge Interface ขึ้นมา
หลักคิดของ Bridge Interface นั้นง่ายๆ คือมันคล้ายๆกับการสร้าง Unmanaged Switch ขึ้นมาครับ
- เราต้องมองว่า Bridge เป็นพอร์ต ที่เป็น "สะพาน" รวมพอร์ตอื่นๆ เป็น "สมาชิก" เดียวกัน
- เมื่อมีหลายๆพอร์ตเป็นสมาชิกเดียวกัน มันจะถูกมองว่าเป็น Physical เดียวกัน
ถ้าเราเคยเห็น Router ที่ทาง ISP ให้เรามาใช้ Internet ที่บ้าน
เราจะพบว่ามันมีพอร์ต LAN 4 Ports
คำตอบคือ 4 Ports นี้แหละ มัน bridge กันอยู่ครับ ซึ่งเราจะไม่สามารถ ตั้งค่า IP Address ที่ LAN Port ใดๆ ได้เลย
นั่นเพราะ router ISP ที่ให้เราใช้ที่บ้านได้อำนวยความสะดวกให้กับผู้ใช้ "ทุกระดับ" ให้สามารถใช้งาน internet ได้อย่างสะดวก
ทั้งๆ ที่ ISP สามารถสั่งผลิต ทำให้ firmware ของ router บ้าน "แยกอิสระ" กันทุก port ทั้ง 4 ports ได้ แบบอุปกรณ์ยี่ห้อ Mikrotik
แต่ว่า.....หากทำแบบนั้น
เมื่อไปถึงหน้างาน ติดตั้ง internet ให้ลูกค้า ช่างจะต้องมาเซท IP ให้กับ LAN1 - LAN4 อีก วุ่นวายมาก นึกภาพตามแล้วก็ ค่อนข้างสยองกับลูกค้าหลักแสนคน
router ISP firmware ส่วนมาก 99% จึงเป็น Bridge LAN 4 Ports+DHCP Server+NAT Masquerade มาให้เราเรียบร้อย
และมักจะเป็น 4 ports คือ ไม่มากเกินไปจนต้นทุนแพงเกินติดตั้งให้ลูกค้าลำบาก หรือ ไม่น้อยเกินไป จนลูกค้าใช้งานไม่พอพอร์ต (1 LAN ก็ถือว่าน้อยไป)
เราจึงมักเห็น 4 ports เป็นมาตรฐาน เหมาะกับบ้านคนทั่วไป มากที่สุด
เสียบสาย รับ DHCP ออกเนตได้เลย ถ้าจ่ายค่าเน็ตตามปกติ !!
สมาชิกทั้ง 4 นั้น Bridge มาให้แบบเราไม่ต้องไปแตะต้องอะไรเลย นี่คือ Bridge ที่อยู่ด้านหลัง เราไม่ได้ลงมือทำเอง
ยกเว้นบางยี่ห้อ เช่น Mikrotik ซื้อมาใช้ = config ต้องเป็นด้วยนะ

เอาละ
ไปไกลแล้วกลับมาเรื่อง Windows 10 VM
ทำไงดี Windows 10 VM "เอาสายแลนเสียบไม่ได้"
แต่เราต้องการให้ Windows 10 VM อยู่ใน Subnet เดียวกับ Host OS Linux ของเรา
กระบวนการนี้คือ การเอาพอร์ต Lan ของ VM ไปเป็นสมาชิก Bridge นั่นเองครับ

แนวคิดของการใช้คำสั่งคือ
-- ดู interface ในปัจจุบันของก่อนว่า Host มองเห็นอะไรบ้าง ตีความทุก Interface ให้ออก
-- จินตนาการ หรือเอาปากกามาเขียนว่า เราจะสร้าง Bridge ขึ้นมา โดยให้พอร์ตไหน เป็นสมาชิกของ Bridge บ้าง
-- อย่าลืมถ้าเป็นระบบสำคัญต้องเตรียมทำความเข้าใจผลกระทบด้วย , network ของพอร์ตจริงจะ lost นะครับ
-- เมื่อพอร์ตนั้นเป็นสมาชิกของ bridge แล้ว เราจะบริหารจัดการผ่าน bridge เป็นหลัก ไม่ใช่พอร์ตจริงนั้นนะครับ
-- ตัดสินใจได้แล้วทำการ down link interface ของพอร์ตจริงนั้นก่อน
-- จากนั้นสร้าง bridge ขึ้นมา ซึ่ง OS มีคำสั่งรองรับอยู่แล้ว
-- เมื่อสร้าง bridge ขึ้นมาแล้ว ขั้นตอนต่อไปคือ เพิ่มสมาชิกพอร์ตจริงเข้าไปใน bridge หรือ ทำให้พอร์ตจริงเป็น slave นั่นเอง
-- สั่งให้ bridge ที่เราเพิ่งสร้าง ให้ up ขึ้นมาให้ใช้งานได้
-- ตรวจสอบอีกครั้ง เราจะพบว่า bridge interface ขึ้ันมาแล้ว
หลังจากนี้ ไม่ว่าเราจะมี VM เพิ่มมาอีกกี่ VM ใน host นี้
เราก็จะสามารถเพิ่มสมาชิกเข้า bridge ได้ไปเรื่อยๆ
เพราะโปรแกรม virtualization ทำหน้าที่ ดึง network interface ของ vm ไปเป็น slave ของ bridge ใน host เพื่อจะสามารถอยู่ใน subnet เดียวกันกับ Host ได้นั่นเองครับ
มาดูคำสั่งจริงกันครับ ,
ผมใช้ Linux OpenSuse Leap 15.6 KDE Plasma ซึ่งทำให้การจัดการ bridge ด้วย brctl ถูกแทนที่ด้วย nmcli ซึ่งเป็นชุดคำสั่งของ NetworkManager ครับ
keng@keng-leap:~> nmcli connection show
NAME UUID TYPE DEVICE
eth1 0a2dbe79-a192-4ba5-ad6c-4bada7702619 ethernet eth1
lo 8f543e38-98e1-4784-b528-a955b90b7485 loopback lo
TonLiewFamily_5G a7fcd1bd-e07e-4973-83f3-1002934cca4f wifi --
keng@keng-leap:~> sudo nmcli connection down "eth1"
[sudo] password for root:
Connection 'eth1' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
keng@keng-leap:~> sudo nmcli con add type bridge con-name br0 ifname br0
Connection 'br0' (72031475-8b9b-4d23-ab68-6429d349aad3) successfully added.
keng@keng-leap:~> sudo nmcli connection add type bridge-slave con-name br0-eth1 ifname eth1 master br0
Connection 'br0-eth1' (281433d9-c518-431c-aff4-88eed89f02dd) successfully added.
keng@keng-leap:~> sudo nmcli connection up br0
Connection successfully activated (master waiting for slaves) (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/5)
keng@keng-leap:~> ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host noprefixroute valid_lft forever preferred_lft forever
2: eth1: mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000 link/ether a8:a1:59:5f:66:a6 brd ff:ff:ff:ff:ff:ff altname enp5s0
3: wlan0: mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether 56:cf:77:6b:85:c6 brd ff:ff:ff:ff:ff:ff permaddr a8:e2:91:d0:f3:d6 altname wlp4s0
4: br0: mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether a8:a1:59:5f:66:a6 brd ff:ff:ff:ff:ff:ff
keng@keng-leap:~> nmcli connection show
NAME UUID TYPE DEVICE
br0 72031475-8b9b-4d23-ab68-6429d349aad3 bridge br0
lo 8f543e38-98e1-4784-b528-a955b90b7485 loopback lo
br0-eth1 281433d9-c518-431c-aff4-88eed89f02dd ethernet
eth1 eth1 0a2dbe79-a192-4ba5-ad6c-4bada7702619 ethernet
-- TonLiewFamily_5G a7fcd1bd-e07e-4973-83f3-1002934cca4f wifi --
keng@keng-leap:~>

อธิบายทีละคำสั่งเป็นภาษาไทย
nmcli connection show
-- ใช้ network manager แบบ cli เพื่อแสดง connection name ในปัจจุบันว่ามีอะไรบ้าง
sudo nmcli connection down "eth1"
-- สั่ง down connection ชื่อ eth1 ลง เพื่อเอาไปเตรียมเป็นสมาชิกของ bridge , network ที่ eth1 จะ lost
sudo nmcli con add type bridge con-name br0 ifname br0
-- สร้าง bridge ขึ้นมาชื่อ br0 , และชื่อ connection คือ br0 , อันนี้เป็น โครงสร้างของ bridge นะครับ เหมือนกล่อง switch เปล่าๆ ยังไม่มีสมาชิกพอร์ตอะไรเลย
sudo nmcli connection add type bridge-slave con-name br0-eth1 ifname eth1 master br0
-- ขั้นตอนนี้สำคัญที่สุด คือการเพิ่มสมาชิกพอร์ต RJ45 eth1 เข้าไปเป็นสมาชิกของ bridge โดยระบุว่า connection จะชื่ออะไร และ มันชี้ไปที่ master ไหน ,
sudo nmcli connection up br0
--- สั่งให้ br0 มีสถานะ up ขึ้นมา สมาชิกของ br0 ทุกพอร์ต จะอัพขึ้นมาหมด รวมถึง eth1 ด้วย
ip a
-- ตรวจดู network interface ใน linux
nmcli connection show
-- ตรวจดู network interface connection name ใน network manager แบบ nmcli
ทดลองทำใน VM โดยใช้ virt-manager ใส่ bridge interface ที่เราสร้างขึ้นมา

จากนั้นก็ Boot VM ขึ้นมา ปรากฎว่า อยู่ใน Subnet เดียวกันแล้ว

เพราะตั้งค่าให้เป็นสมาชิกกลุ่มพอร์ตเดียวกัน พอ Boot Windows 10 ก็ได้ 192.168.1.0/24 เหมือนกับ Linux Opensuse Leap เป็น Subnet เดียวกัน
นอกจากนี้ โปรแกรม Virtualization มักจะทำ Bridge มาให้เราอัตโนมัติเป็นส่วนใหญ่ แต่เราอาจจะไม่เข้าใจ หรือไม่ได้ตรวจสอบ configuration ให้เหมาะสมกับงานของเรา
นี่คือ Bridge ที่เราทำเอง แบบ manual เลย
ถ้าเราเข้าใจ เราจะสามารถประยุกต์ใช้เรื่องนี้กับอุปกรณ์ ทุกๆประเภท ที่อนุญาตให้เราสร้าง Interface ได้ เช่น Mikrotik RouterOS / Linux ต่างๆ / FreeBSD เป็นต้น แต่มีแต่ Linux กับ BSD ครับที่อนุญาตให้เราปรับแต่ง bridge ได้แบบลึกๆ , Windows ไม่ได้แสดงมากครับ
ขอบคุณทุกท่านที่เข้ามาอ่าน เจอกันใหม่ตอนต่อไปครับ