วันพฤหัสบดีที่ 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


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