Clie networking with Linux – พาน้องเอ้ท่องอินเทอร์เน็ต

วันนี้เกิดคึกอะไรขึ้นมาก็ไม่ทราบได้ อยากลองต่อ Clie เชื่อมอินเทอร์เน็ตผ่าน USB ดูว่าจะทำได้มั้ย วิธีการที่คิดไว้ก็คือใช้ PPP ผ่าน USB Serial ครับ … ก่อนอื่นก็ต้องเซ็ตค่าน้องเอ้ก่อน

Pref ==> Network:
Service: My Network
User Name: ไม่ต้องใส่
Password: ไม่ต้องใส่
Connection: Cradle/Cable

[Details...]
Connection type: PPP
Idle timeout: Never
Query DNS: Checked
IP Address: Checked Automatic

[Script...]
บรรทัดแรก เลือก End:

ส่วนของลินุกซ์ ..

ความต้องการพื้นฐานทางฝั่งลินุกซ์นี่แบ่งได้เป็นสองส่วนครับ ส่วนแรกคือส่วนของ USB Serial ซึ่งจำลอง USB เป็นดีไวซ์แบบซีเรียลเหมือน /dev/ttyS0 ทำให้เราใช้ PPP บน USB connection ได้ .. ส่วนที่สองก็คือส่วนของ PPP protocol .. มาเริ่มที่ USB Serial ก่อน .. ตรวจสอบเคอร์เนลตามนี้ครับ

CONFIG_USB_SERIAL=y or m
CONFIG_USB_SERIAL_GENERIC=y or m
CONFIG_USB_SERIAL_VISOR=y or m

อันสุดท้ายไม่เกี่ยวกับงานนี้เท่าไหร่ แต่จะได้ใช้แน่ๆ ถ้าต้องการ sync ข้อมูลระหว่าง Clie กับลินุกซ์ก็เลยเอามารวมไว้ด้วย .. ส่วนของ PPP ก็มี:

Network device support
CONFIG_DUMMY=y or m
CONFIG_PPP=y or m
CONFIG_PPP_ASYNC=y or m
CONFIG_PPP_DEFLATE=y or m
CONFIG_PPP_BSDCOMP=y or m

หลังจากเคอร์เนลสนับสนุน USB Serial และ PPP แล้วทีนี้ก็มาทดสอบกัน

กรณีของผม peorth ใช้ไอพีแอดเดรส 192.41.170.215 อยู่ในเครือข่าย 192.41.170.0/24 ผมแอบขโมยไอพี 192.41.170.217 มาใช้กับ Clie เป็นการชั่วคราว .. ส่วน Yggdrasil (192.41.170.225) เอาไว้ทดสอบการเชื่อมต่อ .. ก่อนอื่นต้อง enable IP Forwarding เสียก่อนด้วยการสั่ง

[root@peorth root]# echo "1" > /proc/sys/net/ipv4/ip_forward

เราจำเป็นต้องใช้ IP Forwarding เพราะว่าแพคเก็ตจะต้องส่งข้ามอินเทอร์เฟซ eth0 และ ppp0 .. จากนั้นที่ Clie เลือก Pref ==> Network ==> [Connect] ลองเช็ค /var/log/messages ก็จะเห็น

Jun 30 01:48:59 peorth /etc/hotplug/usb.agent: Setup visor for USB product 54c/9a/100
Jun 30 01:48:59 peorth kernel: usbserial.c: USB Serial support registered for Handspring Visor / Treo / Palm 4.0 / Cli้ 4.x
Jun 30 01:48:59 peorth kernel: usbserial.c: Handspring Visor / Treo / Palm 4.0 / Cli้ 4.x converter detected
Jun 30 01:48:59 peorth kernel: host/usb-uhci.c: interrupt, status 2, frame# 1833
Jun 30 01:48:59 peorth kernel: usbserial.c: Handspring Visor / Treo / Palm 4.0 / Cli้ 4.x converter now attached to ttyUSB0 (or usb/tts/0 for devfs)
Jun 30 01:48:59 peorth kernel: usbserial.c: Handspring Visor / Treo / Palm 4.0 / Cli้ 4.x converter now attached to ttyUSB1 (or usb/tts/1 for devfs)
Jun 30 01:48:59 peorth kernel: usbserial.c: USB Serial support registered for Sony Cli้ 3.5
Jun 30 01:48:59 peorth kernel: visor.c: USB HandSpring Visor, Palm m50x, Treo, Sony Cli้ driver v1.7

สุดท้ายก็รัน pppd:

[root@peorth root]# pppd /dev/usb/ttyUSB0 115200 10.0.0.1:192.41.170.217 ms-dns 192.41.170.15 noauth nodetach proxyarp
<code>
หลังจากสั่งคำสั่งเรียบร้อยแล้ว pppd จะไม่หลุดมาที่พรอมพ์แต่จะแสดงข้อความบอกสถานะการเชื่อมต่อ:
<code>
Using interface ppp0
Connect: ppp0  /dev/usb/ttyUSB0
Cannot determine ethernet address for proxy ARP
local  IP address 10.0.0.1
remote IP address 192.41.170.217

ถ้าใครคอมไพล์ PPP เป็นเคอร์เนลโมดูลลอง lsmod ดูควรจะปรากฏรายชื่อโมดูลประมาณนี้:

ppp_deflate             4504   0 (autoclean)
zlib_deflate           21528   0 (autoclean) [ppp_deflate]
bsd_comp                5464   0 (autoclean)
ppp_async               9440   1 (autoclean)
ppp_generic            20156   3 (autoclean) [ppp_deflate bsd_comp ppp_async]
slhc                    6756   1 (autoclean) [ppp_generic]

ออพชั่นที่ใส่ให้ pppd ประกอบด้วยซีเรียลดีไวซ์ที่ต้องการใช้งาน (/dev/usb/ttyUSB0) อัตราการส่งข้อมูล 115200 บิตต่อวินาที กำหนดไอพีแอดเดรสของ ppp0 ฝั่งลินุกซ์เป็น 10.0.0.1 (เอา private IP หมายเลขไหนก็ได้ที่ไม่มีใครใช้) pppd จะกำหนดไอพีของ Clie เป็น 192.41.170.217 (ตามที่แอบขโมยมาใช้ :P) และกำหนดไอพีแอดเดรสของ DNS Server ที่ให้ Clie ใช้เป็น 192.41.170.15 ออพชั่น noauth ทำให้เชื่อมต่อได้ทันทีโดยไม่ต้องมี Authentication (แปลว่าไม่ต้องใส่ login/password) .. nodetach ทำให้ pppd คงการควบคุมพอร์ตไว้ ถ้าไม่ใส่ pppd จะปล่อยการควบคุมให้กับระบบทันทีที่การเชื่อมต่อทำได้สำเร็จ และสุดท้าย proxyarp ทำให้เครื่องอื่นๆ มองเห็น Clie เป็นเครื่องหนึ่งในเครือข่ายเดียวกับ Peorth … จากตรงนี้ถ้าเช็ค ifconfig ก็จะมีอินเทอร์เฟซ ppp0 ปรากฏขึ้นมาไอพีแอดเดรสของ ppp0 คือ 10.0.0.1 เชื่อม Point-to-Point ไปยังไอพีแอดเดรส 192.41.170.217 ที่กำหนดให้กับ Clie:

ppp0      Link encap:Point-to-Point Protocol
          inet addr:10.0.0.1  P-t-P:192.41.170.217  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:82 (82.0 b)  TX bytes:97 (97.0 b)

จะลอง ping ไปยัง Clie ดูก็ได้ครับ:

[kitt@yggdrasil kitt]$ ping 192.41.170.217
PING 192.41.170.217 (192.41.170.217) from 192.41.170.225 : 56(84) bytes of data.
64 bytes from 192.41.170.217: icmp_seq=1 ttl=254 time=15.1 ms
64 bytes from 192.41.170.217: icmp_seq=2 ttl=254 time=4.89 ms
64 bytes from 192.41.170.217: icmp_seq=3 ttl=254 time=1.31 ms
64 bytes from 192.41.170.217: icmp_seq=4 ttl=254 time=0.431 ms

ถ้าได้ขนาดนี้ Clie ก็ท่องอินเทอร์เน็ตได้ละ .. :D

มีข้อสังเกตเล็กน้อยที่ผลของคำสั่ง ping .. 192.41.170.217 และ 192.41.170.225 อยู่ในเครือข่ายเดียวกันคือ 192.41.170.0/24 ซึ่งปกติแล้วเมื่อสั่ง ping ค่า TTL (Time-To-Live) ของแพคเก็ตจะเป็น 64 หรือ 255 .. แต่ในกรณีนี้ TTL=254 เพราะแพคเก็ตต้อง forward ข้าม eth0 ไปยัง ppp0 ที่เชื่อมกับ Clie (เสมือนกับมีเราท์เตอร์คั่นอยู่ 1 hop) ทำให้ TTL มีค่าลดลงไป 1 ค่า

ถ้าไม่มีไอพีสำหรับ Clie

ในกรณีที่ไม่มีไอพีแอดเดรสที่จะกำหนดให้กับ Clie ก็ต้องทำ IP Masquerading บน eth0 กันล่ะครับ เพื่อให้ Clie ใช้ private IP เชื่อมต่ออินเทอร์เน็ตได้ผ่านทาง Peorth .. เอาล่ะครับ เช็คเคอร์เนลกันก่อนเลย

Networking option:
CONFIG_NETFILTER=y

IP: Netfilter Configuration:
CONFIG_IP_NF_CONNTRACK=y or m
CONFIG_IP_NF_IPTABLES=y or m
CONFIG_IP_NF_NAT=y or m
CONFIG_IP_NF_NAT_NEEDED=y
CONFIG_IP_NF_TARGET_MASQUERADE=y or m

จัดการเคอร์เนลเสร็จเรียบร้อยแล้วก็

[root@peorth root]# cat "1" > /proc/sys/net/ipv4/ip_forward
[root@peorth root]# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

คำสั่งนี้เป็นการทำ IP Masquerading อย่างง่ายๆ ครับ ถ้าใครเลือกคอมไพล์ออพชันต่างๆ เป็นโมดูลก็ลอง lsmod ดูครับ

ipt_MASQUERADE          2168   1  (autoclean)
iptable_nat            21272   1  (autoclean) [ipt_MASQUERADE]
ip_conntrack           27336   1  (autoclean) [ipt_MASQUERADE iptable_nat]
ip_tables              14904   4  [ipt_MASQUERADE iptable_nat]

ทีนี้ก็กด Connect ใน Pref ==> Network ==> [Connect] ของ Clie แล้วก็

[root@peorth root]# pppd /dev/usb/ttyUSB0 115200 10.0.0.1:10.0.0.2  ms-dns 192.41.170.15 noauth nodetach

ก็จะปรากฏ

Using interface ppp0
Connect: ppp0  /dev/usb/ttyUSB0
Cannot determine ethernet address for proxy ARP
local  IP address 10.0.0.1
remote IP address 10.0.0.2

จะเห็นว่าไอพีแอดเดรสของ Clie ตอนนี้ถูกกำหนดเป็น 10.0.0.2 แทน แต่ Clie ก็ยังใช้งานอินเทอร์เน็ตได้เหมือนกับ public IP จะต่างกันก็ตรงที่เครื่องอื่นๆ ไม่สามารถ ping ไปยัง Clie ได้เพราะมัน masquerade อยู่นั่นเอง .. ข้อสังเกตอีกอย่างคือ กรณีที่ทำ IP Masquerading เครื่อง Clie จะอยู่ใน private network จึงไม่จำเป็นต้องใช้ proxy ARP

แต่ไม่ว่าจะยังไง คราวนี้ก็ผมก็ sync AvantGo ผ่าน Mobile Link หรือ AG Connect ได้ไม่ยากแล้ว หรือจะเช็คเมล์ ไอซีคิว ฯลฯ ก็ยังไหว .. โฮ่ๆๆ :D

อื่นๆ

สำหรับลินุกซ์ทะเล RedHat และดิสตริบิวชั่นที่มีพื้นฐานจาก RedHat สามารถกำหนดให้ทำ IP Forwarding ถาวรเลยก็ได้ครับ โดยเพิ่มบรรทัด

FORWARD_IPV4=true

เข้าไปใน /etc/sysconfig/network แต่ผมไม่แนะนำให้ทำ เพราะเราคงไม่ได้ต่อ Clie ใช้อินเทอร์เน็ตบ่อยครั้งนัก จึงไม่จำเป็นต้องเปิด IP Forwarding ไว้ตลอดเวลา เขียนเชลล์สคริปต์ให้ทำงานเป็นครั้งๆ ไปจะดีกว่า .. ส่วนออพชั่นของเคอร์เนลถ้าเป็นไปได้ก็ควรเลือกคอมไพล์เป็นโมดูลด้วยเหตุผลเดียวกัน

คำสั่ง pppd จำเป็นต้องเรียกใช้ “หลัง” สั่ง Connect ที่ Clie เพราะดีไวซ์ /dev/usb/ttyUSB0 จะไม่ปรากฏในระบบจนว่า Clie จะเริ่มการเชื่อมต่อเข้ามาทาง USB .. หากเรียก pppd ก่อนสั่ง Connect จะมี error message ขึ้นมาประมาณว่า

Failed to open /dev/usb/ttyUSB0: No such device

ส่วนเวลาที่สั่ง disconnect ที่ Clie pppd มักจะค้างและมี error ขึ้น เป็นเพราะว่าดีไวซ์ /dev/usb/ttyUSB0 มันหายไปจากระบบแล้ว pppd จึงไม่สามารถสั่ง flush ดีไวซ์ได้ ให้กด Ctrl+C เพื่อออกจาก pppd

สุดท้าย .. หากอะไรๆ ไม่เป็นไปอย่างที่คาดหวัง หรือไม่เป็นไปตามที่ผมเขียนๆ ไว้ .. ลอง tail /var/log/message lsmod modprobe tcpdump man และ google อาจจะพอช่วยได้ .. ไปนอนล่ะคร้าบบ