# Network Commands

### *iptables*

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

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

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2FGoTCBxAPqg1PzbBkKpVt%2Fiptable%20rules.png?alt=media&#x26;token=2f9e9325-124f-4663-8a4b-e960eabf3c97" alt=""><figcaption><p>ตารางที่ใช้ในการกําหนดกฏของ iptables</p></figcaption></figure>

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

1. Filter Table
2. NAT Table
3. Mangle Table
4. Raw Table

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

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

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2FxSqyCAmSWhaPPrY4VW0k%2Frouting%20flow.png?alt=media&#x26;token=63142d0d-1bd1-4fef-a140-4be27f1c2ef3" alt=""><figcaption><p>โฟลว์ชาร์ตแสดงการควบคุมการไหลของข้อมูล</p></figcaption></figure>

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

```shell-session
$ 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
```

โดยที่&#x20;

* ACCEPT คือไฟร์วอลล์จะยอมให้แพ็กเก็ต (packet) ผ่านไปยังปลายทางได้
* DROP คือไฟร์วอลล์จะทิ้งแพ็กเก็ตทันที แต่จะไม่แจ้งผู้ส่งเกี่ยวกับข้อความที่ส่งไม่สำเร็จ
* REJECT คือไฟร์วอลล์จะทิ้งแพ็กเก็ตทันที และผู้ส่งจะได้รับข้อความผ่าน ICMP ตอบกลับถึงข้อความที่ส่ง

&#x20; ไม่สำเร็จ

* QUEUE คือไฟร์วอลล์จะส่งต่อแพ็กเก็ต ไปยังส่วนระบบบนที่ติดต่อกับผู้ใช้ (userspace)
* RETURN คือไฟร์วอลล์จะหยุดการทำงานภายใน chain แล้วกลับไปยัง Chain เดิมที่เรียกก่อนหน้านี้

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

```shell-session
$ 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 ที่ถูกเปิดใช้ในระบบสมองกลฝังตัว

<table><thead><tr><th width="185">Service</th><th>Port Name</th><th>Port No.</th><th>TCP/IP Protocol</th></tr></thead><tbody><tr><td>DHCP</td><td>bootps</td><td>67</td><td>UDP</td></tr><tr><td>TFTP</td><td>tftp</td><td>69</td><td>UDP</td></tr><tr><td>NFS</td><td>sunrpc</td><td>111</td><td>UDP</td></tr><tr><td>nfs</td><td>2049</td><td>UDP</td><td></td></tr><tr><td>mountd</td><td>32700 หรือ 32772</td><td>UDP</td><td></td></tr></tbody></table>

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

```shell-session
$ sudo /etc/init.d/iptables off
```

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2FtGaaXuxDLVMlXrLIMbOU%2Ftcp%3Aip.png?alt=media&#x26;token=45d2e942-ec06-4fb4-959e-2e3f8fbaf094" alt=""><figcaption><p>รายละเอียดของโปรโตคอลในแต่ละช้ันของ TCP/IP</p></figcaption></figure>

### *NFS*

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

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2FMYP5L6mHf2LtzaJI3ien%2Fnfs.png?alt=media&#x26;token=c84641c2-162f-4bfb-822e-2c08d6db5f99" alt=""><figcaption><p>แสดงข้ันตอนการ mount พื้นที่บนเครื่อง Host ด้วยโปรโตคอล NFS</p></figcaption></figure>

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

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

```shell-session
$ 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 ที่เกี่ยวข้องทั้งหมด ด้วยคำสั่ง

```shell-session
$ 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 ไดเรกทอรีได้ ด้วยคำสั่งข้างล่าง

```shell-session
$ mount –t nfs nfs_server_Address:/rootfs/ /mnt/rfs
```
