Networking

การจัดการเครือข่ายด้วยเดเบียน

รู้จักกับ ifupdown

ก่อนจะเข้าเรื่อง network admin กัน ขอเรียกน้ำย่อยก่อน ด้วยการทำความรู้จักกับแพกเกจ ifupdown ที่ใช้เป็นกลไกในการตั้งค่าเครือข่ายของ debian แบบลงลึกสักหน่อย

เท้าความเรื่องคำสั่งระดับล่างสักนิด ว่าการที่คุณจะเชื่อมต่อเครื่องของคุณเข้าสู่อินเทอร์เน็ต โดยทั่วไป สิ่งที่จำเป็นต้องเซ็ตก็คือ

แต่ถ้าคุณใช้ dynamic IP จาก DHCP server ในเครือข่าย ก็สั่ง:

# dhclient [interface]

เพียงคำสั่งเดียว ก็จะได้ค่าต่างๆ ข้างต้นมาทั้งหมดจาก DHCP server

แต่ถ้าจะมาสั่งอย่างนี้ทุกครั้งที่เปิดเครื่อง ก็จะไม่สะดวก จำเป็นต้องมีการเก็บ config ไว้ในระบบ เพื่อให้เซ็ตค่าโดยอัตโนมัติเลย ซึ่ง debian จะใช้แพกเกจ ifupdown จัดการเรื่องนี้ โดยแฟ้มหลักที่จะเก็บค่า config จะอยู่ที่ /etc/network/interfaces โดยจะกำหนดเป็น "ย่อหน้า" ต่างๆ ขึ้นต้นด้วยคำหลัก ซึ่งที่เราจะได้ใช้บ่อยๆ ก็คือ iface และ auto

auto interface ...
ใช้บอกว่า ให้ up interface ต่างๆ ในรายการนี้ขณะบูต
iface interface inet {static|dhcp}
ใช้ระบุรายละเอียดของ interface ซึ่งถ้าเป็น dynamic IP ผ่าน DHCP ก็จบในบรรทัดได้ แต่ถ้าเป็น static IP ก็จะมีบรรทัดเพิ่มเติมในย่อหน้า คือ

  • address ip-address
  • netmask netmask
  • network network-address
  • broadcast broadcast-address
  • gateway gateway-address

โดยถ้าระบบของคุณคุณใช้ classful network ก็สามารถละบรรทัด netmask, network และ broadcast ได้

ตัวอย่างเช่น สำหรับเครื่องลูกข่ายที่ใช้ static IP:

auto eth0
iface eth0 inet static
    address 192.168.1.2
    gateway 192.168.1.1

หรือสำหรับเครื่องลูกข่ายที่ใช้ dynamic IP:

auto eth0
iface eth0 inet dhcp

ตั้งค่าแล้ว เวลาบูตครั้งต่อไปก็จะเปิด interface ด้วยค่าที่กำหนดโดยอัตโนมัติ แต่ถ้าต้องการสั่ง up/down interface จากบรรทัดคำสั่ง ก็เพียงแค่:

# ifup eth0

สำหรับการ up และ

# ifdown eth0

สำหรับการ down

ค่า config ต่างๆ ที่กล่าวถึงข้างต้นนี้ ถือว่าเพียงพอสำหรับเครื่องที่เชื่อมต่อ LAN แบบ ethernet โดยทั่วไปแล้ว แต่สำหรับเครือข่ายรูปแบบอื่น รายละเอียดปลีกย่อยในย่อหน้า iface นี่แหละ ที่จะทำให้ ifupdown มีความยืดหยุ่นมาก และมีการเชื่อมรวมกับเครื่องมืออื่นๆ เช่น wireless-tools, resolvconf, ipmasq ด้วย ดังที่จะได้กล่าวถึงในตอนต่อไป

ifupdown กับเครือข่ายไร้สาย

จาก ตอนที่แล้ว ที่ได้เกริ่นถึง ifupdown แบบปกติไปแล้ว คราวนี้จะมาดูการใช้งานลักษณะอื่นบ้าง โดยในตอนนี้จะกล่าวถึงการตั้งค่าเครือข่ายไร้สาย

ถ้าเครือข่ายของคุณเป็นแบบไร้สาย จะมีค่าพารามิเตอร์ของ Wi-Fi ที่ต้องเซ็ตด้วย ซึ่งคำสั่งสำหรับสั่งแบบ manual ก็คือ iwconfig ซึ่งอยู่ในแพกเกจ wireless-tools เช่น คำสั่งง่ายๆ สำหรับตรวจหา wireless interface ในเครือข่ายก็:

# iwconfig

จะตรวจ interface เครือข่ายทั้งหมด แล้วรายงานว่ามี wireless extension หรือไม่ ส่วนการกำหนดค่าพารามิเตอร์ Wi-Fi ก็ใช้คำสั่งเดียวกัน โดยระบุ interface ที่จะเซ็ต พร้อมด้วยพารามิเตอร์ต่างๆ เช่น

# iwconfig wlan0 mode managed essid my-essid \
key xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx

เป็นการกำหนดโหมดของ wireless interface ให้เป็นโหมด managed, ระบุ ESSID พร้อมกำหนด WEP key ของเครือข่าย

# iwconfig wlan0 mode ad-hoc channel 11 essid my-essid \
key xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx

กำหนดเป็นโหมด ad-hoc ใช้สัญญาณช่อง 11 ระบุ ESSID พร้อมกำหนด WEP key ของเครือข่าย

ค่าต่างๆ เหล่านี้ สามารถระบุใน /etc/network/interfaces เพื่อเป็นค่าตั้งสำหรับ ifupdown ได้ โดยใช้บรรทัดกำหนดค่าต่างๆ โดยเติม wireless_ ข้างหน้า เช่น

iface wlan0 inet dhcp
    wireless_mode managed
    wireless_essid my-essid
    wireless_key   xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx

หรือ

iface wlan0 inet static
    # wireless parameters
    wireless_mode ad-hoc
    wireless_channel 11
    wireless_essid my-essid
    wireless_key   xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx
    # IP
    address  192.168.1.2
    gateway  192.168.1.1

แต่ถ้าระบบของคุณใช้ WPA ก็สามารถกำหนดได้เหมือนกัน โดยต้องติดตั้งแพกเกจ wpasupplicant เพิ่ม แต่คำสั่งระดับล่าง (wpa_supplicant และ wpa_cli) นั้น ค่อนข้างซับซ้อน โดยแบ่งเป็น daemon และการเชื่อมต่อด้วยบรรทัดคำสั่ง ในที่นี้ ขอข้ามไปพูดถึงการเชื่อมรวมกับ ifupdown เลยละกัน

บรรทัดที่เกี่ยวกับ WPA จะขึ้นต้นด้วย wpa- เช่น

iface wlan0 inet dhcp
    wpa-driver hostap
    wpa-ssid   my-essid
    wpa-psk    passphrase

เป็นการกำหนดให้ใช้ driver hostap, กำหนด SSID และวลีรหัสผ่าน ซึ่งอาจจะเป็นข้อความเปล่า หรือค่าเลขฐานสิบหกที่แปลงจากข้อความเปล่าก็ได้ (ตามที่กำหนดที่ access point)

ยังมีค่าอื่นๆ ที่เป็นไปได้อีก ซึ่งรายละเอียดของ WPA ค่อนข้างเยอะ คุณอาจศึกษาได้จากแฟ้ม /usr/share/doc/wpasupplicant/README.mode.gz ในเครื่องของคุณ ซึ่งในนั้น จะอธิบายถึงการเซ็ตโหมด roaming เพิ่มเติมจากโหมด managed ด้วย

ขออภัยด้วยที่คำอธิบายเกี่ยวกับ WPA สั้นไปหน่อย เพราะยังไม่มีโอกาสได้ใช้เองนั่นเอง ถ้าใครมีประสบการณ์ ช่วยมาแบ่งปันกันบ้างก็ดีนะครับ

ก่อนจบ แถมคำสั่งสำหรับสแกนหาเครือข่ายไร้สายที่อยู่ใกล้:

# iwlist interface scanning

ifupdown กับแล็ปท็อปพเนจร

พูดถึง ifupdown พื้นฐาน และ การใช้กับเครือข่ายไร้สาย ไปแล้ว คราวนี้ มาพูดถึงการใช้งานอีกแบบหนึ่ง ซึ่งเหมาะสำหรับเครื่องที่เปลี่ยนเครือข่ายบ่อย เช่น แล็ปท็อป คือการทำโพรไฟล์เครือข่าย

สมมุติว่าคุณหิ้วแล็ปท็อปไป ๆ มา ๆ เป็นประจำ 2-3 ที่ ที่บ้านใช้เครือข่ายไร้สายแบบ static IP แบบมี WEP key ที่สำนักงานใช้ DHCP แบบมี WPA และที่ไซต์งานใช้ DHCP แบบล็อค MAC address การเซ็ตค่าใหม่ทุกครั้งคงไม่สะดวก แต่คุณสามารถทำโพรไฟล์ของเครือข่ายต่างๆ เก็บไว้ แล้วเลือกใช้เอาตามต้องการได้

ย่อหน้า iface นั้น ไม่จำเป็นต้องตามด้วยชื่อ interface เสมอไป แต่คุณสามารถตั้งชื่อโพรไฟล์ตามใจชอบได้ เช่น ในกรณีดังกล่าว ก็อาจจะทำโพรไฟล์ home, office, site เตรียมไว้ดังนี้:

iface home inet static
    # wireless parameters
    wireless_mode ad-hoc
    wireless_channel 11
    wireless_essid my-essid
    wireless_key   xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx
    # IP
    address 192.168.1.2
    gateway 192.168.1.1

iface office inet dhcp
    wpa-driver hostap
    wpa-ssid   my-essid
    wpa-psk    passphrase

iface site inet dhcp
    wireless_mode managed
    wireless_essid site-essid

จากนั้น เมื่อคุณไปใช้เครือข่ายไหน ก็เลือกสั่ง ifup โดยใช้รูปแบบ interface=profile เช่น เมื่อกลับมาบ้านก็สั่ง:

# ifup wlan0=home

อย่างไรก็ดี ยังมีอีกจุดหนึ่งที่ขาดไป คือ DNS server จะเห็นว่า ในตัวอย่างข้างต้น เมื่อคุณไปใช้เครือข่าย DHCP จะไม่มีปัญหาอะไร เพราะมักจะได้ DNS server มาพร้อมกับข้อมูล DHCP อยู่แล้ว แต่พอกลับมาบ้าน ซึ่งใช้ static IP ค่า DNS server นั้นจะยังอยู่ และคุณจะไม่สามารถใช้ DNS ของเครือข่ายก่อนได้

มีแพกเกจที่มาเสริมตรงนี้ คือ resolvconf

# aptitude install resolvconf

แพกเกจ resolvconf นี้ จะช่วยจัดการปรับแฟ้ม /etc/resolv.conf ให้โดยอัตโนมัติ โดยมีการเชื่อมร่วมกับ ifupdown ผ่านบรรทัดที่ขึ้นต้นด้วย dns- ตามด้วยบรรทัดใน /etc/resolv.conf ที่ต้องการ เช่น สมมุติว่าคุณตั้ง DNS server ที่บ้านไว้ที่ 192.168.1.1 และใช้ myhome.com เป็น search domain ก็อาจจะเพิ่มบรรทัดดังนี้:

iface home inet static
    # wireless parameters
    wireless_mode ad-hoc
    wireless_channel 11
    wireless_essid my-essid
    wireless_key   xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx
    # IP
    address 192.168.1.2
    gateway 192.168.1.1
    # resolvconf
    dns-search     myhome.com
    dns-nameserver 192.168.1.1

ซึ่งเมื่อสั่ง ifup wlan0=home ก็จะเอาบรรทัดที่ขึ้นต้นด้วย dns- ไปตัดส่วนหน้าออกแล้วสร้างเป็นเนื้อหาของ /etc/resolv.conf ดังนี้:

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
search     myhome.com
nameserver 192.168.1.1

นอกจากเชื่อมรวมกับ ifupdown แล้ว resolvconf ยังมีการสื่อสารต่อไปถึงแพกเกจบริการอินเทอร์เน็ตอื่นๆ ที่เกี่ยวข้องกับแฟ้ม /etc/resolv.conf นี้ด้วย เช่น bind9 (ในกรณีที่กำหนดเป็น caching DNS), dnsmasq, squid เป็นต้น ทำให้ผลของการเปลี่ยนเครือข่ายกระจายไปครบทุกที่โดยอัตโนมัติ

ตั้ง internet gateway อย่างง่าย ด้วย ipmasq

การตั้ง internet gateway ภายในบ้าน หรือในองค์กร เพื่อใช้หมายเลขไอพีหมายเลขเดียวที่ได้มาเป็นทางผ่านสู่อินเทอร์เน็ตให้กับเครื่องลูกข่าย ทำได้ด้วยเทคนิคที่เรียกว่า IP Masquerade และสามารถเขียนกฎ firewall ในการกรองแพ็กเก็ตต่างๆ ได้ด้วย ทั้งหมดนี้ อาศัยกลไกในเคอร์เนลลินุกซ์ที่เรียกว่า netfilter (สำหรับเคอร์เนล 2.4 ขึ้นไป ถ้าเป็นรุ่นเก่ากว่านั้นจะเป็น ipchain และ ipfwadm) คำสั่งที่ใช้ตั้งกฎก็คือ iptables

ฟังดูยุ่งยาก แต่ในเดเบียนมีแพกเกจที่ช่วยให้ตั้งเกตเวย์ได้อย่างรวดเร็ว คือ ipmasq ซึ่งจะมีคำสั่งช่วยตรวจสอบ route table แยกแยะ interface ที่เป็น public IP และเครือข่ายภายใน แล้วสร้างกฎ iptables เพื่อให้ทำ IP masquerade จากภายในสู่ภายนอก พร้อมทั้งทำ firewall กันแพ็กเก็ตจากภายนอกโดยอัตโนมัติ

รู้หน้าที่คร่าวๆ แล้ว ก็ติดตั้งกันเลย

# aptitude install ipmasq

คำถามระหว่างติดตั้ง ก็มีนิดหน่อย คือถามว่าจะคำนวณ iptables ใหม่เมื่อเปิด PPP หรือไม่ ตรงนี้ก็มีประโยชน์ถ้าคุณเชื่อมต่ออินเทอร์เน็ตผ่านโมเด็ม 56k ด้วย PPP

จากนั้น ทำความรู้จักกับคำสั่งนิดหนึ่ง คือเมื่อใดก็ตาม ที่คุณต้องการคำนวณกฎ iptables ใหม่ ก็สั่งคำสั่ง ipmasq ได้เลย และถ้าจะทำให้เป็นอัตโนมัติ วิธีที่แนะนำก็คือ กำหนดให้คำนวณกฎใหม่ใน ifupdown โดยเพิ่มบรรทัด up, down ในแฟ้ม /etc/network/interfaces เช่น สมมุติว่า eth0 เป็นช่องที่ต่อออกสู่อินเทอร์เน็ต และ eth1 เป็นช่องที่ต่อกับเครือข่ายภายใน

iface eth0 inet static
    address 192.168.1.1
    gateway gateway-ip
    up      /usr/sbin/ipmasq
    down    /usr/sbin/ipmasq -r /etc/ipmasq/ipmasq-down

iface eth1 inet static
    address 192.168.2.1
    up      /usr/sbin/ipmasq
    down    /usr/sbin/ipmasq -r /etc/ipmasq/ipmasq-down

ต่อไป เมื่อคุณสั่ง ifup, ifdown (หรือตอนบูตเครื่อง) ก็จะมีการคำนวณ IP masquerading โดยอัตโนมัติ จบแล้ว! แค่นั้นแหละ สำหรับการตั้งเกตเวย์อย่างง่าย ง่ายไหมล่ะ?

ทีนี้ สมมุติว่าคุณอยากปรับแต่งกฎ ก็สามารถเข้าไปดูกฎได้ที่ไดเรกทอรี /etc/ipmasq/rules/ ในนั้นชื่อกฎจะเรียงตามขั้นตอนต่างๆ คือ

ชื่อกฎนั้น ค่าปกติจะลงท้ายด้วย .def แต่ถ้ามีกฎชื่อเดียวกันแต่ลงท้ายด้วย .rul ก็จะถูกใช้แทน (ใช้เวลาจะเขียนกฎเองทับค่าเดิม)

กฎของ ipmasq จะซอยย่อยเป็นเรื่องๆ เพื่อให้เพิ่ม-ลดได้ง่ายๆ ค่าปกติที่ให้มานั้น จะทำ IP masquerade จากเครือข่ายภายในออกสู่ภายนอก และกันแพ็กเก็ตภายนอกไม่ให้เข้ามาภายใน ซึ่งถือว่าปลอดภัยสำหรับเครือข่ายทั่ว ๆ ไปอยู่แล้ว แต่ถ้าคุณต้องการเพิ่มกฎเข้าไปอีก เช่น การทำ transparent proxy ก็สามารถคัดลอกไปจาก /usr/share/doc/ipmasq/examples/ ได้ เดี๋ยวไว้พูดถึงการทำ transparent proxy ในตอนหน้าครับ

ipmasq กับการทำ transparent proxy

ตามที่ติดค้างไว้ใน ตอนที่แล้ว เกี่ยวกับการทำ internet gateway ด้วย ipmasq ว่าจะพูดถึงการทำ transparent proxy นะครับ ซึ่งก็ไม่ยากอย่างที่คิด

หลักการคือ ให้ส่งต่อแพ็กเก็ตจากเครื่องภายในที่ติดต่อไปยังพอร์ต 80 ให้ไปที่พอร์ตของ HTTP proxy (เช่น 3128 หรือพอร์ตอื่นตามแต่กำหนดขณะติดตั้งพร็อกซี) เพื่อที่การติดต่อเว็บจากเครื่องในเครือข่ายภายใน จะได้ผ่านพร็อกซีเสมอ โดยไม่ต้องตั้งค่าพร็อกซีอีก

เริ่มจากติดตั้ง squid proxy ก่อน

# aptitude install squid

แล้วตั้งค่า squid ตามปกติ อาจจะทดสอบการทำงานของพร็อกซี โดยเปิดเว็บเบราว์เซอร์ในเครื่องลูก แล้วตั้งค่าพร็อกซีก่อนเปิดเว็บต่าง ๆ ดูก่อน แล้วดู access log ของ squid ที่ /var/log/squid/access.log ว่ามี request เข้ามา

จากนั้น ตั้งค่า squid ที่ /etc/squid/squid.conf ให้เป็น transparent proxy (สำหรับ squid 2.6 ขึ้นไป):

http_port 3128 transparent

แล้วก็คัดลอกตัวอย่าง transparent proxy ของ ipmasq มา:

# cp /usr/share/doc/ipmasq/examples/basics/I89tproxy.rul \
/etc/ipmasq/rules/

แล้วแก้หมายเลขพอร์ตของพร็อกซีใน /etc/ipmasq/rules/I89tproxy.rul ซึ่งค่าปกติเป็น 8081 ให้เป็นหมายเลขพอร์ตที่เรากำหนดไว้ใน /etc/squid/squid.conf เช่น ในที่นี้เราใช้พอร์ต 3128 ก็ค้นหาและแทนที่ 8081 ด้วย 3128 ทั้งแฟ้ม

จากนั้น เมื่อสั่ง ipmasq เพื่อคำนวณ iptables ใหม่อีกครั้ง ก็จะได้ transparent proxy เรียบร้อย