เอกสาร
เริ่มต้นอย่างรวดเร็ว + คำอธิบายฟังก์ชันของแต่ละส่วนและแต่ละอุปกรณ์ (อัปเดตต่อเนื่อง)
การตรวจหาเซิร์ฟเวอร์ NAT และคำแนะนำการทะลุ
บทความนี้อธิบายว่าแผงควบคุมระบุเซิร์ฟเวอร์ NAT โดยอัตโนมัติอย่างไร แยก «NAT ที่ตั้งพอร์ตได้» กับ «NAT ที่ตั้งพอร์ตไม่ได้» อย่างไร และแนะนำให้ผู้ใช้ใช้ปฏิบัติการทะลุ NAT เมื่อจำเป็นอย่างไร
เริ่มจากทำความเข้าใจก่อน: NAT คืออะไร
เซิร์ฟเวอร์ NAT คือเซิร์ฟเวอร์ที่ «มีแค่ IP เครือข่ายภายใน ไม่มี IP สาธารณะของตัวเอง» ตัวอย่างเช่น NAT VPS ราคาถูกหลายเจ้า ผู้ให้บริการให้ที่อยู่เครือข่ายภายในมา (เช่น 192.168.x.x) คุณเข้าถึงมันจากอินเทอร์เน็ตโดยตรงไม่ได้ ต้องเข้าผ่านการแมปพอร์ตที่ผู้ให้บริการจัดให้ (แมปพอร์ตสาธารณะหนึ่งไปยังเครือข่ายภายในของคุณ)
แนะนำฟังก์ชัน
หลังจากเพิ่มเซิร์ฟเวอร์ เมื่อ SSH เชื่อมต่อสำเร็จ แผงควบคุมจะตรวจอัตโนมัติว่าเครื่องนี้เป็นประเภท NAT หรือไม่ (เครื่องมีแค่ที่อยู่เครือข่ายภายใน ไม่มี IP สาธารณะของตัวเอง) เมื่อตรวจพบ NAT จะแสดงป้ายมุมเล็ก ๆ บนการ์ดเซิร์ฟเวอร์ และแสดงคำอธิบายรวมไว้ด้านบนของ «ภาพรวม» ผู้ใช้สามารถคลิกป้ายสีเหลืองเพื่อยืนยันว่าเซิร์ฟเวอร์ NAT เครื่องนี้ตั้งการส่งต่อพอร์ตได้เองในแผงของผู้ให้บริการหรือไม่ เพื่อตัดสินใจว่าจำเป็นต้องใช้ปฏิบัติการทะลุ NAT หรือไม่
ทำไมต้องแยกแยะ NAT
«IP เครือข่ายภายใน» ≠ «ต้องทะลุ» เซิร์ฟเวอร์ NAT แบ่งเป็นสองประเภท:
| ประเภท | ลักษณะ | ต้องทะลุหรือไม่ |
|---|---|---|
| NAT ที่ตั้งพอร์ตได้ | ผู้ให้บริการมีแผงแมปพอร์ตให้ ผู้ใช้แมปพอร์ตสาธารณะไปยังพอร์ตเครือข่ายภายในได้เอง | ❌ ไม่ต้อง พอร์ตจัดการเองได้ |
| NAT ที่ตั้งพอร์ตไม่ได้ | ผู้ให้บริการแมปไว้ตายตัวแค่ไม่กี่พอร์ต เช่น SSH(22) พอร์ตอื่นเข้ามาจากอินเทอร์เน็ตไม่ได้ | ✅ ต้องใช้ปฏิบัติการทะลุ NAT |
มีแค่ «NAT ที่ตั้งพอร์ตไม่ได้» เท่านั้นที่ต้องใช้ปฏิบัติการทะลุ NAT ส่วน NAT ที่ตั้งพอร์ตได้สามารถแมปพอร์ตเองได้ ใช้งานไม่ต่างจากเครื่องที่มี IP สาธารณะ จึงไม่ควรถูกเตือนซ้ำ ๆ
หลักการตรวจหา
หลังจาก SSH เชื่อมต่อสำเร็จ แผงควบคุมจะรันคำสั่งอ่านอย่างเดียว ip -4 addr show เพื่ออ่าน IP ของการ์ดเครือข่ายภายในเครื่อง แล้วตัดสินว่าทั้งหมดอยู่ในช่วงเครือข่ายภายในหรือไม่:
10.0.0.0/8172.16.0.0/12192.168.0.0/16100.64.0.0/10(CGNAT ระดับผู้ให้บริการ)127.0.0.0/8,169.254.0.0/16,0.0.0.0/8
หากมีIP ในช่วงสาธารณะแม้เพียงหนึ่งตัว จะตัดสินว่า «มี IP สาธารณะ» (ไม่ใช่ NAT) หากเป็นเครือข่ายภายในทั้งหมดจะตัดสินว่า «NAT»
> คำสั่งตรวจหาเป็นแบบอ่านอย่างเดียว ไม่แก้ไขสถานะใด ๆ ของเซิร์ฟเวอร์ ผลการตรวจจะถูกบันทึกลงฐานข้อมูล ตรวจเพียงครั้งเดียวตอนเชื่อมต่อครั้งแรก หลังจากนั้นใช้ผลเดิมซ้ำ ไม่ทำให้การเชื่อมต่อช้าลง
ตำแหน่งของป้ายและคำอธิบาย
เมื่อตรวจพบ NAT คำแนะนำจะแสดงในสองที่:
1. แท็บ «ภาพรวม» ในแผงจัดการระบบ: หลังจากคลิก «จัดการระบบ» บนการ์ดเซิร์ฟเวอร์เครื่องหนึ่งเพื่อเข้าสู่แผง แท็บแรก «ภาพรวม» จะแสดงแบนเนอร์คำแนะนำ NAT ที่ตรงกัน — เซิร์ฟเวอร์ที่ทำป้ายสีเหลืองจะแสดงคำอธิบายสีเหลือง (มีคำแนะนำการล้างป้าย) ส่วนเซิร์ฟเวอร์ที่ทำป้ายสีแดงจะแสดงคำแนะนำการทะลุสีแดง คำแนะนำจะปรากฏเฉพาะบนเซิร์ฟเวอร์ที่เชื่อมต่อตรงซึ่งเป็น NAT และยังไม่ได้ยืนยัน ไม่กินพื้นที่การ์ด
2. ป้ายมุมเล็กบนการ์ด: บนการ์ดจะเหลือเพียงป้ายเล็ก ๆ หนึ่งอัน แบ่งเป็นสามสถานะ:
| ป้าย | สี | ความหมาย | พฤติกรรมเมื่อคลิก |
|---|---|---|---|
NAT | เหลือง | ตรวจพบ NAT (IP ภายในเป็นเครือข่ายภายใน) รอการยืนยัน | เปิดกล่องยืนยัน |
ต้องทะลุ | แดง | พอร์ตเข้าถึงจากอินเทอร์เน็ตไม่ได้ ต้องทะลุ | เปิดคำแนะนำปฏิบัติการทะลุ NAT |
| (ไม่มีป้าย) | — | ยืนยันแล้วว่า «พอร์ตไม่มีปัญหา» ล้างป้ายแล้ว | — |
ป้าย NAT สีเหลืองคือสถานะ «รอการยืนยัน»: คลิกแล้วเปิดกล่องยืนยัน เลือกได้สองอย่าง:
- «พอร์ตไม่มีปัญหา ล้างป้าย» → ป้ายหายไป หลังจากนั้นไม่เตือนอีก
- «พอร์ตเข้าถึงไม่ได้ ทำป้ายเป็นต้องทะลุ» → ป้ายเปลี่ยนเป็นสีแดง แนะนำปฏิบัติการทะลุ NAT
ต้องทะลุ สีแดงคือ «คำเตือน»: คลิกแล้วไปที่ปฏิบัติการทะลุ NAT + ทะลุพอร์ตทันที
> ทำไมไม่ทำ «ตรวจจับอัตโนมัติว่าพอร์ตเข้าถึงได้หรือไม่»: เซิร์ฟเวอร์แผงควบคุมกับเซิร์ฟเวอร์เป้าหมายอาจอยู่ในศูนย์ข้อมูลเดียวกัน การตรวจของแผงควบคุมวิ่งผ่านเครือข่ายภายใน วัดว่า «ผ่าน» ไม่ได้แปลว่าผู้เยี่ยมชมภายนอกจะผ่าน ผลจึงไม่น่าเชื่อถือ ดังนั้น «ต้องทะลุ» จึงให้ผู้ใช้ทำป้ายเองในป๊อปอัปคำอธิบายสีเหลือง
ทำไมเซิร์ฟเวอร์ NAT «ใช้ไปสักพักแล้วขาดการเชื่อมต่อ»
เซิร์ฟเวอร์ NAT มี idle timeout (หมดเวลาการเชื่อมต่อว่าง) ที่เกตเวย์ของผู้ให้บริการ หลังจาก SSH เชื่อมต่อว่างไม่กี่นาที เกตเวย์จะตัดการเชื่อมต่ออย่างเงียบ ๆ (TCP half-open) โดยทั้งสองฝ่ายไม่รู้ตัว
แผงควบคุมแก้ปัญหาเบ็ดเสร็จด้วยสองข้อนี้:
1. เปิด keepalive บนการเชื่อมต่อ SSH: หลังจากสร้างการเชื่อมต่อทั้งหมด จะส่งแพ็กเก็ตคงชีพทุก 30 วินาที ทั้งป้องกันการถูกตัดเพราะ NAT ว่าง และตรวจจับการเชื่อมต่อครึ่งตายได้ทันที
2. ล้างคอนเนกชันพูลเป็นระยะ: เธรดเบื้องหลังจะปิดการเชื่อมต่อที่ว่างเกิน 2 นาทีทุก 2 นาที ป้องกันการเชื่อมต่อครึ่งตายสะสมไม่จำกัด
ข้อควรระวัง
1. การตรวจหาขึ้นอยู่กับ SSH เชื่อมต่อสำเร็จ: เมื่อเซิร์ฟเวอร์ออฟไลน์หรือรหัสผ่านผิดจะตรวจไม่ได้ และไม่แสดงป้าย
2. เซิร์ฟเวอร์ที่ไม่แสดงป้าย: เซิร์ฟเวอร์สาธารณะ มือถือ Android (Termux) อุปกรณ์ที่ทะลุแล้ว (มี tunnel_token) ล้วนไม่แสดงป้าย NAT — เพราะมันวิ่งผ่านช่องทางของตัวเองอยู่แล้ว ไม่ต้องมีคำแนะนำ NAT
3. กรณีพิเศษเหลือที่ไว้: «1:1 NAT» ที่หายากมาก (เซิร์ฟเวอร์ที่พอร์ตผ่านทั้งหมด) IP ภายในก็เป็นเครือข่ายภายใน จะถูกตรวจเป็น NAT กรณีนี้ผู้ใช้เลือก «ได้» ในกล่องยืนยันก็พอ ไม่กระทบการใช้งาน
4. ยืนยันแล้วแก้ได้: สถานะป้ายขึ้นอยู่กับการยืนยันของผู้ใช้ ปรับได้ทุกเมื่อด้วยการคลิกป้าย