หน้า 1 จากทั้งหมด 1

วิธีการเปิดไฟร์วอล iptables ใน CentOS ให้ Asterisk ผ่านได้

โพสต์โพสต์แล้ว: 16 ธ.ค. 2009 12:03
โดย voip4share
ถ้าเราติดตั้ง Asterisk บน CentOS Linux หรือ RHEL แล้วหล่ะก็ จะมีโปรแกรม Firewall ตัวหนึ่ง (ซึ่งมักจะถูก) ติดตั้งไว้อยู่แล้ว โปรแกรมไฟร์วอลนี้มีชื่อว่า "iptables" ครับ ใช้เป็นไฟร์วอลได้เลยโดยไม่ต้องซื้อไฟร์วอลมาป้องกัน Asterisk

เมื่อเราอินาเบิล iptables ขึ้นมาใช้งาน อย่าลืมเปิดพอร์ตให้ Asterisk ผ่านไปได้ด้วยนะครับทั้ง VoIP Signaling Port และ RTP Port ไม่เช่นนั้นจะมีปัญหากับการใช้งาน VoIP และก็อย่าลืมเปิดพอร์ตอื่นๆด้วยครับ เช่น TCP 22 (เป็น Secure Shell), TCP 80 (เป็น HTTP, Web Server), TCP 20, 21 (เป็น FTP Service), TCP 3306 (MySQL Server), TCP 443 (เป็น HTTPS) เป็นต้น หรือพอร์ตอื่นๆอีกที่ต้องการให้ผ่านไปได้

Re: วิธีการเปิดไฟร์วอล iptables ใน CentOS ให้ Asterisk ผ่านได้

โพสต์โพสต์แล้ว: 17 ธ.ค. 2009 21:23
โดย jubjang
1. วิธีการอินาเบิล iptables ขึ้นมาใช้งาน

เช็คก่อนครับว่าที่เครื่องมีติดตั้ง iptables ไว้หรือยัง ใช้คำสั่ง rpm -qa | grep iptables
[root@opensips ~]# rpm -qa | grep iptables
ถ้าติดตั้งไว้แล้วก็จะมีข้อความประมาณนี้ครับ
iptables-ipv6-1.3.5-4.el5
iptables-1.3.5-4.el5

ถ้าติดตั้งไว้แล้วก็จะแสดงให้เห็นครับ ถ้ายังไม่มีก็ต้องติดตั้งเพิ่มครับ ใช้คำสั่ง yum -y install iptables
ตัว iptables-ipv6 ไม่จำเป็นต้องติดตั้งครับ เพราะเป็น IPv6 แต่เราใช้แค่ IPv4 ใช้ไฟล์ล่าง iptables เฉยๆก็พอ
[root@opensips ~]# yum -y install iptables

2. ไฟล์คอนฟิก iptables
เมื่อติดตั้งแล้วจะมีไฟล์คอนฟิกของ iptables ชื่อ "iptables" อยู่ที่โฟลเดอร์ /etc/sysconfig ครับ เราแก้ไขไฟล์ๆนี้ก่อนที่จะสั่งให้ iptables ทำงาน ตัวอย่างข้อมูลในไฟล์ /etc/sysconfig/iptables เป็นตามนี้ครับ

# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT


จะเห็นว่ามีเปิดแค่ไม่กี่โปรโตคอลเองครับ เช่น ปิง (icmp), โปรโตคอลหมายเลข 50, 51, พอร์ต 631, tcp พอร์ต 22 (ssh), tcp พอร์ต 80 (http), tcp พอร์ต 443 (https) ที่เหลือก็จะถูก Reject หมด ดังนั้น VoIP ก็จะโดนด้วยครับ

การเปิด iptables เพื่อให้รองรับ VoIP ต้องเช็ค 2 ที่ครับ คือ
1. ไฟล์ /etc/asterisk/sip.conf ว่า SIP รันที่พอร์ตอะไร ปกติเป็น udp 5060 ไฟล์ /etc/asterisk/iax.conf ว่า IAX รันที่พอร์ตอะไร ปกติเป็น udp 4569
2. ไฟล์ /etc/asterisk/rtp.conf ดูว่าพอร์ต RTP มีตั้งแต่เท่าไหร่ (rtpstart) ถึงเท่าไหร่ (rtpend) เช่น
rtpstart=10000
rtpend=30000

สรุปว่าต้องมีพอร์ตที่ต้องเปิดได้แก่ udp 4569, udp 5060, udp 10000 - 30000 ครับ เอามาเขียนเป็นบรรทัดสำหรับ iptables ได้ดังนี้
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 4569 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 5060 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 10000:30000 -j ACCEPT

ถ้าคิดว่า 3 บรรทัดนี้มันเยอะไป ก็เปิดรวดเดียวตั้งแต่ 4569 - 30000 เลย เขียนเป็นบรรทัดได้ดังนี้

-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 4569:30000 -j ACCEPT

แต่จากประสบการณ์ของผมนะครับ โปรแกรม X-Lite Softphone มันใช้พอร์ตต่ำมาก จนต้องเปิดตั้งแต่ udp 1024 เป็นต้นไปถึงจะใช้งานได้ ดังนั้นบรรทัดใหม่ของเราจึงกลายเป็น

-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 1024:30000 -j ACCEPT

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

เอาหล่ะครับ ในที่สุดเราก็ได้ไฟล์ iptables ที่สมบูรณ์ดังต่อไปนี้

# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 1024:30000 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT


3. ทำให้ iptables กลายเป็นหนึ่งในเซอร์วิสบน CentOS
เมื่อติดตั้งแล้ว ทำไฟล์คอนฟิกแล้ว ต่อไปก็ทำให้รันเป็นเซอร์วิสครับ ใช้คำสั่ง chkconfig --level 35 iptables on
[root@opensips ~]# chkconfig --level 35 iptables on

4. สตาร์ท iptables
และสตาร์ท iptables ด้วยคำสั่ง service iptables start
[root@opensips ~]# service iptables start

5. มอนิเตอร์
มอนิเตอร์ว่ามีไอพีอะไรคอนเน็คมาที่เซอร์เวอร์เราบ้างและคอนเน็คมาที่พอร์ตอะไร ใช้คำสั่ง iptstate

[root@opensips ~]# iptstate