วันศุกร์ที่ 17 ธันวาคม พ.ศ. 2553

FreeBSD : Basic user management

ระบบที่ใช้ทดสอบ FreeBSD 8.1-RELEASE amd64

- การเพิ่มบัญชีผู้ใช้ด้วยคำสั่ง adduser

FreeBSD# adduser
Username: user1
Full name: User1 Fullname
Uid (Leave empty for default):
Login group [user1]:
Login group is user1. Invite user1 into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh]:
Home directory [/home/user1]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password: (ขณะที่พิมพ์จะมองไม่เห็น)
Enter password again: (ขณะที่พิมพ์จะมองไม่เห็น)
Lock out the account after creation? [no]:
Username : user1
Password : *****
Full Name : User1 Fullname
Uid : 1002
Class :
Groups : user1
Home : /home/user1
Home Mode :
Shell : /bin/sh
Locked : no
OK? (yes/no): yes
adduser: INFO: Successfully added (user1) to the user database.
Add another user? (yes/no): no
Goodbye!

- เปลี่ยนรหัสผ่านของ user1

FreeBSD# passwd user1
Changing local password for user1
New Password: (ขณะที่พิมพ์จะมองไม่เห็น)
Retype New Password: (ขณะที่พิมพ์จะมองไม่เห็น)

- แสดงข้อมูลของ user1

FreeBSD# id user1
uid=1002(user1) gid=1002(user1) groups=1002(user1)

หรือ

FreeBSD# pw user show user1
user1:*:1002:1002::0:0:User1 Fullname:/home/user1:/bin/sh

- แก้ไขข้อมูล user1

FreeBSD# chpass user1
#Changing user information for user1.
Login: user1
Password: $1$oU.ybLTJ$V5GWxT1oXN/emCRnqgx.h0
Uid [#]: 1002
Gid [# or name]: 1002
Change [month day year]:
Expire [month day year]:
Class:
Home directory: /home/user1
Shell: /bin/sh
Full Name: User1 Fullname
Office Location:
Office Phone:
Home Phone:
Other information:

โดยจะอยู่ในรูปแบบของคำสั่ง vi


- ลบ user1 ออกจากระบบโดยคำสั่ง rmuser

FreeBSD# rmuser
Please enter one or more usernames: user1
Matching password entry:

user1:*:1002:1002::0:0:User1 Fullname:/home/user1:/bin/sh

Is this the entry you wish to remove? y
Remove user's home directory (/home/user1)? y
Removing user (user1): mailspool home passwd.

วันพฤหัสบดีที่ 16 ธันวาคม พ.ศ. 2553

Cisco, Security : banner exec และ banner motd

โจทย์ที่ต้องการ
ข้อความเตือนก่อนการ Login เข้าสู่ระบบ โดยต้องไม่บอกว่าเป็นระบบอะไร ทำอะไรอยู่ และข้อมูลอื่นๆ ที่อาจมีผลต่อความปลอดภัย

ข้อความแสดงรายละเอียดของระบบ หลังจากที่สามารถทำการ Login ได้แล้ว เช่น สถานที่ตั้งของระบบ หรือชื่อผู้ดูแลระบบ เป็นต้น

ระบบที่ใช้ทดสอบ Cisco 3660 on GNS3

ตัวอย่าง running-config

!
banner exec ^C


System Function : Core Router
System Location : Bangkok
System administrator : komkit.net

^C
banner motd ^C

!!!WARNING!!!
READ THIS BEFORE ATTEMPTING TO LOGON

This System is for the use of authorized users only. Individuals
using this computer without authority, or in excess of their authority,
are subject to having all of their activities on this system monitored
and recorded by system personnel. In the course of monitoring individuals
improperly using this system, or in the course of system maintenance,
the activities of authorized users may also be monitored. Anyone using
this system expressly consents to such monitoring and is advised that if
such monitoring reveals possible criminal activity, system personnel may
provide the evidence of such monitoring to law enforcement officials.

^C
!




ผลการทดสอบ

LocalRouter#telnet 10.0.0.1
Trying 10.0.0.1 ... Open


!!!WARNING!!!
READ THIS BEFORE ATTEMPTING TO LOGON

This System is for the use of authorized users only. Individuals
using this computer without authority, or in excess of their authority,
are subject to having all of their activities on this system monitored
and recorded by system personnel. In the course of monitoring individuals
improperly using this system, or in the course of system maintenance,
the activities of authorized users may also be monitored. Anyone using
this system expressly consents to such monitoring and is advised that if
such monitoring reveals possible criminal activity, system personnel may
provide the evidence of such monitoring to law enforcement officials.



User Access Verification

Username: komkit
Password:


System Function : Core Router
System Location : Bangkok
System administrator : komkit.net


RemoteRouter>

จากตัวอย่างจะเห็นว่า จะมีข้อความเตือนก่อนการ Login และเมื่อทำการ Login สำเร็จแล้วจึงจะเห็นข้อความอื่นๆ ที่ต้องการแสดงรายละเอียด ตามที่โจทย์ต้องการ

หมายเหตุ
หากทำการตั้งค่าของ banner motd ให้เป็นรายละเอียดของอุปกรณ์ อาจเป็นช่องทางให้ผู้บุกรุกรู้ถึงช่องทางในการบุกรุกระบบของเราได้ ดังนั้น banner motd จึงไม่ควรเป็นข้อความใดๆ ที่เป็นการเชื้อเชิญ หรือเปิดเผยข้อมูลของระบบ แต่ถ้าต้องการแสดงรายละเอียดของระบบก็ควรใส่ใน banner exec จะเหมาะสมกว่า

วันอังคารที่ 14 ธันวาคม พ.ศ. 2553

Linux : เปลี่ยนชื่อ Username และชื่อ Group

ในกรณีที่ต้องการเปลี่ยนชื่อ Login เช่น จากเดิมชื่อ user1 แต่ต้องการเปลี่ยนเป็น admin1 โดยที่ UID ยังคงเป็นหมายเลขเดิม สามารถทำได้ดังนี้

ระบบที่ใช้
OS : Ubuntu Linux 10.04.1 x64 LTS

ตรวจสอบ User เดิมด้วยคำสั่ง id
root@Linux:~# id user1
uid=1001(user1) gid=1001(user1) groups=1001(user1)


ทำการเปลี่ยนชื่อ user1 ไปเป็น admin1 ด้วยคำสั่ง usermod

root@Linux:~# usermod -l admin1 user1

ทำการตรวจสอบ User

root@Linux:~# id user1
id: user1: No such user

root@Linux:~# id admin1
uid=1001(admin1) gid=1001(user1) groups=1001(user1)

จากการตรวจสอบจะพบว่า Login ชื่อ User1 ไม่มีในระบบแล้ว ซึ่งได้เปลี่ยนเป็น admin1 แทน และยังคงใช้ uid และ Group เดิมอยู่

จากนั้นหากต้องการเปลี่ยนชื่อ Group ด้วย โดยจากเดิมชื่อ Group คือ user1 เปลียนไปเป็น admin1 แต่ยังต้องการคง Group ID ใว้เหมือนเดิม สามารถทำได้ดังนี้

root@Linux:/home# groupmod -n admin1 user1

ทำการตรวจสอบอีกครั้ง
root@Linux:/home# id admin1
uid=1001(admin1) gid=1001(admin1) groups=1001(admin1)

จะเห็นว่าทั้ง Username และ Groupname เปลี่ยนไปเป็น admin1 ตามที่ต้องการแล้ว และยังคง uid และ group id เดิมไว้


หมายเหตุ
ทั้งนี้การเปลี่ยนชื่อ Login และ Group จะไม่มีผลต่อ Configuration อื่นๆ ดังนั้นครตามไปเปลี่ยนให้เรียบร้อยด้วย เช่น Home Directory ก็ยังคงเป็น /home/user11 เหมือนเดิม

admin1:x:1001:1001:User1,,,:/home/user1:/bin/bash

ซึ่งอาจต้องทำการเปลี่ยนตาม เพื่อให้สะดวกในการใช้งาน ดังตัวอย่าง

root@Linux:~# mv /home/user1 /home/admin1

root@Linux:~# usermod -d /home/admin1 admin1

จาก 2 คำสั่งข้างต้นจะทำการเปลี่ยน Home Directory ไปเป็น /home/admin1 ตามต้องการ

admin1:x:1001:1001:User1,,,:/home/admin1:/bin/bash

วันจันทร์ที่ 13 ธันวาคม พ.ศ. 2553

Linux, Secure Shell : ระบุเวลาในการใช้งาน SSH

ในกรณีที่ต้องการระบุเวลาในการใช้งาน SSH เช่น ต้องการอนุญาตให้ user1 สามารถ Login ผ่าน SSH ได้เฉพาะวันที่จันทร์ - ศุกร์ เวลา 08.00 - 15.00 เท่านั้น ส่วนวันและเวลานอกนั้นไม่อนุญาตให้ Login ได้ เป็นต้น ซึ่งในกรณีนี้จะใช้ความสามารถของ PAM เข้ามาช่วย

ระบบที่ใช้ทดสอบ
OS : Ubuntu Linux 10.04.1 x64 LTS

โจทย์ที่ต้องการ
อนุญาตให้ user1 สามารถ login ผ่าน SSH ได้ตามเวลาที่กำหนด คือ วันจันทร์ - ศุกร์ เวลา 08.30 - 15.00 เท่านั้น

เริ่มด้วยแก้ไขไฟล์ /etc/pam.d/sshd โดยเพิ่ม

account required pam_time.so

จากนั้นแก้ไขไฟล์ /etc/security/time.conf โดยเพิ่ม

sshd;*;user1;MoTuWdThFr0830-1755

จากนั้นทำการ restart SSH

root@Linux:~# /etc/init.d/ssh restart

จากนั้นทำการทดสอบใช้งาน จะพบว่า user1 ไม่สามารถ login ได้ ส่วน user อื่นยังสามารถใช้งานได้ตามปกติ

ตัวอย่าง Log ที่เกิดขึ้นจากการ login ของ user1 นอกเวลาที่กำหนดไว้

Dec 13 18:06:34 Linux sshd[3471]: Failed password for user1 from 172.17.12.51 port 62763 ssh2

ข้อสังเกตุ
หาก user1 ได้ทำการ login ในเวลาที่กำหนด แต่ยังคง Session ไว้จนเกินเวลาที่กำหนด ระบบจะไม่ตัด Session นั้นทิ้ง

วันพุธที่ 1 ธันวาคม พ.ศ. 2553

Shell Script : expect - programmed dialogue with interactive programs

ตัวอย่างการใช้งาน expect เพื่อใช้ในการ ssh หรือ telnet แบบอัตโนมัติไปยังอุปกรณ์ที่ต้องการ และสั่งให้อุปกรณ์นั้นทำงานตามคำสั่งที่กำหนดไว้ล่วงหน้า เสมือนว่าเราเป็นพิมพ์คำสั่งเอง (ประมาณว่าทำ bot)

ระบบที่ใช้ทดสอบ
Telnet Client : Ubuntu Linux โดยเครื่องนี้จะเป็น Bot และทำการ remote ไปยังเครื่องเป้าหมาย และพิมพ์คำสั่งต่าง ตามที่ได้กำหนดไว้ก่อนแล้ว
Telnet Server : Cisco Catalyst 3560 โดยเครื่องนี้จะถูก bot ทำการ remote เข้ามาเก็บข้อมูลที่ต้องการ

ตัวอย่างโจทย์ : สมมุติว่า ต้องการเก็บข้อมูล Mac address ที่อยู่บน Interface FastEthernet 0/1 ของ Switch เป้าหมายทุกๆ 1 ชั่วโมง และเป็นแบบอัตโนมัติ

วิธีการแบบ Manual : ทำการ Telnet ไปยัง Switch ที่ต้องการ แล้วใช้คำสั่ง show mac-address-table interface fastEthernet 0/1 แล้วเก็บ Output ที่ได้ โดยวิธีการนี้ ผู้ได้รับมอบหมายต้อง Telnet เองทุกๆ 1 ชั่วโมง ดังตัวอย่าง

komkit@Linux:~$ telnet 192.168.0.1
Trying 192.168.0.1...
Connected to 192.168.0.1.
Escape character is '^]'.
User Access Verification

Username: komkit
Password:
Switch> show mac-address-table interface fastEthernet 0/1
Mac Address Table
-------------------------------------------

Vlan Mac Address Type Ports
---- ----------- -------- -----
1 001a.a026.466b DYNAMIC Fa0/1
1 001a.a026.466d DYNAMIC Fa0/1
Total Mac Addresses for this criterion: 2

Switch> exit
Connection closed by foreign host.
komkit@Linux:~$

จากวิธีการข้างต้น ผู้ดูแลระบบต้องทำการ telnet เข้าไปเองทุกๆ 1 ชั่วโมง เพื่อให้ได้ข้อมูลที่ต้องการ


วิธีการแบบอัตโนมัติ โดยใช้ expect บน Linux
แนวคิดคือ ทำเหมือนว่าเป็นคน Telnet เอง แต่ว่าจะให้ระบบ (bot) เป็นคนพิมพ์ให้
เริ่มด้วย ติดตั้ง expect

root@Linux:~# apt-get install expect

จากนั้นทำการสร้าง Script เพื่อให้ทำงานแทนเรา ดังตัวอย่าง

root@Linux:~# vi bot_telnet

#!/usr/bin/expect --
spawn telnet 192.168.0.1
expect "Username: "
send "komkit\r"
expect "pssword: "
send "TelnetPassword\r"
expect "Switch>"
send "show clock \r"
expect "Switch>"
send \r
expect "Switch>"
send "show mac-address-table interface fastEthernet 0/1 \r"
expect "Switch>"
send \r
expect "Switch>"
send exit\r
expect closed
exit 0

โดยค่าที่สนใจมีดังนี้

spawn คือ เริ่มทำงาน
expect คือ Prompt ที่สนใจ
send คือ เมื่อเจอ prompt ตาม expect ข้างต้นแล้ว ให้ส่ง Message หรือ Command เข้าไป (เหมือนว่าเรากำลังพิมพ์)
\r คือ กด Enter

ทำการ Save ไฟล์ แล้วทำการทดสอบดังนี้

root@Linux:~# expect bot_telnet
spawn telnet 192.168.0.1
Trying 192.168.0.1...
Connected to 192.168.0.1.
Escape character is '^]'.
User Access Verification

Username: komkit
Password:
Switch>show clock
12:23:09.058 GMT+7 Thu Dec 2 2010
Switch>
Switch>show mac-address-table interface fastEthernet 0/1
Mac Address Table
-------------------------------------------

Vlan Mac Address Type Ports
---- ----------- -------- -----
1 001a.a026.466b DYNAMIC Fa0/1
1 001a.a026.466d DYNAMIC Fa0/1
Total Mac Addresses for this criterion: 2
Switch>
Switch>exit
Connection closed by foreign host.
root@Linux:~#

จาก Output ดังกล่าวจะเห็นว่า เราได้ข้อมูลตามต้องการ ต่อไปก็นำ Script ดังกล่าวให้ทำงานโดย cron แล้วเก็บ Output ลงไฟล์ เช่น

1 * * * * root expect bot_telnet >> /home/komkit/Switch_MAC.log

เมื่อ Admin ต้องการดูข้อมูล ก็เข้าไปดู File ดังกล่าวได้ตลอดเวลา


วันอาทิตย์ที่ 7 พฤศจิกายน พ.ศ. 2553

Linux, FreeBSD : การเทียบเวลาผ่าน ntpdate

ตัวอย่างการใช้งานคำสั่ง ntpdate เพื่อทำการเทียบเวลากับ NTP Server

ระบบที่ทดสอบ

Ubuntu 9.10 x64

NTP Server ที่ใช้ในการทดสอบ time1.nimt.or.th และ time2.nimt.or.th

- ทำการเทียบเวลาไปที่ time1.nimt.or.th โดยใช้ ntpdate

root@Linux:~# ntpdate time1.nimt.or.th
8 Nov 01:34:50 ntpdate[8825]: adjust time server 203.185.69.60 offset -0.000742 sec

- การส่ง message ของการเทียบเวลาให้เก็บเป็น Syslog (Divert logging output)

root@Linux:~# ntpdate -s time1.nimt.or.th
root@Linux:~# tail -n 1 /var/log/syslog
Nov 8 01:43:37 Linux ntpdate[10979]: adjust time server 203.185.69.60 offset -0.004108 sec

- ทำการเทียบเวลาไปที่ time1.nimt.or.th และ time2.nimt.or.th โดยให้ ntpdate เลือกเทียบอัตโนมัติ ซึ่งในกรณีนี้ ถ้า NTP Server เครื่องใดมีปัญหา ระบบจะทำการเทียบเวลากับเครื่องที่ยังทำงานอยู่ ส่วนในกรณีที่ทั้งสองเครื่องทำงานอยู่ ระบบจะเลือกเครื่องที่มี stratum ดีกว่า และ Delay ต่ำกว่า ตามลำดับ

root@Linux:~# ntpdate time1.nimt.or.th time2.nimt.or.th
8 Nov 01:36:08 ntpdate[9354]: adjust time server 203.185.69.60 offset -0.000014 sec

- การตรวจสอบ NTP stratum และ Delay ของเครื่อง NTP server ที่สนใจ

root@Linux:~# ntpdate -q time1.nimt.or.th
server 203.185.69.60, stratum 1, offset -0.001715, delay 0.02739
8 Nov 01:38:02 ntpdate[9743]: adjust time server 203.185.69.60 offset -0.001715 sec

วันอังคารที่ 12 ตุลาคม พ.ศ. 2553

Windows, Network : Set static arp บน Windows7 เพื่อป้องกัน ARP Spoofing

ปกติการ Set static ARP โดยใช้ command

arp -s IP_address MAC_address

เมื่อเครื่อง reboot ค่าที่กำหนดไว้ก็จะหายไปด้วย ซึ่งวิธีการแก้ไขก็อาจโดยการสร้างเป็น .bat เพื่อให้ทำงานทุกครั้งที่เปิดเครื่อง แต่ในกรณีนี้จะใช้วิธี netsh โดยสามารถทำได้ดังนี้

ระบบทดสอบ
OS: Microsoft Windows 7 Professional x64

วิธีการเพิ่ม Static ARP

netsh interface ipv4 add neighbors "Local Area Connection" "192.168.100.1" "00-1e-5a-a5-2b-c7"

โดย
Local Area Connection คือ Network Interface ที่ใช้ในการเชื่อมต่อ
192.168.100.1 คือ IP address ที่สนใจ
00-1e-5a-a5-2b-c7 คือ Mac address ของ IP address ที่สนใจ

วิธีการลบ Static ARP ของจาก ARP table

netsh interface ipv4 delete neighbors "Local Area Connection" "192.168.100.1" "00-1e-5a-a5-2b-c7"


วิธีการแสดงรายการ ARP table

arp -a

หรือ

netsh interface ipv4 show neighbors

หรือ

netsh interface ipv4 show neighbors "Local Area Connection"

ทดสอบโดยการ reboot พบว่า ARP ยังคงอยู่ในระบบ

วันจันทร์ที่ 20 กันยายน พ.ศ. 2553

SNMP : ตัวอย่างการเรียกดูข้อมูลของเครื่องเป้าหมายผ่าน Protocol SNMP

ในกรณีที่เราเปิดการใช้งาน SNMP ไว้ แต่ไม่มีการป้องกันการเข้าถึงนั้น อาจทำเป็นช่องโหว่ทำให้ผู้บุกรุกเข้ามาหาข้อมูลเพื่อบุกรุกเครื่องเราได้ (FootPrinting) ดังตัวอย่าง

กำหนดให้

Target OS : Microsoft Windows 7
HostName = MSW-server
snmp-community string = MyServer

Hacker OS : Ubuntu 9.10
HostName = hacker-server


hacker-server$ snmwalk -v 2c -c MyServer MSW-server system

SNMPv2-MIB::sysDescr.0 = STRING: Hardware: x86 Family 15 Model 72 Stepping 2 AT/AT COMPATIBLE - Software: Windows Version 6.1 (Build 7600 Multiprocessor Free)
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.311.1.1.3.1.1
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (1013543) 2:48:55.43
SNMPv2-MIB::sysContact.0 = STRING: admin@MSW-server
SNMPv2-MIB::sysName.0 = STRING: Windows-Server
SNMPv2-MIB::sysLocation.0 = STRING: Secure, IDC
SNMPv2-MIB::sysServices.0 = INTEGER: 79

จากตัวอย่างข้างต้นจะเห็นว่า สามารถเรียกดูข้อมูลของ OS ได้ จากนั้นลองทดสอบเรียกดูว่าเครื่องเป้าหมายติดตั้งโปรแกรมอะไรบ้าง

hacker-server$ snmpwalk -v 2c -c MyServer MSW-server SWInstalledName
HOST-RESOURCES-MIB::hrSWInstalledName.1 = STRING: "Vuze"
HOST-RESOURCES-MIB::hrSWInstalledName.2 = STRING: "Adobe AIR"
HOST-RESOURCES-MIB::hrSWInstalledName.3 = STRING: "Adobe Flash Player 10 ActiveX"
HOST-RESOURCES-MIB::hrSWInstalledName.4 = STRING: "Adobe Flash Player 10 Plugin"
HOST-RESOURCES-MIB::hrSWInstalledName.5 = STRING: "aMSN 0.98.3"
HOST-RESOURCES-MIB::hrSWInstalledName.6 = STRING: "avast! Free Antivirus"
HOST-RESOURCES-MIB::hrSWInstalledName.7 = STRING: "BitComet 0.70"
HOST-RESOURCES-MIB::hrSWInstalledName.8 = STRING: "Cisco Packet Tracer 5.3"
HOST-RESOURCES-MIB::hrSWInstalledName.9 = STRING: "Foxit Reader"
HOST-RESOURCES-MIB::hrSWInstalledName.10 = STRING: "GNS3 0.7.2"
HOST-RESOURCES-MIB::hrSWInstalledName.11 = STRING: "K-Lite Mega Codec Pack 5.9.0"
HOST-RESOURCES-MIB::hrSWInstalledName.12 = STRING: "Microsoft .NET Framework 4 Client Profile"
HOST-RESOURCES-MIB::hrSWInstalledName.13 = STRING: "Microsoft Visual J# 2.0 Redistributable Package - SE"

จากผลลัพธ์จะเห็นว่า สามารถแสดงรายชื่อ Software ที่อยู่บนเครื่องเป้าหมายได้
ดังนั้นในการใช้งาน SNMP ควรมีการป้องกันระบบให้ดี

FreeBSD, MRTG : การติดตั้ง MRTG เพื่อดูปริมาณการใช้งาน Network Traffic

ระบบที่ใช้

OS : FreeBSD 8.1 amd64

เริ่มด้วยการติดตั้ง snmpd ก่อน

server# cd /usr/ports/net-mgmt/net-snmp
server# make install
server# rehash

สร้างไฟล์ Configuration ของ SNMP

server# mkdir /etc/snmp
server# echo "rocommunity myServer" > /etc/snmp/snmpd.conf

เพิ่มบรรทัดต่อไปนี้เข้าไปใน /etc/rc.conf

snmpd_enable="YES"
snmpd_conffile="/etc/snmp/snmpd.conf"

สั่ง start SNMP โดย

server# /usr/local/etc/rc.d/snmpd start

ทดสอบการใช้งาน SNMP โดย

server# snmpwalk -v 2c -c myServer 127.0.0.1

ถ้าได้ output ที่ไม่ใช่ Error ออกมาก็เป็นอันใช้ได้

ต่อไปติดตั้ง MRTG

server# cd /usr/ports/net-mgmt/mrtg
server# make install
server# rehash

จากนั้นทำการสร้าง MRTG Configuration file ดังนี้

server# cfgmaker --global 'WorkDir: /www/mrtg' \
--global 'Options[_]: growright,bits' \
--output /usr/local/etc/mrtg/127.0.0.1.cfg \
myServer@127.0.0.1

หลังจากได้ Configuration file แล้ว ก็ทำการสั่งให้ MRTG ไปเก็บค่า snmp ตามที่ต้องการ ดังนี้

server# mrtg /usr/local/etc/mrtg/127.0.0.1.cfg

ทั้งนี้ เนื่องจากเป็นการใช้งานครั้งแรก อาจมี error อยู่ ซึ่งอาจต้องสั่งซ้ำๆ 2-3 ครั้ง เพื่อให้ error หมดไป ซึ่งเมื่อ error หมดไปแล้ว จะได้ output ไปอยู่ที่ /www/mrtg ตามที่ได้กำหนดไว้ในขั้นสร้างไฟล์ Configuration ซึ่งจะเรียกดู output ผ่าน web browser ตามปกติ

จากนั้นกำหนดให้ MRTG ทำงานทุกๆ 5 นาที โดยไปกำหนดที่ /etc/crontab ดังนี้

*/5 * * * * root /usr/local/bin/mrtg /usr/local/etc/mrtg/127.0.0.1.cfg

วันพฤหัสบดีที่ 2 กันยายน พ.ศ. 2553

Linux, Network : เปลี่ยนชื่อ Network Interface

ในกรณีที่ใช้ Linux มาทำเป็น Firewall นั้น บางทีจะอยากจะเปลี่ยนชื่อของ Network Interface ให้ตรงกับ Zone ในใช้งาน เพื่อให้ง่ายในการจดจำ ในกรณีที่มีหลาย Interface เช่น จากเดิม eth0 ก็ไปเป็น wan เป็นต้น

ระบบที่ทดสอบ

OS : Ubuntu Linux 10.04.1 LTS

กำหนดให้
eth0 --> wan
eth1 --> lan
eth2 --> wireless
eth3 --> dmz

ระบบเดิม
root@server:~# ifconfig -a
eth0 Link encap:Ethernet HWaddr 00:14:22:15:eb:ed
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Base address:0xccc0 Memory:df8e0000-df900000

eth1 Link encap:Ethernet HWaddr 00:14:22:15:eb:ee
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Base address:0xbcc0 Memory:df6e0000-df700000

eth2 Link encap:Ethernet HWaddr 00:01:02:58:ed:ca
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:37 Base address:0xc00

eth3 Link encap:Ethernet HWaddr 00:04:76:21:ac:96
inet addr:172.17.12.55 Bcast:172.17.12.255 Mask:255.255.255.0
inet6 addr: fe80::204:76ff:fe21:ac96/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:359 errors:0 dropped:0 overruns:1 frame:0
TX packets:173 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:33463 (32.6 KB) TX bytes:22815 (22.2 KB)
Interrupt:39 Base address:0xec00

ขั้นตอนการเปลี่ยน
ให้แก้ไขที่ไฟล์ /etc/udev/rules.d/70-persistent-net.rules โดยก่อนการแก้ไข ควร backup ไฟล์นี้ไว้ก่อน

root@server:/etc/udev/rules.d# cp 70-persistent-net.rules 70-persistent-net.rules.backup

จากนั้นมาดูเนื้อหาในไฟล์นี้ก่อนว่ามีอะไรน่าสนใจบ้าง

root@server:/etc/udev/rules.d# cat 70-persistent-net.rules

# This file was automatically generated by the /lib/udev/write_net_rules
# program run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single line.

# PCI device 0x8086:0x1076 (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:14:22:15:eb:ed", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x8086:0x1076 (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:14:22:15:eb:ee", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

# PCI device 0x10b7:0x9200 (3c59x)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:01:02:58:ed:ca", ATTR{type}=="1", KERNEL=="eth*", NAME="eth2"

# PCI device 0x10b7:0x9200 (3c59x)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:04:76:21:ac:96", ATTR{type}=="1", KERNEL=="eth*", NAME="eth3"


จาก output จะเห็นว่า จะมีการ map หมายเลขของ MAC address เช่น ATTR{address}=="00:04:76:21:ac:96" ---> NAME="eth3"
ซึ่งเราจะมาทำการแก้ตรงนี้แหละ

root@server:/etc/udev/rules.d# vi 70-persistent-net.rules

# This file was automatically generated by the /lib/udev/write_net_rules
# program run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single line.

# PCI device 0x8086:0x1076 (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:14:22:15:eb:ed", ATTR{type}=="1", KERNEL=="eth*", NAME="wan" <--- แก้เป็น wan จากเดิม eth0

# PCI device 0x8086:0x1076 (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:14:22:15:eb:ee", ATTR{type}=="1", KERNEL=="eth*", NAME="lan" <--- แก้เป็น lan จากเดิม eth1

# PCI device 0x10b7:0x9200 (3c59x)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:01:02:58:ed:ca", ATTR{type}=="1", KERNEL=="eth*", NAME="wireless" <--- แก้เป็น wireless จากเดิม eth2

# PCI device 0x10b7:0x9200 (3c59x)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:04:76:21:ac:96", ATTR{type}=="1", KERNEL=="eth*", NAME="dmz" <--- แก้เป็น dmz จากเดิม eth3

จากนั้นให้ทำการแก้ไข network configuration เพื่อให้รู้จักชื่อ Interface ใหม่

root@server# vi /etc/network/interfaces

auto lo
iface lo inet loopback

# The primary network interface
auto dmz <--- แก้เป็น dmz จากเดิม eth3
iface dmz inet static <--- แก้เป็น dmz จากเดิม eth3
address 172.17.12.55
netmask 255.255.255.0
gateway 172.17.12.1


เมื่อตรวจสอบเรียบร้อยแล้ว ก็ reboot เครื่อง
และเมื่อเครื่อง boot เสร็จแล้ว ก็ทำการตรวจสอบผลงานซะหน่อย

root@server:/# ifconfig -a
dmz Link encap:Ethernet HWaddr 00:04:76:21:ac:96
inet addr:172.17.12.55 Bcast:172.17.12.255 Mask:255.255.255.0
inet6 addr: fe80::204:76ff:fe21:ac96/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3135 errors:0 dropped:0 overruns:1 frame:0
TX packets:1038 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:317387 (309.9 KB) TX bytes:171021 (167.0 KB)
Interrupt:39 Base address:0xcc00

lan Link encap:Ethernet HWaddr 00:14:22:15:eb:ee
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Base address:0xbcc0 Memory:df6e0000-df700000

wan Link encap:Ethernet HWaddr 00:14:22:15:eb:ed
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Base address:0xccc0 Memory:df8e0000-df900000

wireless Link encap:Ethernet HWaddr 00:01:02:58:ed:ca
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:37 Base address:0xec00

root@server:/# ethtool dmz

Settings for dmz:
Supported ports: [ TP MII ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
Advertised auto-negotiation: Yes
Speed: 100Mb/s
Duplex: Full
Port: MII
PHYAD: 24
Transceiver: internal
Auto-negotiation: on
Current message level: 0x00000001 (1)
Link detected: yes

ทดสอบด้วย iptables

root@server:/# iptables -A INPUT -i dmz -j ACCEPT
root@server:/# iptables -A INPUT -i lan -j ACCEPT
root@server:/#
root@server:/# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 796 packets, 64226 bytes)
pkts bytes target prot opt in out source destination
57 4308 ACCEPT all -- dmz * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- lan * 0.0.0.0/0 0.0.0.0/0


แต่เมื่อทดสอบด้วย
mii-tool กลับไม่รู้จักซะงั้น (ไม่เป็นไร พอรับได้)
root@server:/# mii-tool
no MII interfaces found


หมายเหตุ การเปลี่ยนชื่อ interface นั้นอาจทำให้ Application บางตัวที่สนใจแต่ชื่อ eth มีปัญหาได้ ดังนั้นควรตรวจสอบให้ดีก่อนใช้งานในระบบจริง (แต่เท่าที่ผมทดสอบในระบบของผม ไม่พบปัญหา)

วันจันทร์ที่ 30 สิงหาคม พ.ศ. 2553

Linux, iptables : การแสดงลำดับของกฎของ iptables และการแทรกกฎไปที่บรรทัดที่ต้องการ

ระบบทีใช้ทดสอบ
OS : Ubuntu 8.04.4 LTS
Kernel Version : 2.6.24-28

ตัวอย่าง

การเรียกดูกฎของ iptables ในตาราง INPUT พร้อมให้แสดงลำดับที่ของกฎด้วย

root@server:~# iptables -nvL INPUT --line
Chain INPUT (policy DROP 48 packets, 4520 bytes)
num pkts bytes target prot opt in out source destination
1 348 25568 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 249 18956 ACCEPT all -- * * 172.17.12.0/24 0.0.0.0/0
3 0 0 ACCEPT all -- * * 192.168.0.0/24 0.0.0.0/0
4 0 0 ACCEPT all -- * * 192.168.10.0/24 0.0.0.0/0
5 0 0 ACCEPT all -- * * 192.168.200.0/24 0.0.0.0/0


ต้องการแทรกกฎ DROP บาง IP เข้าไปในแถวที่ 4 (ก่อน ACCEPT 192.168.10.0/24 )

root@server:~# iptables -I INPUT 4 -s 192.168.10.100 -j DROP

root@server:~# iptables -nvL INPUT --line
Chain INPUT (policy DROP 48 packets, 4520 bytes)
num pkts bytes target prot opt in out source destination
1 449 32676 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 250 19192 ACCEPT all -- * * 172.17.12.0/24 0.0.0.0/0
3 0 0 ACCEPT all -- * * 192.168.0.0/24 0.0.0.0/0
4 0 0 DROP all -- * * 192.168.10.100 0.0.0.0/0
5 0 0 ACCEPT all -- * * 192.168.10.0/24 0.0.0.0/0
6 0 0 ACCEPT all -- * * 192.168.200.0/24 0.0.0.0/0


ต้องการลบกฎแถวที่ 4 ตามตัวอย่างข้างบนออก

root@server:~# iptables - D INPUT 4

root@staff-fw:~# iptables -nvL INPUT --line
Chain INPUT (policy DROP 224 packets, 21764 bytes)
num pkts bytes target prot opt in out source destination
1 509 37952 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 276 23686 ACCEPT all -- * * 172.17.12.0/24 0.0.0.0/0
3 0 0 ACCEPT all -- * * 192.168.0.0/24 0.0.0.0/0
4 0 0 ACCEPT all -- * * 192.168.10.0/24 0.0.0.0/0
5 0 0 ACCEPT all -- * * 192.168.200.0/24 0.0.0.0/0

วันเสาร์ที่ 21 สิงหาคม พ.ศ. 2553

ค้นหา Serial Number หรือ Service Tag ของเครื่อง Server ผ่าน Command Line

ในการเก็บข้อมูล Serial number หรือ Service Tag (สำหรับ Dell) ของเครื่อง Server นั้น ส่วนมากจะแปะบอกไว้ที่เครื่อง ซึ่งถ้าเราอยู่ใกล้ ก็เดินไปดู แต่ถ้าอยู่ไกล เช่น อยู่ต่างจังหวัด หรือต่างประเทศ คงลำบากในการตามจด วันนี้จึงลองเสนอวิธีดู Serial number หรือ Service Tag ผ่าน Command Line (ได้ผลดีกับเครื่อง Brand name เช่น Dell, HP)

ระบบที่ใช้ทดสอบ FreeBSD, Ubuntu, CentOS

CentOS# dmidecode | more
--- ตัด output ---
System Information
Manufacturer: Dell Inc.
Product Name: PowerEdge 2950
Version: Not Specified
Serial Number: 2Gxxxxx <------ Dell Service Tag
UUID: 44454C4C-4700-104B-8036-B2C04xxxxxxx
Wake-up Type: Power Switch
SKU Number: Not Specified
Family: Not Specified
--- ตัด output ---


FreeBSD# dmidecode | more
SMBIOS 2.6 present.
123 structures occupying 3313 bytes.
Table at 0xDF7FE000.

Handle 0x0000, DMI type 0, 24 bytes
BIOS Information
Vendor: Hewlett-Packard
Version: P62
Release Date: 03/27/2009
Address: 0xF0000
Runtime Size: 64 kB
ROM Size: 8192 kB
---- ตัด output ------
System Information
Manufacturer: Hewlett-Packard
Product Name: ProLiant DL380 G6
Version: Not Specified
Serial Number: SGH926xxxx
UUID: 33343934-3932-4753-4839-32xxxxxxxxxx
Wake-up Type: Power Switch
SKU Number: 494xxx-xxx
Family: ProLiant
----- ตัด output ------

วันอาทิตย์ที่ 15 สิงหาคม พ.ศ. 2553

FreeBSD, SSH : block การเข้าถึงบริการ SSH โดยใช้ hosts.allow

ในกรณีที่เราพบว่าเครื่องให้บริการถูกโจมตีโดยความพยายามเดาสุ่มรหัสผ่าน ดังตัวอย่าง Log

Aug 16 11:12:09 FreeBSD sshd[20296]: Failed keyboard-interactive/pam for root from 172.17.12.51 port 55095 ssh2
Aug 16 11:12:10 FreeBSD sshd[20296]: error: PAM: authentication error for root from 172.17.12.51
Aug 16 11:12:10 FreeBSD sshd[20296]: Failed keyboard-interactive/pam for root from 172.17.12.51 port 55095 ssh2
Aug 16 11:12:10 FreeBSD sshd[20296]: error: PAM: authentication error for root from 172.17.12.51
Aug 16 11:12:10 FreeBSD sshd[20296]: Failed keyboard-interactive/pam for root from 172.17.12.51 port 55095 ssh2
Aug 16 11:12:18 FreeBSD sshd[20304]: error: PAM: authentication error for root from 172.17.12.51
Aug 16 11:12:18 FreeBSD last message repeated 3 times

จาก Log ก็เห็นว่าเครื่อง IP 172.17.12.51 พยายามที่จะเดา password เข้ามา ดังนั้นถ้าเราต้องการไม่ให้ IP ดังกล่าว สามารถทำอย่างนั้นได้อีก จึงจำเป็นต้องมีการ Block การเข้าถึง SSH ซึ่งอาจใช้ผ่าน Firewall เช่น ipfw ก็ได้

แต่ถ้ามี host ที่พยายามเข้าถึงเป็นจำนวนมาก การที่ block ผ่าน ipfw อาจเกิดความยุ่งยากในการจัดการ ดังนั้นจึงจะมาใช้วิธี block ผ่าน hosts.allow ของ FreeBSD แทน ดังนี้

สร้างไฟล์เก็บ IP Blacklist ดังตัวอย่าง

สร้างไฟล์ /root/sshd.blacklist

172.17.1.1 <---- block เป็นราย IP
172.17.12.0/255.255.255.0
<----- block ทั้ง Subnet /24 แก้ไขไฟล์ /etc/hosts.allow โดยหาแถวที่เขียนว่า ALL : ALL : allow แล้วเพิ่ม sshd : /root/sshd.blacklist : deny ไว้ข้างบน ดังนี้

sshd : /root/sshd.blacklist : deny
ALL : ALL : allow

ทำการ save ไฟล์ แล้วทดสอบการใช้งาน

ตัวอย่าง log ที่เกิดขึ้น

Aug 16 11:32:39 FreeBSD sshd[1041]: refused connect from 172.17.12.51 (172.17.12.51)

วันเสาร์ที่ 14 สิงหาคม พ.ศ. 2553

SSH : กำหนด Source IP ของแต่ละ Username ที่จะทำการ Login ผ่าน SSH

ในบางกรณีเราต้องการระบุว่า user ใด สามารถใช้งานได้จากที่ไหนได้บ้าง เช่น
admin1 ซึ่งมีสิทธิสูงในระบบ สามารถ Login ได้จากในหน่วยงานเท่านั้น
user1 ซึ่งมีสิทธแค่ User สามารถ Login ได้จากในหน่วยงาน และจากหน่วยภายนอกอื่นๆ ที่เป็นแบบ Static IP
www1 ซึ่งมีสิทธิจำกัด สามารถ Login ได้จากที่ไหนก็ได้

ดังนั้นในกรณีจะใช้ความสามารถของ OpenSSH เอง ดังนี้

ระบบที่ใช้ทดสอบ
OS : Ubuntu 9.10
OpenSSH : OpenSSH_5.1p1 Debian-6ubuntu2, OpenSSL 0.9.8g 19 Oct 2007

กำหนดให้
IP หน่วยงานเป็น 172.17.1.0/24
IP หน่วยงานอื่นๆ ที่เป็น Static IP 192.168.0.0/24

การ Config
แก้ไข /etc/ssh/sshd_config โดยเพิ่มดังตัวอย่าง

AllowUsers admin1@172.17.1.0/24 user1@172.17.1.0/24 user1@192.168.0.0/24 www1

จากนั้น save file แล้วทำการ restart service ของ sshd

server# /etc/init.d/ssh restart

ตัวอย่าง log ที่เกิดขึ้น กรณีที่ admin1 ทำการ login จาก network ที่ไม่ได้อนุญาต

Aug 15 22:30:08 server sshd[21613]: User admin1 from 10.0.0.102 not allowed because not listed in AllowUsers

ความหมายของ Log คือ

Aug 15 22:30:08 ---> วัน เวลาที่เกิด Log
server ---> ชื่อเครื่อง
sshd[21613]: ---> Log ที่เกิด เกิดจาก SSH Service โดยตัวเลขในวงเล็บคือ Process ID ที่ทำงาน
User admin1 from 10.0.0.102 not allowed ---> username ที่ชื่อว่า admin1 ที่มาจาก IP 10.0.0.102 ไม่ได้รับอนุญาต
because not listed in AllowUsers ---> เนื่องจากไม่ได้กำนดไว้ในส่วนของ AllowUsers (ในตัวอย่างจะอนุญาตให้มาจาก 172.17.1.0/24 เท่านั้น)

จากนั้นใน Log file ก็จะเกิด log การ log ที่บอกว่า

Failed password for invalid user admin1 from 10.0.0.102 port 64381 ssh2

ตามขึ้นมาอีกจำนวนหนึ่ง ขึ้นอยู่กับการกำหนด MaxAuthTries ว่าให้พิมพ์ Password ผิดได้กี่ครั้งต่อการ login 1 ครั้ง ทั้งนี้เนื่องจาก user ที่ทำการ login เข้ามา จะไม่รู้ว่าโดยจำกัดการเข้าถึงอยู่ โดยจะรู้ว่าเหมือนกำลังพิมพ์ password ผิดอยู่

วันอาทิตย์ที่ 8 สิงหาคม พ.ศ. 2553

FreeBSD : Bandwidth Monitor by bwm-ng

bwm-ng ใช้ตรวจสอบการใช้งาน Bandwidth แบบ realtime ครับ ดูดีทีเดียว

ระบบที่ใช้ทดสอบ FreeBSD 7.0-RELEASE-p2

FreeBSD# cd /usr/ports/net-mgmt/bwm-ng
FreeBSD# make install ; rehash

FreeBSD# bwm-ng

วันพฤหัสบดีที่ 5 สิงหาคม พ.ศ. 2553

Linux : คำสั่ง date กับการประยุกต์ใช้

ในบางครั้งอาจต้องมีการเขียน shell script เพื่อให้ทำงานบางอย่างที่มีส่วนเกี่ยววันที่ เช่น สร้างไฟล์ที่มีรูปแบบชื่อไฟล์ดังนี้

file.YYYY-MM-DD.txt เช่น log.2010-08-31.txt

ซึ่งบางที ส่วนของวันที่ที่สนใจ อาจไม่ใช่วันที่ปัจจุบัน อาจเป็นเมื่อวาน หรือ 10 วันที่แล้ว หรือพรุ่งนี้ หรืออีก 10 วันข้างหน้า เป็นต้น

ถ้าเป็นการสร้างไฟล์เองโดยผู้ใช้ก็คงไม่ยาก ก็แค่พิมพ์ แต่ถ้าเป็น Cron job หล่ะ เราอาจต้องบอกให้ script ให้รู้จักการหาวันที่รูปแบบที่เราต้องการก่อน โดยในที่นี้ผมจะใช้คำสั่ง date ใน Linux

ระบบที่ใช้ทดสอบ : Ubuntu 9.10

รูปแบบปกติ
komkit@moccona:~$ date <--- คำสั่งที่ใช้
Fri Aug 6 13:35:16 ICT 2010 <--- ผลลัพธ์ที่ได้ จะเป็นวันที่และเวลาปัจจุบัน

ต้องการให้อยู่ในรูปแบบ YYYY-MM-DD
komkit@moccona:~$ date +%F <--- คำสั่งที่ใช้
2010-08-06 <--- ผลลัพธ์ที่ได้ จะเป็นวันที่ปัจจุบันในรูปแบบ YYYY-MM-DD

ต้องการวันที่เมื่อวาน ในรูปแบบ YYYY-MM-DD
komkit@moccona:~$ date --date="yesterday" +%F <--- คำสั่งที่ใช้
2010-08-05 <--- ผลลัพธ์ที่ได้ จะเป็นวันที่เมื่อวานในรูปแบบ YYYY-MM-DD

ต้องการวันที่ 10 วันที่แล้วในรูปแบบ YYYY-MM-DD
komkit@moccona:~$ date --date="10 day ago" +%F <--- คำสั่งที่ใช้
2010-07-27 <--- ผลลัพธ์ที่ได้ จะเป็นวันที่เมื่อวานในรูปแบบ YYYY-MM-DD

ต้องการวันที่วันพรุ่งนี้ ในรูปแบบ YYYY-MM-DD
komkit@moccona:~$ date --date="tomorrow" +%F <--- คำสั่งที่ใช้
2010-08-07 <--- ผลลัพธ์ที่ได้ จะเป็นวันที่พรุ่งนี้ในรูปแบบ YYYY-MM-DD

ต้องการวันที่ 10 วันข้างหน้าในรูปแบบ YYYY-MM-DD
komkit@moccona:~$ date --date="10 day" +%F <--- คำสั่งที่ใช้
2010-08-16 <--- ผลลัพธ์ที่ได้ จะเป็นวันที่พรุ่งนี้ในรูปแบบ YYYY-MM-DD


ทีนี้ก็เอาไปประยุกต์ใช้แล้วแต่ความต้องการได้เลยครับ

วันอาทิตย์ที่ 25 กรกฎาคม พ.ศ. 2553

Linux Firewall : ควบคุมการใช้งานเฉพาะ IP ในประเทศ

Credit : http://www.howtoforge.com/blocking-ip-addresses-of-any-country-with-iptables

บางหน่วยงานอาจต้องการให้เฉพาะเครื่องลูกข่ายทำการ Access เฉพาะ IP ภายในประเทศเท่านั้น (ค่าเชื่อมต่อ Internet ต่างประเทศมันแพง) ซึ่งวิธีการนั้นก็สามารถทำได้หลายวิธี เช่น Block ที่อุปกรณ์ Router แต่จะทำได้นั้น Router ต้องรู้จัก Route ว่า อันไหนของไทย อันไม่ใช่ของไทย (ซึ่ง Router ทั่วไปจะไม่รู้ เพราะไม่ได้รับ Route แยกมา) ยิ่งพิมพ์ยิ่งงง เอาเป็นว่า จะทำการ fillter ว่าให้ใช้ได้เฉพาะเวป หรือ protocol อื่นที่ IP ในประเทศไทยเท่านั้นแหละ (สามารถนำไปประยุกต์ได้อีกเยอะ)

ระบบที่ใช้ทดสอบ : Ubuntu 10.04 LTS
สมมติให้ระบบนี้เป็น Firewall ที่เครื่องลูกข่ายทุกเครื่องต้องวิ่งผ่าน
สมมติให้ eth0 = WAN interface และ eth1 = LAN Interface

เขียน script ดังนี้ (ผมเขียนที่ /root/firewall)

#!/bin/bash
#Subnet from http://www.countryipblocks.net/e_country_data/

COUNTRIE="TH"
WORKDIR="/root/"
LAN="eth1"
WAN="eth0"

cd $WORKDIR
wget -c --output-document=subnet.list http://www.countryipblocks.net/e_country_data/"$COUNTRIE"_cidr.txt
if [ -f subnet.list ]; then
iptables -F
iptables -P FORWARD DROP
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
DB="subnet.list"
IPS=$(grep -Ev "^#" $DB)
for i in $IPS
do
iptables -A FORWARD -i $LAN -o $WAN -d $i -j ACCEPT
done
fi
rm $WORKDIR/subnet.list

ทำการ save file จากนั้น กำหนด file permission เป็น 700 แล้วก็ run เลย

คำเตือน การ run คำสั่ง iptables ผ่าน remote terminal อาจทำให้การเชื่อมต่อหลุดได้

วันเสาร์ที่ 17 กรกฎาคม พ.ศ. 2553

การสั่งปิดเครื่องในระบบปฏิบัติการต่างๆ

Microsoft Windows

c:\> shutdown -s -f -t 0

--------------------------------------------
Linux

linux# poweroff
หรือ
linux# shutdown -h now
หรือ
linux# init 0


------------------------------------------

FreeBSD
freebsd# shutdown -p now


Setting reserved blocks percentage on Linux ext3 file system

Setting reserved blocks percentage on Linux ext3 file system

ปกติถ้าเรา format บน Linux โดยใช้คำสั่ง mkfs.ext3 ระบบจะทำการ set reserved block ของ partition นั้นไว้ที่ 5% เพื่อเอาใว้ใช้ในยามจำเป็น ซึ่งถ้าเป็น harddisk ที่ขนาดใหญ่มากๆ ก็จะต้องเสียพื้นที่ในการ reserved นั้นมากตามไปด้วย เช่นตัวอย่างจากของจริง

[root@server ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/cciss/c0d1p1 9.0T 168M 8.5T 1% /data

จากตัวอย่างจะเห็นว่า มี disk ทั้งหมด 9 TB ใช้ไป 168 MB แต่เหลือให้ใช้ได้อีก 8.5 TB หายไปตั้งหลาย GB (ประมาณว่า เสียดายอ่ะ) ซึ่งเนื้อที่ที่หายไปก็คือส่วนของ reserved นั่นเอง

ที นี้ด้วยความงก เราสามารถที่จะแก้ไข reserved space ให้สามารถนำมาใช้งานได้โดยใช้คำสั่ง tune2fs ดังนี้

[root@server ~]# umount /data ----> umount ก่อนเพื่อความปลอดภัย
[root@server ~]# tune2fs -m 1 /dev/cciss/c0d1p1
tune2fs 1.39 (29-May-2006)
Setting reserved blocks percentage to 1% (24418240 blocks)

[root@g-log ~]# mount -a ----> remount ทั้งหมด
[root@g-log ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/cciss/c0d1p1 9.0T 168M 8.9T 1% /data


จากข้างต้นผมได้ทำการแก้ reserved ของ partition ไปที่ 1% (สามารถแก้ไปที่ 0% ได้) เมือแก้เสร็จแล้วจะพบว่า เราจะได้พื้นที่ของ harddisk มาใช้ได้อีกเยอะจาก 8.5 TB ได้มาเป็น 8.9 TB

หมาย เหตุ
1. เราสามารถกำหนด reservd block ได้ตั้งแต่ขั้นตอน format โดยระบุ mkfs.ext3 -m 1
2. ไม่ควรลด reserved block บน system partition (คิดเอาเองว่า มันต้องจำเป็นสิ ไม่งั้นระบบมันจะ reserved ไปทำไม) ควรทำเฉพาะบน Data partition เท่าที่จำเป็นเท่านั้น

Linux: Subnet (CIDR) Calculator

credit : http://www.cyberciti.biz

เป็น command ไว้คำนวน subnet แบบง่ายๆ ครับ (ทดสอบบน Ubuntu 9.10 Server i386)

ubuntu# apt-get update
ubuntu# apt-get install sipcalc

ทดสอบ การใช้งาน

komkit@moccona:~$ sipcalc 192.168.1.0/24
-[ipv4 : 192.168.1.0/24] - 0

[CIDR]
Host address - 192.168.1.0
Host address (decimal) - 3232235776
Host address (hex) - C0A80100
Network address - 192.168.1.0
Network mask - 255.255.255.0
Network mask (bits) - 24
Network mask (hex) - FFFFFF00
Broadcast address - 192.168.1.255
Cisco wildcard - 0.0.0.255
Addresses in network - 256
Network range - 192.168.1.0 - 192.168.1.255
Usable range - 192.168.1.1 - 192.168.1.254

************************************************************************************************

komkit@moccona:~$ sipcalc 172.17.1.5/27
-[ipv4 : 172.17.1.5/27] - 0

[CIDR]
Host address - 172.17.1.5
Host address (decimal) - 2886795525
Host address (hex) - AC110105
Network address - 172.17.1.0
Network mask - 255.255.255.224
Network mask (bits) - 27
Network mask (hex) - FFFFFFE0
Broadcast address - 172.17.1.31
Cisco wildcard - 0.0.0.31
Addresses in network - 32
Network range - 172.17.1.0 - 172.17.1.31
Usable range - 172.17.1.1 - 172.17.1.30

*********************************************************************************************

komkit@moccona:~$ sipcalc eth0
-[int-ipv4 : eth0] - 0

[CIDR]
Host address - 172.17.1.21
Host address (decimal) - 2886795541
Host address (hex) - AC110115
Network address - 172.17.0.0
Network mask - 255.255.248.0
Network mask (bits) - 21
Network mask (hex) - FFFFF800
Broadcast address - 172.17.7.255
Cisco wildcard - 0.0.7.255
Addresses in network - 2048
Network range - 172.17.0.0 - 172.17.7.255
Usable range - 172.17.0.1 - 172.17.7.254


ช่วยให้ทำงานง่ายขึ้นเยอะ จะได้มีเวลาไปนอนกลางวัน