Pages

3/20/2013

DNS Tunneling with Iodine

หลังจาก เล่าเรื่องวิธีการ by-pass wifi login ด้วยการใช้ tunneling ไปแล้วในบทความที่แล้ว http://blog.anidear.com/2013/03/use-tunneling-to-bypass-wifi.html

DNS Tunneling

คราวนี้มาลองดูว่าถ้าจะ setup ระบบที่เป็น DNS Tunneling จะต้องทำอะไรบ้าง

โดยในบทความนี้ จะใช้ Iodine ในการทำ
(ภาพจาก http://periodictabledesign.com/wp-content/uploads/s002/iodine.jpg)

Iodine เป็นโปรแกรม open source ที่เอาไว้สำหรับสร้าง tunnel ผ่าน DNS protocol (UDP port 53) โดยตัว iodine จะมีโปรแกรมทั้ง 2 ส่วน ทั้ง client และ server

ที่น่าสนใจอีกอย่างคือ คำว่า iodine (ไอโอดีน) เป็น ธาตุที่มีเลขอะตอมเท่ากับ 53 ซึ่งตรงกับเลข port  ที่ใช้ของ DNS protocol เลย

การติดตั้งฝั่ง Server

Iodine เป็น open source ที่มีการ compile ไว้เรียบร้อยแล้วสำหรับระบบต่างๆ ไม่ว่าจะเป็น Windows, Mac, Linux (FreeBSD,OpenBSD,Gentoo,Debian,Arch,Fedora,Ubuntu,Mandriva,Backtrack), ถึงขนาด Android ก็มี native binary file ให้เลยทีเดียว

เนื่องจาก server ที่ผมใช้เป็น RaspBian (บน Raspberry Pi) ซึ่งมาจากระบบ Debian ก็เลยสามารถใช้ APT เพื่อดึงโปรแกรมมาลงได้เลย ด้วยคำสั่ง
sudo apt-get install iodine
เมื่อลงเสร็จแล้ว iodine จะมีไฟล์ให้รันทั้งแบบ server (ชื่อไฟล์ iodined) และ แบบ client (ชื่อไฟล์ iodine) ทั้งคู่เลย

โดยถ้าจะทดลองรันในแบบ server ก็จะใช้คำสั่งว่า
sudo iodined -f -P test 10.0.0.1 anidear.com
โดย

  • -f  เป็น ตัวบอกให้ iodined รันในโหมดที่แสดงการทำงานของโปรแกรมออกมาทางหน้าจอ
  • -P test  เป็นการตั้ง password ให้กับ tunnel  ในที่นี้ใช้คำว่า test
  • 10.0.0.1  เป็น IP ของเครื่อง server นี้หลังจาก tunnel ได้ถูกสร้างขึ้นแล้ว
  • anidear.com  เป็น ชื่อต้นของ domain ที่จะใช้ในการแทรกข้อมูลในการทำ DNS tunneling เข้าไป

หน้าตาจะออกมาประมาณนี้



การติดตั้งฝั่ง Client

ส่วนฝั่ง client ถ้าจะทดลองในการติดต่อมาหา server ตัวนี้  ก็สามารถลงตัว iodine ด้วยวิธีเดียวกัน (ถ้าเป็น debian base linux) หรือใช้การดาวน์โหลดจาก http://code.kryo.se/iodine/ สำหรับ OS ตัวอื่นๆ

เมื่อติดตั้งฝั่ง client เสร็จแล้ว ก็จะทดลองติดต่อข้อมูลไปหา server ด้วยคำสั่ง
sudo iodine -fP test 192.168.1.33 anidear.com
โดย

  • -f  เป็น การรันในโหมดที่แสดงผลของโปรแกรมผ่านทางหน้าจอ 
  • -P test  เป็น การใส่ password ตอนติดต่อกับ iodined server
  • 192.168.1.33  เป็น หมายเลขไอพี ของ server ที่จะติดต่อไปหา (ซึ่งถ้าเป็นกรณีรันจริงๆ ตรงนี้จะต้องเป็น public IP address ของ server)
  • anidear.com  เป็น ชื่อต้นของ domain ที่จะใช้ในการทำ DNS tunneling

โดยหน้าตาเมื่อลองรันคำสั่งข้างต้น ผลจะออกมาแบบนี้

จะเห็นว่า เมื่อติดต่อสำเร็จ  ฝั่ง client จะเสมือนมีการ์ด network interface ที่ชื่อ "dns0" ขึ้นมา โดยจะถูกจ่าย IP หมายเลข 10.0.0.2 ให้

และ interface ตัวนี้นี่เอง ที่เป็น tunnel ที่เราจะเอาไว้ใช้เหมือนกับ VPN โดยจะให้ข้อมูลที่เราต้องการออก internet วิ่งผ่านช่องทางนี้

อันนี้เป็นการทดสอบเล็กๆน้อยๆกับ tunnel บน dns0 interface นี้


ทีนี้ลองมาดูว่า ข้อมูลที่วิ่งออกวิ่งเข้า โดยผ่าน DNS Tunnel นี่หน้าตาเป็นยังไง

ในรูปนี้ คือการใช้โปรแกรม Wireshark เพื่อทำการดักข้อมูลบน eth0 ซึ่งเป็นการ์ดตัวต้นที่เราใช้สร้าง DNS tunnel (dns0)


นี่เป็นการดักข้อมูล ในขณะที่ฝั่ง client ทำการเปิดหน้าเว็บเพจ ผ่านทาง DNS tunnel ของเรา

เนื่องจาก DNS Tunnel จะแก้ไข DNS packet ให้แตกต่างไปจากธรรมดา เพื่อที่จะยัดข้อมูลลงไปได้ ดังนั้น Wireshark จึงขึ้นแถบสีแดงขึ้นและบอกว่า DNS packet นี้อ่านไม่ออก เพราะมันไม่อยู่ในรูปแบบมาตรฐาน


พอเปิด follow UDP stream จะเห็นว่า ไม่มีส่วนไหนที่อ่านออกเลย
ทั้งๆ ที่ปกติจะใช้การติดต่อแบบ HTTP protocol จะเป็น plain text แปลว่า ข้อมูลควรจะไม่ได้มีการเข้ารหัส และ ควรจะสามารถ เห็นข้อมูลได้โดยตรง ... แต่นี่ไม่เห็นเลย เพราะ iodine ทำการเข้ารหัสข้อมูลไว้ให้ด้วย

ติดตั้งฝั่ง Server ต่อ ให้ใช้งานได้จริง

หลังจากเรารู้แล้วว่าระบบนี้มันใช้งานได้  ก็ถึงเวลาเอาขึ้นไปรันในระบบจริง

ขอสรุปคร่าวๆละกัน

โดย สิ่งที่จะต้องมีคือ

  • public IP address สำหรับ server (อาจจะใช้ เน็ตบ้านและตั้ง router ให้ forward port 53 ก็ได้)
  • domain name
  • เครื่อง server ที่จะเปิดตลอดเวลา
ถ้าลงระบบผ่าน apt-get install เมื่อติดตั้งแล้ว จะมี config ของระบบอยู่ที่ไฟล์ /etc/default/iodine

โดยค่ามาตรฐานเป็น
# Default settings for iodine. This file is sourced from
# /etc/init.d/iodined
START_IODINED="false"
IODINED_ARGS=""
IODINED_PASSWORD=""

เราสามารถ config ได้แบบง่ายๆ ด้วยการรันคำสั่ง
dpkg-reconfigure iodined
ซึ่งจะมีหน้าจอ wizard ให้กด Next ไปเรื่อยๆได้

หรืออาจจะเลือกแก้ไขด้วยตัวเอง  ก็คือแก้ไฟล์ /etc/default/iodine ให้มีค่าเป็นแบบนี้
# Default settings for iodine. This file is sourced from
# /etc/init.d/iodined
START_IODINED="true"
IODINED_ARGS="10.0.0.1 anidear.com"
IODINED_PASSWORD="test"


เมื่อ save ไฟล์แล้วก็เริ่มเปิดการใช้งาน service นี้ด้วยคำสั่ง
sudo service iodined start
และนี่ก็จะจบการติดตั้งฝั่ง Server

หลังจากนั้น ก็ต้องไปยุ่งกับ domain ต่อ โดยการไปตั้งให้ domain หรือ sub-domain ชี้ไปหาเครื่อง server ที่เราติดตั้ง iodined ไว้
โดยจะต้องตั้งค่า DNS ไว้แบบนี้
dns A 202.xxx.xxx.xxx
tunnel NS dns.anidear.com 
โดยบรรทัดแรกจะระบุว่า  sub-domain ที่ชื่อ "dns.anidear.com" จะชี้ไปหา IP หมายเลข 202.xxx.xxx.xxx
และบรรทัดที่สองจะบอกว่า ถ้า sub-domain ชื่อ "tunnel.anidear.com" รองรับการติดต่อด้วย DNS protocol โดยใช้ที่อยู่ IP เดียวกับ "dns.anidear.com"

เมื่อตั้งค่าเสร็จแล้ว  อาจจะทดลองระบบโดยการใช้ตัวเช็ค DNS Tunnel ของผู้สร้าง Iodine ก็ได้
โดยนำ domain ที่ได้ไปเช็คที่ http://code.kryo.se/iodine/check-it/


ถ้าผลลัพธ์ออกมาเป็น
Well done, your iodine setup seems fine!
ก็หมายถึงว่า การติดตั้งสำเร็จ และพร้อมใช้งาน ^_^

ทดสอบการใช้งานผ่าน domain จริง

ทดสอบ connect ผ่านเครือข่าย 3G

$ sudo iodine -fP test 202.xxx.xxx.xxx tunnel.anidear.com
Opened dns0
Opened UDP socket
Sending DNS queries for tunnel.anidear.com to 202.xxx.xxx.xxx
Autodetecting DNS query type (use -T to override).
Using DNS type NULL queries
Version ok, both using protocol v 0x00000502. You are user #0
Setting IP of dns0 to 10.1.1.2
Setting MTU of dns0 to 1130
Server tunnel IP is 10.1.1.1
Testing raw UDP data to the server (skip with -r)
Server is at 192.168.1.33, trying raw login: ....failed
Using EDNS0 extension
Switching upstream to codec Base128
Server switched upstream to codec Base128
No alternative downstream codec available, using default (Raw)
Switching to lazy mode for low-latency
Server switched to lazy mode
Autoprobing max downstream fragment size... (skip with -m fragsize)
768 ok.. 1152 ok.. ...1344 not ok.. ...1248 not ok.. ...1200 not ok.. 1176 ok.. ...1188 not ok.. will use 1176-2=1174
Setting downstream fragment size to max 1174...
Connection setup complete, transmitting data.

แปลว่าต่อติดเรียบร้อย และลองเปิดเว็บแล้วก็ใช้งานได้จริงๆ

Reference


No comments:

Post a Comment