โดย jubjang » 17 ธ.ค. 2009 21:23
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