วันอาทิตย์ที่ 23 ตุลาคม พ.ศ. 2559

การคัดลอกอิมเมจไฟล์ไปเป็น lvm

กลับมาพบกันอีกครั้งหนึ่งสำหรับเวบไซต์ดี ๆของคนรักลินุกส์ และชาวโอเพ่นซอร์สทุก ๆ ท่าน หลังจากที่ผู้เขียนได้เริ่มทำเวบไซต์ใหม่ thaigpstrackers.com รวบรวมเนื้อหาสาระดี ๆ ของผู้ใหบริการะบบจีพีเอสติดตามรถยนต์ในย้านเรา เวบไซต์ thaigpstrackers.com เองผู้เขียนพัฒนาใหม่บน wordpress.com ซึ่งมีเครื่องมือหรือโมดูลให้เลือกจัดทำได้มากมาย แต่เบื้องต้นยังไม่ค่อยคล่อง หากได้ปรับตัวกันอีกสักระยะจะได้ปรับปรุงรูปแบบให้มีความสวยงามมากยิ่งขึ้นได้ เวบไซต์ดี ๆ thaigpstrackers.com ขออนุญาตประชาสัมพันธ์กันไว้ณโอกาสนี้

เนื้อหาของเราในวันที่จะเป็นการคัดลอกอิมเมจเดิมที่จัดเก็บแบบไฟล์ ไปเป็นระบบ logical volume manager(lvm) เพื่อให้ง่ายต่อการบริหารจัดการ หรือมแแต่การสำรองข้อมูลแบบสแน็ปชอร์ต

สามารถทำได้ง่ายมาก สะดวกต่อการใช้งาน ไฟล์อิมเมจที่เก็บไว้ไปยังพาร์ติชั่นแบบ lvm


ขั้นตอนแรกตรวจสอบอิมเมจเดิมก่อนว่ามีขนาดเท่าไร โดยคำสั่งที่ใช้ในการตรวจสอบคือคำสั่ง qemu_img 

#qemu-img info vm_ubuntu01
image: vm_ubuntu01
file format: raw
virtual size: 128G (137438953472 bytes)
disk size: 128G

ขั้นตอนที่สอง เป็นการสร้าง lvm วอลลุ่มสำหรับเตรียมการคัดลอกข้อมูลโดยใช้คำสั่ง lvcreate จากการตรวจสอบวอลลุ่มในขั้นตอนแรกมีค่าอยู่ที่  128G ดังนั้นตามตัวอย่างจึงสร้างขนาดของวอลลุ่มให้ไม่น้อยกว่า 128G ในที่นี่สร้างขนาด 130G

#lvcreate -L130G -n vm_03 innova-vg

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

#dd if=/mnt/usb/idcbackup/vm_ubuntu01 of=/dev/innova-vg/vm_03
หรือหากต้องการตรวจสอบความก้าวหน้าของคำสั่ง dd
#dd if=/mnt/usb/idcbackup/vm_ubuntu01 | pv -s 30G | dd of=/dev/innova-vg/vm_03 bs=4096
กรณีที่ไฟล์อิมเมจต้นฉบับเป็นรูปแบบ qcow2 ต้องทำการแปลงเป็นไฟล์เดิมก่อน มิฉะนั้นหากดำเนินการเสร็จสิ้นจะบูตไม่ขึ้น ผู้เขียนหาวิธีแก้เรื่องนี้ข้ามปีทีเดียว

 qemu-img convert vm_ubuntu01.qcow2 -O raw vm_ubuntu01.raw
จากสามขั้นตอนข้างต้นสามารถคัดลอกอิมเมจไปยังวอลลุ่มใหม่เพื่อเตรียมการสำหรับขึ้นระบบใหม่ หรือสร้างเกสต์โอเอสตัวใหม่นั่นเอง ในบางครั้งหากวอลลุ่มเดิมมีขนาดไม่เพียงพอ เราสามารถใช้คำสั่ง lvextend เพื่อขนาดวอลลุ่มเดิมเพื่อให้สามารถใช้งานได้อีกต่อไป

#lvextend -L+10G /dev/innova-vm/vm_03

ผ่านไปอีกหนึ่งบทความดี ๆ ที่ผู้เขียนได้นำเสนอจากประสบการณ์จริงที่ได้พบเจอ ช่วงนี้มีการติดตั้งระบบโอเอสคอมพิวเตอร์ใหม่หมดเพื่อเตรียมการสำหรับนำเครื่องไปวางที่ CAT IDC ในช่วงเวลาเดือนนี้จะมี
เนื้อหาทยอยอัพเดทกันให้ทราบกันอีกในโอกาสต่อไป ยังไงอย่าลืมเวบไซต์ใหม่ของผู้ให้บริการจีพีเอสติดตามรถยนต์ สินค้าเกรดเอ นำเข้าจากโรงงานผู้ผลิตโดยตรง thaigpstrackers.com

วันพุธที่ 28 กันยายน พ.ศ. 2559

กำหนดค่าโฮสต์ไฟร์วอล shorewall + libvirt-bin ผสมผสานทำงานร่วมกันอย่างมีประสิทธิภาพ

กลับมาพบกันอีกครั้งหนึ่งในรอบสัปดาห์ ช่วงนี้ผู้เขียนมีงานต้องขึ้นระบบใหม่ และมีการเตรียมตัวสำหรับการปรับปรุงระบบเดิมของบริษัทฯให้มีประสิทธิภาพเพิ่มมากขึ้น



โดยโจทย์ในวันนี้จะเป็นการนำซอฟต์แวร์ไฟร์วอล(shorewall)และการเปิดปิดเซอร์วิส libvirt-bin ของเครื่องเกสต์(guest) เข้ามารวมกันก่อนอื่นต้องท้าวความกันสักหน่อย

shorewall เป็นซอฟต์แวร์ไฟร์วอลแบบสเตจฟลู(statefull) จะใช้วิธีการกำหนดค่าผ่านเทอร์มินอล จากนั้นจะแปลงค่าคอนฟิกต่าง ๆ ไปเป็น iptables ที่มีประสิทธิภาพและมีความยืดหยุ่นสูง ง่ายและสะดวกต่อการใข้งาน
libvirt-bin เป็นโปรแกรมที่ระบบเวอร์ชวลแมชชีน(kvm) ใช้ในการกำหนดค่า iptables ต่าง ๆ ของเครื่องโฮสต์(host) เพื่อให้มีการติดต่อกันระหว่าง host กับ guest เป็นไปได้อย่างมีประสิทธิภาพ ปัญหาของการที่ไม่มีการเปิด iptables เพื่อเชื่อมต่อกันก็คือ เครื่องเกสต์ไม่สามารถออกอินเทอร์เน็ตได้ เป็นต้น

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

สำหรับ การกำหนดค่าของ shorewall สามารถดูได้จากเนื่้อหา http://www.s-techthai.com/2016/09/shorewall-ubuntu-server.html

ส่วนที่เหลือเป็นกฎเกณฑ์ของ libvirt-bin ที่สร้างเป็นสคริปไฟล์ใช้สำหรับรันเพิ่มหลังจากที่ได้ทำการสตาร์ทshorewall ไปเรียบร้อยแล้ว

 #!/bin/bash
iptables -t nat -I PREROUTING -p tcp -d 1.2.3.4 --dport 80 -j DNAT --to-destination 192.168.122.2:80
iptables -t nat -I PREROUTING -p tcp -d 1.2.3.4 --dport 222 -j DNAT --to-destination 192.168.122.2:22

iptables -t nat -I POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE
iptables -t nat -I POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
iptables -t nat -I POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
 
iptables -t nat -I POSTROUTING -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN
iptables -t nat -I POSTROUTING -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN

iptables -I FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
iptables -I FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
iptables -I FORWARD -i virbr0 -o virbr0 -j ACCEPT
iptables -I FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT
iptables -I FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT

iptables -I INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT
iptables -I INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT
iptables -I INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT

iptables -I OUTPUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT


 ส่วนขั้นตอนการสตาร์ทสคริปก็ใช้เทคนิคตามแต่ที่ถนัดกันละครับ ที่สำคัญต้องสตาร์ทเซอร์วิสนี้หลังจากที่สตาร์ทshorewall ไปแล้วเท่านั้น สำหรับผู้เขียนเองสตาร์ทแมนนวลไปก่อน เพราะปกติเครื่องโฮสต์ที่บริษัทออนไลน์มามากกว่า 180 วันก็ยังไม่มีปัญหาใด ๆ

เนื้อหาดี ๆ ทั้งหมดนี้ได้รับการสนับสนุนจากเวบไซต์ thailandgpstracker.com ของบริษัท ไทยพรอสเพอรัส ไอที จำกัด ผู้นำด้านการให้บริการระบบจีพีเอสติดตามรถยนต์ สมบูรณ์แบบ ที่สำคัญระบบของเราไม่ได้ถูกจำหน่ายและให้บริการเฉพาะเจ้าของ(proprietary)หรือแย่กว่านั้นก็คือรีแบรนด์(reband)กลบเกลื่อนร่องรอยที่แท้จริงของอุปกรณ์ มีทำกันมากทีเดียวในบ้านเรา 


วันเสาร์ที่ 24 กันยายน พ.ศ. 2559

กำหนดค่าไฟร์วอล shorewall บนระบบปฏิบัติการ ubuntu server

หลังจากที่ผู้เขียนได้ทดลอง กำหนดค่าคอนฟิค ubuntu และ kvm แบบ nat ให้ทำการ forward port ได้เรียบร้อยแล้วในเนื้อหาที่ผ่านมา สำหรับบทความนี้ยังเป็นเรื่องราวต่อเนื่องเหมือนเดิม เพราะระบบปฏิบัติการ ubuntu server ต้องการเปิดไฟร์วอลเพื่อป้องกันการโจมตีจากผู้ไม่ประสงค์ดี ทั้งยังเป็นการป้องกันตัวเครื่องเซิร์ฟเวอร์เองไม่ให้เปิดช่วงโหว่ให้มีใครสามารถบุกรุกเข้ามาใช้งานในระบบของเราได้

วันนี้จะพาไปแนะนำการใช้งานไฟร์วอลง่าย ๆ นั่นก็คือ shorewall ที่สามารถทำงานได้บนระบบปฏิบัติการลินุกส์ได้เป็นอย่างดี โดยเราจะรัน shorewall บนเครื่อง guest เป็น  Ubuntu 14.04.5 LTSนั่นเอง โดยเราเข้าไปดูคอนฟิกตัวอย่างที่ไฟร์วอล shorewall แนะนำมาให้ดังนี้


/usr/share/doc/shorewall/examples/one-interface


zones  เป็นตัวกำหนดว่าเราจัดแบ่งระบบไฟร์วอลเป็นแบบไหน ในตัวอย่างเป็นการกำหนดให้ fw เป็นตัวไฟร์วอล(firewall) และตัวเน็ต(net)เป็นตัวไอพีเวอร์ชั่น 4

#ZONE   TYPE    OPTIONS 
fw      firewall
net     ipv4

interfaces เป็นส่วนสำคัญในการกำหนดค่าให้ว่ามีอินเทอร์เฟสใดอยู่บ้างในโฮสต์(host) ตามตัวอย่างมีเพียงอินเทอร์เฟสเดียวคือ eth0

#ZONE   INTERFACE       OPTIONS
net     eth0            dhcp,tcpflags,logmartians,nosmurfs,sourceroute=0

policy เป็นส่วนของนโยบายที่จะบังคับระหว่าง ต้นทาง(source) และปลายทาง(destination) ว่าจะให้ทำงานยังไง จากค่าดีฟอลต์นโยบายกำหนดให้ต้นทางจากไฟร์วอล($FW) ไปยังเน็ต(net)ได้รับการยอมรับ(ACCEPT) ส่วนนโยบายจากเน็ต(net)ไปยังปลายทางอื่น ๆ(all) ให้ดร็อปทั้งหมดและบันทึกล็อกเป็นข้อมูล(info) ส่วนนโยบายสุดท้ายหรือเราเรียกว่านโยบายปิด(close policy) ให้ปฏิเสธ(reject)ทั้งหมด


#SOURCE         DEST            POLICY          LOG LEVEL       LIMIT:BURST
$FW             net             ACCEPT
net             all             DROP            info
# The FOLLOWING POLICY MUST BE LAST
all             all             REJECT          info
rules เป็นส่วนที่สำคัญหรือเรียกว่ากฏของไฟร์วอลที่จะกำหนดให้ว่า ต้องการให้บริการเซอร์วิสใดบ้าง จากตัวอย่างต้องการเปิดบริการ เวบไซต์ที่พอร์ต 80 และอนุญาตให้ใช้งาน ssh mที่พอร์ต 22 เป็นต้น

# Drop packets in the INVALID state
Invalid(DROP)  net              $FW             tcp


# Drop Ping from the "bad" net zone.. and prevent your log from being flooded..
Ping(DROP)      net             $FW


# Permit all ICMP traffic FROM the firewall TO the net zone
ACCEPT          $FW             net             icmp
ACCEPT           net               $FW          tcp  80 
ACCEPT           net               $FW          tcp  22

ข้างต้นเป็นการกำหนดค่าคอนฟิกเบื้องต้นให้กับไฟร์วอล เมื่อเราสั่งให้ไฟร์วอลทำงาน ระบบจะสร้างชุด iptables rule ต่าง ๆ มากมายพร้อมทั้งยังป้องกันการโจมตีจากโฮสต์ต่าง ๆ ได้ผลดีเป็นอย่างยิ่ง ด้านล่างสุดเป็นตัวอย่างที่นำมาให้ดูหลังจากเปิดไฟร์วอลให้ทำงาน

ต้องขอขอบพระคุณบจก.ไทย พรอสเพอรัส ไอที ผู้นำด้านการให้บริการระบบ gps ติดตามรถ สมบูรณ์แบบคุ้มค่า ทนทาน ผ่านมาตรฐานกสทชและกรมการขนส่งทางบก

# Generated by iptables-save v1.4.21 on Sat Sep 24 21:07:16 2016
*raw
:PREROUTING ACCEPT [5964:4496168]
:OUTPUT ACCEPT [4748:554229]
-A PREROUTING -p udp -m udp --dport 10080 -j CT --helper amanda
-A PREROUTING -p tcp -m tcp --dport 21 -j CT --helper ftp
-A PREROUTING -p udp -m udp --dport 1719 -j CT --helper RAS
-A PREROUTING -p tcp -m tcp --dport 1720 -j CT --helper Q.931
-A PREROUTING -p tcp -m tcp --dport 6667 -j CT --helper irc
-A PREROUTING -p udp -m udp --dport 137 -j CT --helper netbios-ns
-A PREROUTING -p tcp -m tcp --dport 1723 -j CT --helper pptp
-A PREROUTING -p tcp -m tcp --dport 6566 -j CT --helper sane
-A PREROUTING -p udp -m udp --dport 5060 -j CT --helper sip
-A PREROUTING -p udp -m udp --dport 161 -j CT --helper snmp
-A PREROUTING -p udp -m udp --dport 69 -j CT --helper tftp
-A OUTPUT -p udp -m udp --dport 10080 -j CT --helper amanda
-A OUTPUT -p tcp -m tcp --dport 21 -j CT --helper ftp
-A OUTPUT -p udp -m udp --dport 1719 -j CT --helper RAS
-A OUTPUT -p tcp -m tcp --dport 1720 -j CT --helper Q.931
-A OUTPUT -p tcp -m tcp --dport 6667 -j CT --helper irc
-A OUTPUT -p udp -m udp --dport 137 -j CT --helper netbios-ns
-A OUTPUT -p tcp -m tcp --dport 1723 -j CT --helper pptp
-A OUTPUT -p tcp -m tcp --dport 6566 -j CT --helper sane
-A OUTPUT -p udp -m udp --dport 5060 -j CT --helper sip
-A OUTPUT -p udp -m udp --dport 161 -j CT --helper snmp
-A OUTPUT -p udp -m udp --dport 69 -j CT --helper tftp
COMMIT
# Completed on Sat Sep 24 21:07:16 2016
# Generated by iptables-save v1.4.21 on Sat Sep 24 21:07:16 2016
*nat
:PREROUTING ACCEPT [18:928]
:INPUT ACCEPT [18:928]
:OUTPUT ACCEPT [4:247]
:POSTROUTING ACCEPT [4:247]
COMMIT
# Completed on Sat Sep 24 21:07:16 2016
# Generated by iptables-save v1.4.21 on Sat Sep 24 21:07:16 2016
*mangle
:PREROUTING ACCEPT [5964:4496168]
:INPUT ACCEPT [5964:4496168]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4748:554229]
:POSTROUTING ACCEPT [4748:554229]
:tcfor - [0:0]
:tcin - [0:0]
:tcout - [0:0]
:tcpost - [0:0]
:tcpre - [0:0]
-A PREROUTING -j tcpre
-A INPUT -j tcin
-A FORWARD -j MARK --set-xmark 0x0/0xff
-A FORWARD -j tcfor
-A OUTPUT -j tcout
-A POSTROUTING -j tcpost
COMMIT
# Completed on Sat Sep 24 21:07:16 2016
# Generated by iptables-save v1.4.21 on Sat Sep 24 21:07:16 2016
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:Broadcast - [0:0]
:Drop - [0:0]
:Reject - [0:0]
:dynamic - [0:0]
:fw2net - [0:0]
:logdrop - [0:0]
:logflags - [0:0]
:logreject - [0:0]
:net2fw - [0:0]
:reject - [0:0]
:shorewall - [0:0]
:smurflog - [0:0]
:smurfs - [0:0]
:tcpflags - [0:0]
-A INPUT -i eth0 -j net2fw
-A INPUT -i lo -j ACCEPT
-A INPUT -j Reject
-A INPUT -j LOG --log-prefix "Shorewall:INPUT:REJECT:" --log-level 6
-A INPUT -g reject
-A FORWARD -j Reject
-A FORWARD -j LOG --log-prefix "Shorewall:FORWARD:REJECT:" --log-level 6
-A FORWARD -g reject
-A OUTPUT -o eth0 -j fw2net
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -j Reject
-A OUTPUT -j LOG --log-prefix "Shorewall:OUTPUT:REJECT:" --log-level 6
-A OUTPUT -g reject
-A Broadcast -m addrtype --dst-type BROADCAST -j DROP
-A Broadcast -m addrtype --dst-type MULTICAST -j DROP
-A Broadcast -m addrtype --dst-type ANYCAST -j DROP
-A Drop
-A Drop -j Broadcast
-A Drop -p icmp -m icmp --icmp-type 3/4 -m comment --comment "Needed ICMP types" -j ACCEPT
-A Drop -p icmp -m icmp --icmp-type 11 -m comment --comment "Needed ICMP types" -j ACCEPT
-A Drop -m conntrack --ctstate INVALID -j DROP
-A Drop -p udp -m multiport --dports 135,445 -m comment --comment SMB -j DROP
-A Drop -p udp -m udp --dport 137:139 -m comment --comment SMB -j DROP
-A Drop -p udp -m udp --sport 137 --dport 1024:65535 -m comment --comment SMB -j DROP
-A Drop -p tcp -m multiport --dports 135,139,445 -m comment --comment SMB -j DROP
-A Drop -p udp -m udp --dport 1900 -m comment --comment UPnP -j DROP
-A Drop -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -j DROP
-A Drop -p udp -m udp --sport 53 -m comment --comment "Late DNS Replies" -j DROP
-A Reject
-A Reject -j Broadcast
-A Reject -p icmp -m icmp --icmp-type 3/4 -m comment --comment "Needed ICMP types" -j ACCEPT
-A Reject -p icmp -m icmp --icmp-type 11 -m comment --comment "Needed ICMP types" -j ACCEPT
-A Reject -m conntrack --ctstate INVALID -j DROP
-A Reject -p udp -m multiport --dports 135,445 -m comment --comment SMB -j reject
-A Reject -p udp -m udp --dport 137:139 -m comment --comment SMB -j reject
-A Reject -p udp -m udp --sport 137 --dport 1024:65535 -m comment --comment SMB -j reject
-A Reject -p tcp -m multiport --dports 135,139,445 -m comment --comment SMB -j reject
-A Reject -p udp -m udp --dport 1900 -m comment --comment UPnP -j DROP
-A Reject -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -j DROP
-A Reject -p udp -m udp --sport 53 -m comment --comment "Late DNS Replies" -j DROP
-A fw2net -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A fw2net -p icmp -j ACCEPT
-A fw2net -j ACCEPT
-A logdrop -j DROP
-A logflags -j LOG --log-prefix "Shorewall:logflags:DROP:" --log-level 6 --log-ip-options
-A logflags -j DROP
-A logreject -j reject
-A net2fw -m conntrack --ctstate INVALID,NEW,UNTRACKED -j dynamic
-A net2fw -m conntrack --ctstate INVALID,NEW,UNTRACKED -j smurfs
-A net2fw -p tcp -j tcpflags
-A net2fw -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A net2fw -p tcp -m conntrack --ctstate INVALID -j DROP
-A net2fw -d 192.168.122.33/32 -p tcp -m tcp --dport 22 -m comment --comment SSH -j ACCEPT
-A net2fw -d 192.168.122.33/32 -p udp -m udp --dport 53 -m comment --comment DNS -j ACCEPT
-A net2fw -d 192.168.122.33/32 -p tcp -m tcp --dport 53 -m comment --comment DNS -j ACCEPT
-A net2fw -d 192.168.122.33/32 -p icmp -m icmp --icmp-type 8 -m comment --comment Ping -j ACCEPT
-A net2fw -p tcp -m tcp --dport 80 -j ACCEPT
-A net2fw -j Drop
-A net2fw -j LOG --log-prefix "Shorewall:net2fw:DROP:" --log-level 6
-A net2fw -j DROP
-A reject -m addrtype --src-type BROADCAST -j DROP
-A reject -s 224.0.0.0/4 -j DROP
-A reject -p igmp -j DROP
-A reject -p tcp -j REJECT --reject-with tcp-reset
-A reject -p udp -j REJECT --reject-with icmp-port-unreachable
-A reject -p icmp -j REJECT --reject-with icmp-host-unreachable
-A reject -j REJECT --reject-with icmp-host-prohibited
-A shorewall -m recent --set --name %CURRENTTIME --mask 255.255.255.255 --rsource
-A smurflog -j LOG --log-prefix "Shorewall:smurfs:DROP:" --log-level 6
-A smurflog -j DROP
-A smurfs -s 0.0.0.0/32 -j RETURN
-A smurfs -m addrtype --src-type BROADCAST -g smurflog
-A smurfs -s 224.0.0.0/4 -g smurflog
-A tcpflags -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -g logflags
-A tcpflags -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -g logflags
-A tcpflags -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -g logflags
-A tcpflags -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -g logflags
-A tcpflags -p tcp -m tcp --sport 0 --tcp-flags FIN,SYN,RST,ACK SYN -g logflags
COMMIT
# Completed on Sat Sep 24 21:07:16 2016

วันศุกร์ที่ 23 กันยายน พ.ศ. 2559

กำหนดค่าคอนฟิค ubuntu และ kvm แบบ nat ให้ทำการ forward port

ลองกำหนดค่าคอนฟิคให้กับระบบเซิร์ฟเวอร์เวอร์ชวลแมชชีน โดยใช้ ubuntu และ kvm ผู้เขียนได้ทดลองรันระบบเวอร์ชวลแมชชีนโดยใช้ระบบปฏิบัติการลินุกส์มาหลายปีที่ผ่านมา พบว่าระบบมีการทำงานที่มีเสถียรภาพดีมาก ๆ ในวันนี้ผู้เขียนจะได้แนะนำวิธีการฟอร์เวิร์ดพอร์ตเซอร์วิสต่าง ๆจากโฮสต์(host) ไปยังเกสต์(guest) ที่กำหนดค่าการ์ดแลนด์เป็นแบบแน็ท(nat)ในขณะเดียวกันระบบก็มีการกำหนดการ์ดอินเทอร์เฟสยังเวอร์ชวลแมชชีน(guest)ที่กำหนดค่าอินเตอร์เฟสแบบบริดจ์(bridge)ด้วย

การรันเกสต์แบบบริดจ์จะสามารถแม็พไอพีจริง(public ip address) ไปยังเครื่องเกสต์ได้โดยตรง ส่วนการแม็พไอพีจริงแบบแน็ทนั้นจะต้องการสร้างเทคนิคการทำ port forwarding รวมถึง การทำ destination และ source masquarade ไปด้วยกัน

จากโจทย์ของผู้เขียน หากเครื่องไคลเอ้นท์ต้องการติดต่อกับเครื่องเกสต์แบบแน็ทพอร์ต 80 ต้องดำเนินการดังนี้

iptables -t nat -A PREROUTING -p tcp -d 1.2.3.4 -dport 80 -j DNAT --to-destination 192.168.122.2:80
iptables -t nat -A PREROUTING -p tcp -d 1.2.3.4 -dport 22 -j DNAT --to-destination 192.168.122.2:22




 

หลังจากนั้นต้องทำการฟอร์เวิร์ดแพคเกจไปด้วย โดยจะทำการตรวจสอบเฉพาะสถานะ New, Related และ Established เท่านั้น

iptables -I FORWARD -m state -d 192.168.122.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT


สิ่งสำคัญอีกเรื่องก็คือการกำหนดค่าให้เคอร์เนลทำหน้าที่ฟอร์เวิร์ดไอพีแอดเดรส

sysctl -w net.ipv4.ip_forward=1
cat /proc/sys/net/ipv4/ip_forward
sysctl -p /etc/sysctl.conf

เนื้อหาดี ๆเหล่านี้จะสำเร็จลงไม่ได้หากไม่ได้รับการสนับสนุนจาก บจก.ไทย พรอสเพอรัส ไอที ผู้นำด้านการให้บริการ ระบบ จีพีเอสติดตามรถ รู้ลึก รู้จริง ตอบปัญหาได้ทุกเรื่อง ต้องใช้บริการที่นี่เท่านั้น

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

ทดลองส่งข้อมูลผ่านฟอร์มแบบอัตโนมัติ โดยใช้ php curl วิธี GET

หลังจากที่ผู้เขียนได้ทดลองการส่งข้อมูลผ่านฟอร์มแบบอัตโนมัติโดยไม่ต้องคอยนั่งกดคีย์ Submit ไปเมื่อปี 2558 ตามลิงค์ที่ให้นี้ http://www.s-techthai.com/2014/12/php-method-post.html กลับมาเจอการบ้านใหม่อีกครั้งเพราะการส่งข้อมูลใช้วิธีการที่เรียกว่า "POST" มีบางแอพพลิเคชั่นที่ไม่ต้องการให้เราสั่งงานโดยใช้การ "POST" มาในวันที่จะเป็นการแนะนำขั้นต้องการสั่งงานผ่าน PHP Curl โดยใช้วิธีการ "GET" บ้าง

ศึกษาการทำงานกัน
 $url = 'http://www.gps-vehicle.com/?'.$field_string; เป็นการตั้งค่า url ที่ต้องการจะส่งข้อมูลแบบ GET
 $curl = curl_init(); เป็นการกำหนดค่าเริ่มต้นสำหรับการใช้งานฟังก์ชั่น curl
 curl_setopt_array($curl, array( กำหนดอาเรย์สำหรับการส่งค่าพารามิเตอร์ต่างๆ ไปยังเซิร์ฟเวอร์
                        CURLOPT_RETURNTRANSFER => 1,  กำหนดออฟชั่นให้มีการส่งค่ากลับ
                        CURLOPT_URL => $url, กำหนดค่า Url ที่ใช้ในการทดลองส่งข้อมูล
                        CURLOPT_USERAGENT => 'Thai Prosperous IT co.,Ltd.'
                ));
 $resp = curl_exec($curl); สั่งให้ฟังก์ชั่น curl ประมวลผล โดยผลลัพธ์หรือค่าตอบกลับอยู่ในตัวแปร resp
 curl_close($curl); สั่งสิ้นสุดการทำงานของฟังก์ชั่น curl



 $url = 'http://www.gps-vehicle.com/?'.$field_string;
 echo $url;
 $curl = curl_init();
 curl_setopt_array($curl, array(
                        CURLOPT_RETURNTRANSFER => 1,
                        CURLOPT_URL => $url,
                        CURLOPT_USERAGENT => 'Thai Prosperous IT co.,Ltd.'
                   ));
 $resp = curl_exec($curl);
 curl_close($curl);


หลังจากนั้นก็ทดสอบการทำงานผ่านเทอร์มินอล โปรแกรมก็สามารถประมวลผลตามที่เราต้องการได้อย่างอัตโนมัติ ผู้เขียนตั้งค่าการทำงานผ่าน crond ทุกๆ 2 นาที หรือทำแบบ asynchronous ก็ได้ สำหรับฟังก์ชั่นการรับค่าจากอุปกรณ์ GPS TRACKER ให้ส่งต่อข้อมูลที่เปลี่ยนเป็นแบบวิธี GET ซึ่งรับประกันได้ว่าได้ผลการทำงานดีเช่นเดียวกัน ส่วนขนาดของข้อความสูงสุดที่รับได้ ผู้เขียนยังไม่ได้ทดสอบแต่ประเมินว่าขึ้นอยู่กับค่ามาตรฐานของโปรโตคอล HTTP อยู่แล้ว