สวัสดีครับพี่น้อง! วันนี้ว่างๆ เลยอยากมาแชร์ประสบการณ์ที่เคยลองงมๆ กับเจ้า GRE tunnel นี่แหละ ตอนแรกได้ยินชื่อก็งงๆ นะ ว่ามันคืออะไรหว่า จะเอาไปทำอะไรได้บ้าง วันนี้เลยจะมาเล่าให้ฟังแบบบ้านๆ ตามสไตล์ผมเลยนะ
เริ่มจากความสงสัย และความจำเป็น
เรื่องของเรื่องคือตอนนั้นผมมีโปรเจกต์เล็กๆ ที่ต้องเชื่อมเน็ตเวิร์กสองที่เข้าด้วยกันครับ คืออยากให้คอมพิวเตอร์ที่อยู่อีกที่นึง มันคุยกับคอมพิวเตอร์อีกที่นึงได้แบบเหมือนอยู่ใกล้ๆ กันเลย ทั้งๆ ที่จริงๆ แล้วมันอยู่กันคนละซอย คนละตึกเลยว่างั้นเถอะ ตอนแรกก็คิดถึงพวก 加速器 นะ แต่พอไปศึกษาดูแล้ว เอ๊ะ! มันมีอีกตัวที่น่าสนใจคือ GRE tunnel นี่แหละ ดูมันจะตรงไปตรงมาดี

ลงมือศึกษาและลองผิดลองถูก
ผมก็เริ่มจากหาข้อมูลก่อนเลยครับว่า GRE (Generic Routing Encapsulation) มันทำงานยังไง สรุปง่ายๆ แบบที่ผมเข้าใจนะ มันเหมือนเราสร้าง “ท่อ” หรือ “อุโมงค์” ส่วนตัวขึ้นมาอันนึง ระหว่างเราเตอร์หรือเซิร์ฟเวอร์สองตัวที่อยู่คนละที่กัน แล้วข้อมูลอะไรก็ตามที่เราโยนเข้าไปในอุโมงค์นี้ มันก็จะวิ่งปรู๊ดไปโผล่อีกฝั่งนึง โดยไม่สนใจว่าระหว่างทางมันจะผ่านกี่เครือข่าย ผ่านอะไรมาบ้าง
เอาล่ะ พอเข้าใจคอนเซ็ปต์คร่าวๆ แล้ว ก็ถึงเวลาลงมือจริง! ผมเตรียมอุปกรณ์เลยครับ
- เราเตอร์สองตัว: ผมใช้เราเตอร์ Linux สองตัว (จริงๆ เป็น VM บนคอมพิวเตอร์ผมนี่แหละ ฮ่าๆ) ตัวนึงจำลองเป็นฝั่ง A อีกตัวเป็นฝั่ง B
- IP Address จริง: สำคัญมาก! ทั้งสองฝั่งต้องมี IP Address จริงๆ ที่มองเห็นกันได้จากอินเทอร์เน็ตนะ ไม่ใช่ IP วงในแบบ 192.168.x.x ที่ใช้กันในบ้าน
ขั้นตอนการเซ็ตอัพ (แบบฉบับผมเอง)
พอเตรียมของพร้อมแล้ว ผมก็เริ่มลุยเลยครับ ขั้นตอนที่ผมทำก็ประมาณนี้:
1. ตั้งค่าฝั่ง A (เราเตอร์ตัวแรก):
- ผมก็ล็อกอินเข้าไปที่ตัวเราเตอร์ A ก่อนเลย จากนั้นก็เริ่มสร้าง interface tunnel ขึ้นมาใหม่ ผมตั้งชื่อมันว่า
gre1
แล้วกัน จะได้ไม่งง - จากนั้นก็กำหนดว่าอุโมงค์นี้จะเชื่อมจาก IP จริงของฝั่ง A (สมมติว่าเป็น
1.1.1.1
) ไปยัง IP จริงของฝั่ง B (สมมติว่าเป็น2.2.2.2
) - พอสร้างอุโมงค์เสร็จ มันก็เหมือนเราได้ “ท่อ” เปล่าๆ มาอันนึง ทีนี้เราก็ต้องกำหนด IP Address ให้กับ “ปากท่อ” ของเราด้วย ผมกำหนด IP ภายในสำหรับอุโมงค์นี้ เป็น
10.0.0.1/24
แล้วกัน
2. ตั้งค่าฝั่ง B (เราเตอร์ตัวที่สอง):
- ทำคล้ายๆ กับฝั่ง A เลยครับ ล็อกอินเข้าไปที่เร้าเตอร์ B สร้าง interface tunnel ชื่อ
gre1
เหมือนกัน - กำหนดว่าอุโมงค์นี้เชื่อมจาก IP จริงของฝั่ง B (คือ
2.2.2.2
) ไปยัง IP จริงของฝั่ง A (คือ1.1.1.1
) - แล้วก็กำหนด IP ภายในสำหรับอุโมงค์นี้ให้อยู่ในวงเดียวกันกับฝั่ง A แต่คนละเบอร์ ผมให้เป็น
10.0.0.2/24
3. ทดสอบการเชื่อมต่ออุโมงค์:
พอตั้งค่าทั้งสองฝั่งเสร็จแล้ว ผมก็ลองสั่ง ping
จากเราเตอร์ A ไปหา IP ภายในของอุโมงค์ฝั่ง B (คือ 10.0.0.2
) แล้วก็ลอง ping
จากเราเตอร์ B ไปหา 10.0.0.1
ปรากฏว่า… ปิ๊ง! มันเจอกันได้จริงๆ ครับ! ตอนนั้นดีใจมาก เหมือนต่อท่อสำเร็จแล้ว น้ำไหลผ่านได้แล้ว ฮ่าๆ
4. กำหนด Routing (สำคัญมาก!):

ทีนี้ แค่อุโมงค์มันเชื่อมกันได้ยังไม่พอครับ เราต้องบอกให้คอมพิวเตอร์ที่อยู่ในเครือข่าย A รู้ด้วยว่า ถ้าอยากจะคุยกับคอมพิวเตอร์ในเครือข่าย B ต้องวิ่งผ่านอุโมงค์ gre1
นี้นะ แล้วก็ต้องบอกคอมพิวเตอร์ในเครือข่าย B ให้ทำเหมือนกัน
สมมติว่าเครือข่ายภายในของฝั่ง A คือ 192.168.1.0/24
และเครือข่ายภายในของฝั่ง B คือ 192.168.2.0/24
- ที่ฝั่ง A: ผมก็เพิ่ม route เข้าไปว่า ถ้าจะไปเครือข่าย
192.168.2.0/24
ให้ส่งข้อมูลไปที่10.0.0.2
(ซึ่งก็คือปลายทางของอุโมงค์ฝั่ง B) - ที่ฝั่ง B: ผมก็เพิ่ม route เข้าไปว่า ถ้าจะไปเครือข่าย
192.168.1.0/24
ให้ส่งข้อมูลไปที่10.0.0.1
(ปลายทางอุโมงค์ฝั่ง A)
ผลลัพธ์ที่ได้
หลังจากทำครบทุกขั้นตอนแล้ว ผมก็ลองเอาคอมพิวเตอร์ที่ต่ออยู่กับเราเตอร์ A (ได้ IP 192.168.1.10
) ลอง ping ไปหาคอมพิวเตอร์ที่ต่ออยู่กับเราเตอร์ B (ได้ IP 192.168.2.20
) โอ้โห! มัน ping หากันเจอเฉยเลยครับ เหมือนกับว่ามันอยู่ในวง LAN เดียวกัน ทั้งๆ ที่จริงๆ แล้วมันวิ่งผ่านอินเทอร์เน็ตและลอดอุโมงค์ GRE ที่เราสร้างขึ้นมา
ตอนนั้นรู้สึกว่ามันเจ๋งดีนะ คือมันไม่ได้ซับซ้อนอะไรมาก แต่แก้ปัญหาเรื่องการเชื่อมต่อเครือข่ายระยะไกลได้ ข้อดีของมันคือมันค่อนข้างโปร่งใสกับ protocol อื่นๆ ที่วิ่งอยู่ข้างใน คือเราจะส่งข้อมูลอะไรผ่านอุโมงค์นี้ก็ได้ ไม่ว่าจะเป็น IP ธรรมดา หรือแม้กระทั่ง routing protocol อื่นๆ เช่น OSPF หรือ EIGRP ก็ยังวิ่งผ่านได้เลย
ข้อควรจำนิดนึง: GRE tunnel เนี่ย โดยตัวมันเองมันไม่ได้มีการเข้ารหัสข้อมูลนะครับ คือถ้าใครดักข้อมูลกลางทางได้ ก็อาจจะอ่านข้อมูลเราได้ ถ้าอยากให้ปลอดภัยจริงๆ ก็อาจจะต้องทำ 加速器 (เช่น IPsec) ซ้อนทับไปบน GRE tunnel อีกทีนึง แต่วันนั้นผมแค่ต้องการเชื่อมต่อเฉยๆ ยังไม่ได้ซีเรียสเรื่องความปลอดภัยมากนัก
ก็ประมาณนี้แหละครับ ประสบการณ์ที่ผมได้ลองเล่นกับ GRE tunnel มา อาจจะดูบ้านๆ งูๆ ปลาๆ ไปบ้าง แต่ก็หวังว่าจะเป็นประโยชน์กับเพื่อนๆ ที่กำลังสงสัยว่ามันคืออะไร หรือกำลังอยากจะลองทำดูบ้างนะครับ ใครมีเทคนิคอะไรดีๆ หรือประสบการณ์อื่นๆ ก็มาแชร์กันได้นะครับ!