ในบทความนี้จะกล่าวถึงวิธีการคอนฟิกลินุกซ์ให้สามารถเก็บปริมาณการใช้งาน network ที่เข้าออกเครื่องได้ โดยจะเป็นรายงาน (log) แบบค่อนข้างละเอียดคือ ดูได้ว่าแต่ละ packet ที่ส่งเข้า/ออกเครื่องนั้นมีประเภทไหนบ้าง มาจาก IP Address ต้นทาง ปลายทาง จากไหน ใช้ protocol เป็น TCP หรือ UDP และใช้ Port อะไร เช่นเป็น Web, Mail, Secure Shell
หมายเหตุ คุณสมบัตินี้จะคล้ายๆ กับการใช้งาน Netflow บนอุปกรณ์ Cisco Router
มีหลายวิธีที่สามารถทำได้ แต่ในที่นี้จะแนะนำการใช้โปรแกรม conntrack-tools จับปริมาณการใช้งาน โดย conntrack-tools ถือว่าเป็นโปรแกรม (userspace tools) ที่ติดต่อกับ Linux kernel ในส่วนของ Connection Tracking System จุดประสงค์หลักๆ ของโปรแกรมนี้จะสามารถนำไปทำเป็น High Availability stateful firewall ได้ แต่ในบทความนี้จะขอไม่กล่าวถึงการใช้งานคุณสมบัตินี้
คุณสมบัติของเครื่องที่จะสามารถคอนฟิกให้ใช้งาน conntrack-tools ได้นั้นมีดังนี้
- ใช้เวอร์ชั่น Linux kernel มากกว่า 2.6.18
- ติดตั้ง Library ชื่อ libnfnetlink, libnetfilter_conntrack
- คอนฟิกและเปิดการใช้งาน connection tracking system, nfnetlink
- ติดตั้งโปรแกรม conntrack-tools
ตัวอย่างในบทความนี้ทดสอบบน Fedora 9 ซึ่งจะติดตั้ง kernel และ Library ตามข้อกำหนดมาเรียบร้อยแล้ว สิ่งที่ต้องทำเพิ่มคือเปิดการใช้งาน Connection Tracking System และติดตั้งโปรแกรม conntrack-tools เพิ่มเติม
ตรวจสอบเครื่องก่อนลงโปรแกรมเพิ่มเติม
ตัวอย่างการตรวจสอบ kernel และ Library ก่อนลงโปรแกรมเพิ่มเติม
[root@server ~]# uname -a Linux server.nelisys.com 2.6.25-14.fc9.i686 #1 SMP Thu May 1 06:28:41 EDT 2008 i686 i686 i386 GNU/Linux
[root@server ~]# rpm -q libnfnetlink libnfnetlink-0.0.33-0.1.svn7211.fc9.i386
[root@server ~]# rpm -q libnetfilter_conntrack libnetfilter_conntrack-0.0.89-0.1.svn7356.fc9.i386
เปิดการใช้งาน Connection Tracking System
ก่อนที่โปรแกรมจะสามารถจับสถิติการใช้งานได้นั้นจำเป็นต้องเปิดคุณสมบัติ Connection Tracking System โดยในที่นี้จะคอนฟิก iptables ให้ตรวจสอบ state ทุก packet ที่วิ่งเข้าออกจากเครื่อง ดังนี้
คำเตือน ตัวอย่างไฟล์คอนฟิกของ iptables ด้านล่างนี้เป็นการอนุญาตทุก packet ให้สามารถส่งเข้าออกเครื่องนี้ได้ทั้งหมด แนะนำให้ทดสอบทำความเข้าใจใน network ที่แยกต่างหากก่อน เพื่อความปลอดภัยของเครื่อง แล้วค่อยนำไปประยุกต์ใช้งานจริง
ตัวอย่างไฟล์คอนฟิกของ iptables
[root@server ~]# cat /etc/sysconfig/iptables *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT COMMIT
ใช้คำสั่ง service เพื่อรัน iptables
[root@server ~]# service iptables start iptables: Applying firewall rules: [ OK ]
ตรวจสอบ rules ที่ถูกสร้างขึ้น
[root@server ~]# iptables -L -v -n Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 71 5388 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state NEW,RELATED,ESTABLISHED
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 64 6204 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state NEW,RELATED,ESTABLISHED
ใช้คำสั่ง lsmod เพื่อดู kernel module ที่ถูกเรียกใช้งานสำหรับการทำ Connection Tracking System
[root@server ~]# lsmod | grep con nf_conntrack_ipv4 11396 2 nf_conntrack 49748 2 nf_conntrack_ipv4,xt_state
ติดตั้งโปรแกรม conntrack-tools
สามารถดาวน์โหลดโปรแกรม conntrack-tools สำหรับติดตั้งบน Fedora 9 ได้จาก
ตัวอย่างการติดตั้งโปรแกรม conntrack-tools
[root@server ~]# rpm -ivh conntrack-tools-0.9.6-0.1.svn7382.fc9.i386.rpm Preparing... ########################################### [100%] 1:conntrack-tools ########################################### [100%]
จากการติดตั้งจะมีอยู่สองโปรแกรมคือ
– conntrackd จะรันเป็น daemon ในการเก็บปริมาณการใช้งาน network
– conntrack เป็นโปรแกรมที่ตรวจสอบไฟล์ /proc/net/ip_conntrack
ในบทความนี้เราจะใช้เฉพาะ conntrackd รันเป็น daemon
สร้างไฟล์คอนฟิกของ conntrackd
ขั้นตอนต่อไปคือการสร้างไฟล์ /etc/conntrackd/conntrackd.conf ซึ่งเป็นไฟล์คอนฟิกของ conntrackd โดยในที่นี้จะคอนฟิกให้รันอยู่ในโหมดการเก็บสถิติการใช้งาน network accounting
ตัวอย่างไฟล์คอนฟิก /etc/conntrackd/conntrackd.conf ในโหมดการเก็บสถิติการใช้งาน
[root@server ~]# cat /etc/conntrackd/conntrackd.conf # # General settings # General { # # Number of buckets in the caches: hash table # HashSize 8192
# # Maximum number of conntracks: # it must be >= $ cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max # HashLimit 65535
# # Logfile: on, off, or a filename # Default: on (/var/log/conntrackd.log) # LogFile off
# # Syslog: on, off or a facility name (daemon (default) or local0..7) # Default: off # Syslog off
# # Lockfile # LockFile /var/lock/conntrack.lock
# # Unix socket configuration # UNIX { Path /tmp/sync.sock Backlog 20 }
# # Netlink socket buffer size # SocketBufferSize 262142
# # Increase the socket buffer up to maximum if required # SocketBufferSizeMaxGrown 655355 }
Stats { # # If you enable this option, the daemon writes the information about # destroyed connections to a logfile. Default is off. # Logfile: on, off, or a filename # Default file: (/var/log/conntrackd-stats.log) # LogFile on
# # Enable connection logging via Syslog. Default is off. # Syslog: on, off or a facility name (daemon (default) or local0..7) # If you set the facility, use the same as in the General clause, # otherwise you'll get a warning message. # Syslog off }
# # Ignore traffic for a certain set of IP's: Usually # all the IP assigned to the firewall since local # traffic must be ignored, just forwarded connections # are worth to replicate # IgnoreTrafficFor { IPv4_address 127.0.0.1 # loopback }
# # Do not replicate certain protocol traffic # IgnoreProtocol { # UDP # ICMP # IGMP # VRRP # numeric numbers also valid }
รันโปรแกรม conntrackd
รันโปรแกรม conntrackd ให้เป็น daemon ของเครื่องตามตัวอย่าง
[root@server ~]# conntrackd -d
[root@server ~]# ps -ef | grep conntrackd root 17381 1 0 22:19 ? 00:00:00 conntrackd -d
ทดสอบการใช้งานและดูไฟล์ที่ถูกสร้างขึ้น
ไฟล์คอนฟิกด้านบนจะสั่งให้โปรแกรม conntrackd ที่รันเก็บสถิติไว้ในไฟล์ /var/log/conntrackd-stats.log โดยจะเก็บสถิติเมื่อมีการส่งข้อมูลสิ้นสุด (close connection) ในแต่ละ packet ที่เข้าออกเครื่อง
ตัวอย่างไฟล์ที่ถูกสร้างขึ้น
Fri Sep 19 22:24:11 2008 tcp 6 src=192.168.1.1 dst=192.168.1.9 sport=1038 dport=22 packets=15 bytes=1864 src=192.168.1.9 dst=192.168.1.1 sport=22 dport=1038 packets=12 bytes=2984 Fri Sep 19 22:24:21 2008 tcp 6 src=192.168.1.1 dst=192.168.1.9 sport=1039 dport=80 packets=5 bytes=817 src=192.168.1.9 dst=192.168.1.1 sport=80 dport=1039 packets=5 bytes=639 Fri Sep 19 22:24:25 2008 tcp 6 src=192.168.1.1 dst=192.168.1.9 sport=1043 dport=80 packets=6 bytes=917 src=192.168.1.9 dst=192.168.1.1 sport=80 dport=1043 packets=6 bytes=2784 Fri Sep 19 22:24:25 2008 tcp 6 src=192.168.1.1 dst=192.168.1.9 sport=1044 dport=80 packets=5 bytes=718 src=192.168.1.9 dst=192.168.1.1 sport=80 dport=1044 packets=4 bytes=303 Fri Sep 19 22:24:25 2008 tcp 6 src=192.168.1.1 dst=192.168.1.9 sport=1045 dport=80 packets=5 bytes=718 src=192.168.1.9 dst=192.168.1.1 sport=80 dport=1045 packets=5 bytes=342