NAT แบบเร็วๆ

อัดรูปดิจิตอล ทำสมุดภาพของคุณเอง
รอรับได้. ท่องเที่ยว แต่งงาน ฯลฯ

www.tanabutr.co.th/photobook


พอดี router แบบ wireless ที่บ้านเสียเลยต้องใช้ router billion ที่มันมี LAN interface ตัวเดียวต่อกับเครื่อง desktop Ubuntu ส่วนเครื่องโน้ตบุคที่เคยใช้ wireless ก็ใช้ไม่ได้ wireless แล้ว. เผอิญ desktop มี LAN card สองตัวเลยทำ NAT ให้เครื่องโน้ตบุคต่อผ่านแบบเร็วๆ

ทำด้วยมือก่อน

ก่อนอื่นต้องรู้ว่าการที่จะทำให้เครื่อง desktop เป็นเสมอ router ได้ต้องให้มันยินยอมส่งผ่าน (forward) แพ็กเก็ตจากเน็ตเวิร์กหนึ่งไปอีกที่หนึ่งก่อน ตรงนี้ทำได้ด้วยการตั้งค่าบอกเคอร์เนลว่าให้ยินยอมส่งผ่านแพ็กเก็ตได้

$ sudo -i
# echo 1 > /proc/sys/net/ipv4/ip_forward

ทำไมต้อง echo 1 ? ตอบง่ายๆก็เหมือนกับ 1 แทน true ตั้งค่ายินยอม, ในทางกลับกันค่าเริ่มต้นที่อยู่ในไฟล์ ip_forward มันเป็น 0 หมายความว่าไม่ยอมส่งผ่านแพ็กเก็ต. เราจึงต้องตั้งค่าให้เป็น 1. ส่วนไฟล์ที่อยู่ใต้ /proc นั้นเป็นไฟล์ปลอมๆที่ใช้ติดต่อหรือตั้งค่าให้เคอร์เนล. ถ้าไม่ echo 1 ก็ใช้คำสั่ง sysctl ก็ได้.

ต่อไปเซ็ตให้ desktop ทำงานเป็น NAT (Network Address Translation) โดยใช้คำสั่ง iptables.

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

มีความหมายว่าให้ส่งผ่านเน็ตเวิร์กออกไปที่ eth0 โดย translate IP ให้ด้วย. ตรงนี้อธิบายกันยาว, ขอผ่าน. เช็คให้แน่ใจด้วยการแสดงค่าที่ตั้งไปแล้ว

# iptables -t nat -L

สมมติว่าโน้ตบุคต่อสาย cross UTP กับ eth1 ก็ตั้งให้ IP อยู่ใน subnet เดียวกันแล้วให้มี default gateway มาที่เครื่อง desktop ก็จะใช้อินเทอร์เน็คได้. อย่าลืมตั้งค่า DNS ให้ด้วย.

เอาให้สบายกว่านั้นก็ทำเครื่อง desktop ให้เป็น dhcp server ด้วยเลย. วิธีทำเคยเขียนนานมาแล้ว (แพ็กเกจใน Ubuntu ชื่อ dhcpd). แต่บน Ubuntu ต่างกันเล็กน้อยเลยขอจดไว้หน่อย

# apt-get install dhcpd

มันจะ start dhcpd server หลังจากติดตั้งเสร็จ แต่ไม่ทำงานเพราะยังไม่มีไฟล์ตั้งค่าเริ่มต้น. ลองคลำๆดู ก็เห็นว่ามีไฟล์ /etc/init.d/dhcp ก็เลยเปิดดู, พบว่า

# Defaults
INTERFACES="eth0"

# Reads config file (will override defaults above)
[ -r /etc/default/dhcp ] && . /etc/default/dhcp

ก็เลยเปลี่ยน eth0 ให้เป็น eth1 แล้วก็เปิดไฟล์ /etc/default/dhcp ดูต่อเลย

# Defaults for dhcp initscript
# sourced by /etc/init.d/dhcp
# installed at /etc/default/dhcp by the maintainer scripts

#
# This is a POSIX shell fragment
#

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#       Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACES="eth0"

ตรงนี้มันมีให้เซ็ต INTERFACES ด้วยและไฟล์นี้จะอ่านหลังจากที่เราตั้ง INTERFACES ในไฟล์ /etc/init.d/dhcp ก็หมายความว่าเราต้องเปลี่ยน eth0 เป็น eth1 ที่เดียวก็ได้

เสร็จแล้วก็ไปตั้งค่า /etc/dhcpd.conf ซึ่งเคยอธิบายไปแล้ว. แล้วทำงานได้

# /etc/init.d/dhcpd start

ดูในไฟล์ /var/log/syslog ถ้าเห็นอะไรลักษณะแบบนี้

...
Mar 13 00:14:49 poonlap-desktop dhcpd: DHCPREQUEST for 192.168.2.5 from 00:0e:7b:23:b2:71 via eth1
Mar 13 00:14:49 poonlap-desktop dhcpd: DHCPACK on 192.168.2.5 to 00:0e:7b:23:b2:71 via eth1
...

ก็แสดงว่าใช้ได้แล้วครับ.

สุดท้ายทำให้เป็น habbit ตั้งค่าไว้เลย. เอาพวกที่เขียนด้วยมือเมื่อกี้นี้มาเขียนในไฟล์ /etc/rc.local จะได้ครั้งหน้าเป็นเครื่องเลยจะได้ NAT เลย.

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
exit 0