Transit ผมขอแปลว่า ตัวกลาง หล่ะกันครับ มันจะเป็นตัวกลางระหว่างโหนด 2 โหนด ทำหน้าที่ปลอมหรือแปลง Signaling, Protocol, Media, Prefix ให้ฝั่งต้นทางกับปลายทางสามารถคุยกันได้ หรือซ่อนข้อมูลที่ไม่อยากเปิดเผยให้อีกฝั่งรู้ หรือมี Gateways ที่ต้องการใช้งานแต่เป็น Private IP และต้องการให้ลูกค้าส่งเข้ามาได้ หรือบางทีมันก็ไม่ได้แปลงอะไรเลย แค่ทำหน้าที่เป็น Proxy ขวางและซ่อน IP ไว้เท่านั้น ผมขอสรุปหน้าที่ของ Transit Gateway ที่ผมเคยใช้งานเป็นดังนี้ครับ
- แปลง Codec กรณีต้นทางปลายทางรองรับคนละ Codec มันคุยกันไม่ได้ พอเอา Transit Gateway มาขวางไว้ แปลง Codec ก็คุยกันได้สบาย
- สลับลำดับของ Codec กรณีเราอยากให้ลูกค้าใช้ Codec G.729 แต่ลูกค้าคอนฟิกไม่เป็น ส่ง G.711 มาก่อน ตามด้วย G.729 ทำให้ Server เราต้องใช้ G.711 ตาม (Server เป็น Softswitch ยี่ห้ออื่นที่ไม่ใช่ Asterisk Based) ก็ใช้ Transit Gateway สลับให้
- แปลงเบอร์ (Prefix ทั้งเบอร์ต้นทางและปลายทาง) เราสามารถใช้ Transit Gateway มาแปลงเบอร์ได้ อย่างเช่น รับเบอร์ต้นทางมาเป็น 08x แต่อยากส่งเป็น 668x ก็สามารถทำได้
- แปลงโปรโตคอล SIP-H.323 เรามี SIP Server แต่ลูกค้ามี H.323 Server ก็ใช้ Transit Gateway นี้มาแปลง
- ควบคุมวัน เดือน ปี และเวลาที่จะโทรได้ บาง SIP Sever (Softswitch) ไม่รู้จักวันในสัปดาห์ แต่เรามีเร้าท์โทรได้เป็นบางช่วงเวลา เราก็เอา Transit Gateway มาควบคุม
- แปลง IP โดยเรามี VoIP Gateway อยู่ใน LAN แต่เป็น Private IP ต้องการเอามาให้บริการลูกค้าซึ่งอยู่ใน Internet ก็อาจจะมีปัญหาเรื่อง NAT หรือไม่ก็ต้องเปลี่ยน Private IP ให้เป็น Public IP (ถ้ามี IP เหลือ) เราก็เอา Transit Gateway มาแก้ปัญหาเรื่อง IP ได้
- อื่นๆอีกมากมาย
ไดอะแกรมการเชื่อมต่อ
มาดูรูปการเชื่อมต่อ Asterisk/Elastix เป็น Transit Gateway ครับ
สังเกตุว่า Elastix จะต่อกับ Internet โดยตรงนะครับ เทคนิควิธีการที่จะปกป้อง Elastix รู้วิธีไหนบ้างก็ต้องงัดเอามาใช้ให้มากที่สุดครับ ไม่งั้นรันไปไม่ถึงเดือน โดนแน่ๆ
วิธีคอนฟิก Elastix ให้ทำงานเป็น Transit Gateway
ไม่ยากครับ ง่ายมาก ทุกคนทำได้สบายๆอยู่แล้ว ผมจะคอนฟิกตามรูปไดอะแกรมต่อไปนี้
ผมจะทำตัวอย่างให้ดูเฉพาะ Signaling เป็น SIP ทั้งต้นทางและปลายทางนะครับ คือรับเข้ามาเป็น SIP และส่งออกไปก็เป็น SIP
1. คอนฟิก Trunks
คอนฟิก SIP Trunks คอยรับจาก Server_A (IP=1.1.1.1) และ Server_B (IP=2.2.2.2) ใช้เมนู Trunks ในเว็บ Elastix คอนฟิกทั้ง Inbound (USER) และ Outbound (PEER)
- โค้ด: เลือกทั้งหมด
Trunk Name = Server_A
PEER Details
host=1.1.1.1
port=5060
type=peer
insecure=port,invite
disallow=all
allow=g729
qualify=no
rtptimeout=30
rtpholdtimeout=120
dtmfmode=rfc2833
USER context = Server_A_In
USER Details
host=1.1.1.1
port=5060
type=peer
insecure=port,invite
disallow=all
allow=g729
qualify=no
rtptimeout=30
rtpholdtimeout=120
dtmfmode=rfc2833
context=termination-inbound
- โค้ด: เลือกทั้งหมด
Trunk Name = Server_B
PEER Details
host=2.2.2.2
port=5060
type=peer
insecure=port,invite
disallow=all
allow=g729
qualify=no
rtptimeout=30
rtpholdtimeout=120
dtmfmode=rfc2833
USER context = Server_B_In
USER Details
host=2.2.2.2
port=5060
type=peer
insecure=port,invite
disallow=all
allow=g729
qualify=no
rtptimeout=30
rtpholdtimeout=120
dtmfmode=rfc2833
context=termination-inbound
สังเกตุบรรทัด context นะครับ ผมตั้งชื่อเป็น
- โค้ด: เลือกทั้งหมด
termination-inbound
ไม่ต้องคอนฟิก Register String นะครับ ปล่อยไว้ตามเดิม เพราะไม่รู้จะรีจิสเตอร์กับใคร
2. คอนฟิก Dialplan ในไฟล์ /etc/asterisk/extensions_custom.conf
ก่อนทำ Dialplan ก็ต้องมาออกแบบเรื่องเบอร์กันสักนิดนึงครับ ว่า Server_A จะส่งเบอร์มารูปแบบยังไง จะรับเบอร์รูปแบบยังไง และ Server_B จะส่งเบอร์และรับเบอร์รูปแบบยังไง ซึ่งผมเอากรณีที่ใช้งานจริงมาให้ดูครับ Server_A ต้องการส่ง Traffic เข้าประเทศไทย ส่วน Server_B รับ Traffic มา Terminate ในประเทศไทย เบอร์โทรศัพท์เป็นเบอร์ในประเทศไทย
Server_A ส่งเบอร์มาแบบนี้ 255066X
เลข 2550 เป็น Prefix ครับ ส่วน 66 เป็น Country Code ของประเทศไทย สมมติว่า Server_A จะโทรหาเบอร์ผม 0851619439 เขาจะส่งเบอร์มาเป็นแบบนี้ 255066851619439 สังเกตุไม่มี 0 นำหน้า 851619439 นะครับ
ส่วน Server_B รับเบอร์เป็นแบบธรรมดาๆเลยคือ 0X ไม่มี Prefix อะไรเลย แสดงว่าผมต้องคอนฟิก Elastix ให้ส่งเบอร์ไปแบบนี้ 0851619439
;รับจาก Server_A ส่งไป Server_B
- โค้ด: เลือกทั้งหมด
[termination-inbound]
exten => _255066X.,1,Dial(SIP/0${EXTEN:7}@Server_B,60)
exten => _255066X.,n,Hangup
ขออธิบายนิดนึงครับ 0${EXTEN:6}
ถ้า Server_A ส่งเบอร์มาเป็น 255066851619439 ค่าของ EXTEN ก็จะเป็น 255066851619439
:6 คือตัดตัวเลขหน้าสุดออก 7 หลัก คือตัด 255066 ออก ก็จะได้เป็น 851619439
0 คือเติม 0 เข้าไปข้างหน้า ก็จะได้เป็น 0851619439
ทำนองเดียวกันครับ สมมติว่า Server_B ต้องการส่งคอลไปต่างประเทศบ้าง สมมติว่าโทรไป China ผ่าน Server_B
สมมติว่ารับเบอร์จาก Server_B แบบไม่มี Prefix นำหน้า มีแต่ Country Code และเบอร์ เช่น 861065321749 เบอร์สถานทูตไทยในปักกิ่ง เลข 86 เป็น Country Code ของ China
และสมมติว่า Server_A รับเบอร์แบบมี Prefix 1122 นำหน้า แสดงว่าเราส่งให้ Server_A ต้องส่งไปแบบนี้ 1122861065321749 มาดูคอนฟิก Dialplan กันครับ
;รับจาก Server_B ส่งไป Server_A
- โค้ด: เลือกทั้งหมด
[termination-inbound]
exten => _86X.,1,Dial(SIP/1122${EXTEN:0}@Server_A,60)
exten => _86X.,n,Hangup
ไม่ต้องตัดเลขข้างหน้าเบอร์ออกครับ แต่ถ้า Server_A บอกว่าไม่ต้องมี Prefix เราก็ส่งแบบนี้แทน
- โค้ด: เลือกทั้งหมด
exten => _86X.,1,Dial(SIP/${EXTEN:0}@Server_A,60)
exten => _86X.,n,Hangup
คือไม่ต้องตัดและไม่ต้องเติม รับมายังไงก็ส่งไปอย่างนั้น
3. ทดสอบ
เทสก่อนแล้วค่อยให้ลูกค้าเทสครับ จะได้ไม่หน้าแตก เน้นนะครับว่าควรจะเทสให้มันเวอร์คก่อนที่จะบอกลูกค้า
** ผมเองก็เชื่อมต่อกับผู้ให้บริการ VoIP อยู่เป็นปกติ เจ้าไหนราคาถูกกว่า คุณภาพพอรับได้ ก็จะย้ายไปใช้งานกับเจ้านั้น แต่ก่อนย้ายก็ขอเทสก่อน ปัญหาแรกที่มักจะเจอคือ เขาคอนฟิกและเชื่อมั่นในฝีมือตนเองมาก ไม่เทสก่อน คอนฟิกเสร็จก็แจ้งผมว่าคอนฟิกเสร็จแล้วเทสได้เลย ปรากฏว่าเทสแล้วไม่เวอร์ค เสียเวลาแก้คอนฟิกอยู่นานเลย บางทีเป็นวันแล้วผมยังไม่ได้ใช้งานเลย ซ้ำร้ายมือใหม่บางเจ้ายังโทษว่าฝั่งผมคอนฟิกผิดอีก ฝากไว้หน่อยนะครับท่านผู้ให้บริการ **
** สำหรับคอนฟิกแบบที่ให้ Elastix อยู่ตรงกลางระหว่าง Public IP กับ Private IP แนะนำว่าท่านต้องใส่การ์ด LAN สองใบครับ ใบนึงต่อกับ Public IP ส่วนอีกใบต่อกับ Private IP **
หวังว่าคงเป็นประโยชน์ต่อหลายๆท่านครับ
บทความที่เกี่ยวข้อง
วิธีคอนฟิก Trunks แบบ SIP บน Elastix
เริ่มต้นคอนฟิก Elastix อย่างเป็นขั้นตอน