Network Commands

iptables

iptables เป็นเครื่องมือสำคัญอีกตัวหนึ่งที่ถูกนำมาใช้ในการจัดการระบบความปลอดภัยในระบบเครือข่ายที่เรียกว่า ไฟร์วอลล์ (firewall) โดยพื้นฐานในการกำหนดการควบคุมการเข้าออกของข้อมูลนั้น ผู้ดูแลระบบหรือแม้แต่นักพัฒนาทางด้านระบบสมองกลฝังตัวควรเข้าใจโครงสร้างและหลักการทำงานของ iptables เป็นอย่างดี

ภายใน iptables นั้นมีด้วยกันหลายตาราง (tables) โดยแต่ละตารางจะประกอบไปด้วยหลายรายการที่เรียกว่า chain (ที่ iptables เตรียมมาให้แล้วหรือผู้ใช้กำหนดขึ้นเอง) และภายในแต่ละ chain จะประกอบไปด้วยข้อกำหนดการควบคุมการเข้าออกของข้อมูลที่เรียกว่า rule ดังโครงสร้างแสดงในรูปข้างล่าง

iptables จะถูกเตรียมตารางให้แล้ว 4 ตาราง (4 built-in tables) ได้แก่

  1. Filter Table

  2. NAT Table

  3. Mangle Table

  4. Raw Table

ส่วนประกอบของ iptables จะมีส่วนประกอบหลัก 3 ส่วนได้แก่

  • INPUT คือส่วนของข้อมูลที่เข้ามาสู่เครื่องคอมพิวเตอร์

  • OUTPUT คือส่วนของข้อมูลที่ออกจะเครื่องคอมพิวเตอร์

  • FORWARD คือส่วนที่ส่งต่อข้อมูลจากระบบเครือข่ายภายในสู่เครือข่ายภายนอก ซึ่งการบล็อกพอร์ตก็จะใช้ส่วนนี้เป็นหลัก

ตัวอย่างการแสดงรายละเอียดของตารางภายใน iptables

$ sudo iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
DROP       all  --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

โดยที่

  • ACCEPT คือไฟร์วอลล์จะยอมให้แพ็กเก็ต (packet) ผ่านไปยังปลายทางได้

  • DROP คือไฟร์วอลล์จะทิ้งแพ็กเก็ตทันที แต่จะไม่แจ้งผู้ส่งเกี่ยวกับข้อความที่ส่งไม่สำเร็จ

  • REJECT คือไฟร์วอลล์จะทิ้งแพ็กเก็ตทันที และผู้ส่งจะได้รับข้อความผ่าน ICMP ตอบกลับถึงข้อความที่ส่ง

ไม่สำเร็จ

  • QUEUE คือไฟร์วอลล์จะส่งต่อแพ็กเก็ต ไปยังส่วนระบบบนที่ติดต่อกับผู้ใช้ (userspace)

  • RETURN คือไฟร์วอลล์จะหยุดการทำงานภายใน chain แล้วกลับไปยัง Chain เดิมที่เรียกก่อนหน้านี้

ตัวอย่างแสดงการเปิดพอร์ตด้วยคำสั่ง iptables โดยหลักการสำคัญคือ ควรปิดพอร์ตทั้งหมดก่อนแล้วจึงค่อยเลือกเปิดพอร์ตที่ใช้ทีละพอร์ตจะเป็นวิธีที่มีความปลอดภัยที่สุด

$ IPTABLES -P FORWARD DROP      #CLOSE PORT ALL
$ IPTABLES -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
$ IPTABLES -A FORWARD -p tcp --dport 53 -j ACCEPT    #DNS
$ IPTABLES -A FORWARD -p udp --dport 53 -j ACCEPT #DNS
$ IPTABLES -A FORWARD -p udp --dport 67 -j ACCEPT #DHCP
$ IPTABLES -A FORWARD -p udp --dport 69 -j ACCEPT #TFTP
$ IPTABLES -A FORWARD -p udp --dport 111 -j ACCEPT   #NFS
$ IPTABLES -A FORWARD -p udp --dport 2049 -j ACCEPT  #NFS
$ IPTABLES -A FORWARD -p udp --dport 32700 -j ACCEPT #NFS
$ IPTABLES -A FORWARD -p tcp --dport 80 -j ACCEPT #HTTP
$ IPTABLES -A FORWARD -p tcp --dport 8080 -j ACCEPT  #HTTP
$ IPTABLES -A FORWARD -p tcp --dport 443 -j ACCEPT   #HTTPS
$ IPTABLES -A FORWARD -p tcp --dport 8443 -j ACCEPT  #HTTPS
$ IPTABLES -A FORWARD -p tcp --dport 20 -j ACCEPT #FTP
$ IPTABLES -A FORWARD -p udp --dport 20 -j ACCEPT #FTP
$ IPTABLES -A FORWARD -p tcp --dport 21 -j ACCEPT #FTP
$ IPTABLES -A FORWARD -p udp --dport 21 -j ACCEPT #FTP
$ IPTABLES -A FORWARD -p tcp --dport 22 -j ACCEPT #SSH
$ IPTABLES -A FORWARD -p tcp --dport 23 -j ACCEPT #TELNET

พอร์ตพื้นฐานที่จะถูกเปิดไว้สำหรับบอร์ดสมองกลฝังตัว เพื่อใช้ในการติดตั้ง bootloader,ลีนุกซ์คอร์เนลและ เรียก root filesystem ได้นั้นจะมีด้วยกันอย่างน้อย 4 ถึง 5 พอร์ต ได้แก่

ตารางรายการ services ที่ถูกเปิดใช้ในระบบสมองกลฝังตัว

ServicePort NamePort No.TCP/IP Protocol

DHCP

bootps

67

UDP

TFTP

tftp

69

UDP

NFS

sunrpc

111

UDP

nfs

2049

UDP

mountd

32700 หรือ 32772

UDP

ในกรณีที่ต้องการปิดการทำงานของไฟร์วอลล์ เพื่อเข้าสู่โหมดบำรุงรักษาระบบสามารถใช้คำสั่งดังต่อไปนี้

$ sudo /etc/init.d/iptables off

NFS

nfs เป็นโปรโตคอลที่ได้รับการออกแบบมาเพื่อการเชื่อมโยงทรัพยากรฮาร์ดดิสก์จากเครื่องอื่นๆที่อยู่บนเครือข่ายคอมพิวเตอร์ที่อยู่ห่างออกไปให้เป็นเสมือนระบบไฟล์ของอุปกรณ์เอง สำหรับนักพัฒนาระบบสมองกลฝังตัวแล้วการใช้งาน nfs มีผลทำให้ในระหว่างการปรับแต่งระบบปฏิบัติการ หรือการพัฒนาโปรแกรมเพื่อใช้ในระบบสมองกลฝังตัวคล่องตัวและสะดวกมากยิ่งขึ้นและไม่มีข้อจำกัดของขนาดในการเก็บข้อมูล โดยการนำไฟล์ root file system (RFS) ไปวางไว้ในไดเรกทอรีที่ถูกตั้งค่าให้เป็นไดเรอทอรีที่ถูกแชร์ผ่านโปรโตคอล NFS เนื่องจากโดยทั่วไปแล้วเมื่อนักพัฒนาได้ปรับแต่งระบบปฏิบัติการเสร็จ และพัฒนาโปรแกรมฝังเข้าไป root file system เรียบร้อยก็จะถูกนำไปเขียนลงในตัวเก็บข้อมูลที่อยู่ภายในบอร์ดสมองกลฝังตัว เช่น Flash Memory เป็นต้น

ในระบบปฏิบัติการลีนุกซ์บนระบบสมองกลฝังตัว การเชื่อมต่อระบบเข้ากับ Network File System นั้นในขั้นตอนการทำงานจะมีลักษณะเดียวกับการเชื่อมต่อของระบบปฏิบัติการลีนุกซ์โดยทั่วไป

ขั้นตอนการติดตั้ง nfs-kernel-server และตั้งค่าในไฟล์ /etc/exports ดังนี้

$ sudo apt-get install rpcbind nfs-kernel-server
$ sudo mkdir /rootfs
$ sudo vim /etc/exports
/rootfs 192.168.0.2(rw,sync,no_subtree_check,no_root_squash)
/rootfs localhost(rw,sync,no_subtree_check,no_root_squash)

ทำการเรียก service ที่เกี่ยวข้องทั้งหมด ด้วยคำสั่ง

$ sudo service xinetd restart
$ sudo service tftpd-hpa restart
$ sudo service isc-dhcp-server restart
$ sudo service rpcbind-boot stop
$ sudo service nfs-kernel-server stop
$ sudo service rpcbind-boot start
$ sudo service nfs-kernel-server start

ไฟล์ /etc/exports เป็นไฟล์ที่ได้ถูกสร้างขึ้นจากเครื่องแม่ข่าย เพื่อระบุว่าจะให้ไดเรกทอรีใดในเครื่องแม่ข่ายที่จะให้เครื่องลูกข่ายสามารถทำการ mount ไดเรกทอรีได้ ด้วยคำสั่งข้างล่าง

$ mount –t nfs nfs_server_Address:/rootfs/ /mnt/rfs

Last updated

Assoc. Prof. Wiroon Sriborrirux, Founder of Advance Innovation Center (AIC) and Bangsaen Design House (BDH), Electrical Engineering Department, Faculty of Engineering, Burapha University