ใช้ Raspberry Pi ทำ Wifi Access Point, Transparent Proxy (web ด้วย)

โจทย์มีว่า ต้องการใช้ผู้ใช้งาน ใช้งานผ่าน wifi

Raspberry Pi 3 มี Wifi ในตัวและมี Ethernet port อีก 1 มี USB อีก 4 ช่อง

การเชื่อมต่อออกเน็ตก็สามารถทำผ่านการเชื่อมทาง Ethernet port ซึ่งก็น่าจะธรรมดาทั่วไป แต่ไม่สะดวกตรงที่ต้องเดินสายเชื่อมต่อ อยู่ที่บ้านก็คงไม่มีประเด็น แต่ถ้าจะเอาไปไหนมาไหนด้วย หรือเอาไปใช้งานในที่ต่าง ๆ เอาไปจัดงานครั้งคราว การเชื่อมต่อผ่าน wifi เพื่อออกอินเทอเน็ตน่าจะสะดวกกว่า ดังนั้นก็จะใช้ wifi ที่มีมาใน pi ต่อออกเน็ต พอใช้ต่อออกเน็ตแล้วจะ share internet ต่ออย่างไร

วิธีที่ 1 share ผ่านทาง  Ethernet port ด้วยการหา wifi access point มาต่ออีกตัว เอาสายต่อจาก WAN Port ของ access point มาที่  Ethernet port ของ pi ระหว่าง port นี้จะตั้งเป็น static ip address ก็ได้ หรือไม่ก็ให้ pi แจก IP ไปให้ access point

ผู้ใช้งานก็เกาะกับ wifi access point ข้อมูลก็วิ่งผ่านออกไปทาง pi ออกเน็ตไปทาง wifi ของ pi

แบบนี้ ลงโปรแกรมพวก แจก IP เช่น dnsmasq หรือ isc-dhcp ก็จบ ที่ใช้ dhcp ก็เพื่อจะได้ไม่ต้องมาตั้งค่า IP ให้ WAN port ของ access point จะได้ง่าย

/etc/dnsmasq.conf

interface=eth0
listen-address=172.24.1.1
bind-interfaces
server=8.8.8.8
domain-needed
bogus-priv
dhcp-range=interface:eth0,172.24.1.10,172.24.1.250,12h

/etc/network/interfaces

allow-hotplug eth0
iface eth0 inet static
address 172.24.1.1
netmask 255.255.0.0

ใช้คำสั่ง iptables เพื่อควบคุมการส่งผ่านข้อมูล

sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
sudo iptables -A FORWARD -i wlan0 -o eth0 -m state –state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT

อย่าลืมแก้ไขในไฟล์ sudo nano /etc/sysctl.conf ลบเครื่องหมาย # หน้า net.ipv4.ip_forward=1 ออก หรือ พิมพ์ net.ipv4.ip_forward=1 เพิ่มเข้าไปถ้าไม่มี ถ้าอยากให้ทำงานทันทีโดยไม่ต้อง reboot เครื่อง ให้พิมพ์ sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

จากนั้นใช้คำสั่ง sudo sh -c "iptables-save > /etc/iptables.ipv4.nat" เพื่อเก็บคำสั่งของ iptables ไว้ แล้วเอาไปใส่ไว้ใน rc.local เพื่อที่เวลาเปิดเครื่องใหม่ มันจะได้ทำงานทุกครั้ง (ไม่ต้องมาพิมพ์ใหม่) แก้ไขไฟล์ rc.local ด้วยคำสั่ง sudo nano /etc/rc.local เพิ่มคำสั่งนี้เข้าไปก่อนบรรทัด exit 0

iptables-restore < /etc/iptables.ipv4.nat 

เสร็จแล้วก็

sudo service dnsmasq start

ยังไม่พอใจ แบกเอา access point ไปด้วยมันเกะกะ ต้องมีสองกล่อง

วิธีที่ 2 เพิ่ม wifi เข้าไปที่ Raspberry Pi อีกอัน ไปซื้อ usb wifi มาใส่ ข้อควรระวังคือ ส่วนใหญ่ถ้าใช้ usb wifi สำหรับต่อออก internet ไม่ค่อยมีปัญหากับยี่ห้อ แต่ถ้าจะใช้ แบบในรูป มาต่อแล้วจะให้มันเป็นทำตัวเป็น access point wifi แล้วละก็ ต้องระวังในการเลือกซื้อเป็นอย่างมาก เพราะ software (hostapd) ที่จะใช้มักมีข้อจำกัดเรื่อง driver ที่จะรองรับกับ chip ที่ใช้ใน usb wifi ถ้าเลือกมาไม่ตรงกับที่มันรองรับก็งานงอก ไม่เป็นไร ถ้าหาไม่ได้ เราก็ใช้ wifi on board ที่มีมากับ pi 3 ในการ share เป็น access point แทน

pi_wifi_IMG20170510004001

แล้วก็ออกเน็ตผ่าน usb wifi ที่ใส่เพิ่ม งานนี้ต้องลงโปรแกรมเพิ่มอีกตัวคือ hostapd

# ชื่อของ wifi interface ที่จะใช้ share
interface=wlan0
driver=nl80211

# ชื่อของ wifi access point
ssid=CAT-Register

hw_mode=g

# Use channel 6
channel=6
# Enable 802.11n
ieee80211n=1

# Enable WMM
wmm_enabled=1

# Enable 40MHz channels with 20ns guard interval
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]

มีแค่นี้ ถ้าไม่ต้องการให้มีการเข้ารหัสหรือถามรหัสผ่านเวลาที่จะเชื่อมต่อ

แต่ถ้าอยากให้ใส่รหัสเวลาเชื่อมต่อด้วยก็เพิ่ม

# Accept all MAC addresses
#macaddr_acl=0

# Use WPA authentication
#auth_algs=1

# Require clients to know the network name
#ignore_broadcast_ssid=0

# Use WPA2
#wpa=2

# Use a pre-shared key
#wpa_key_mgmt=WPA-PSK

# The network passphrase
#wpa_passphrase=raspberry

# Use AES, instead of TKIP
#rsn_pairwise=CCMP

ตัวอย่างเอามาจากที่นี่ https://frillip.com/using-your-raspberry-pi-3-as-a-wifi-access-point-with-hostapd/

ปัญหาที่เจอคือ ถ้า ใส่ผิดใส่ถูก ใส่ขาด ใส่เกิน แม่…ง ไม่ทำงานครับ ท่านผู้ชม อยากรู้ก็ไปลองเองละกัน เพราะปัญหานี้ทำเอาวนไปวนมาลองผิดลองดูมั่วไปเรื่อยอยู่สองวัน อย่าลืมตั้งค่า ip address ให้ wlan0 ด้วย

allow-hotplug wlan0
iface wlan0 inet static
address 192.168.9.1
netmask 255.255.255.0

เอาบรรทัดนี้ที่อยู่ใต้ wlan0 ออกด้วย  wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf ของ wlan1 ไม่ต้องเอาออก

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

source-directory /etc/network/interfaces.d

auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet static
address 172.24.1.1
netmask 255.255.0.0

allow-hotplug wlan0
iface wlan0 inet static
address 192.168.9.1
netmask 255.255.255.0

allow-hotplug wlan1
iface wlan1 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

อีกนิด แก้ไขไฟล์ sudo nano /etc/dhcpcd.conf ด้วยการเพิ่มคำสั่ง

denyinterfaces wlan0 denyinterfaces eth0

เอาไว้ก่อนคำสั่ง interface อื่นใด (ถ้ามี) เพื่อไม่ให้ interface เหล่านี้มันรับค่าจาก dhcp

แล้วก็ sudo service dhcpcd restart จากนั้นก็สั่ง

sudo ifdown wlan0

sudo ifup wlan0

sudo ifdown eth0

sudo ifup eth0

ถ้าไม่ได้ทำจาก console แล้ว remote เชื่อมเข้าไปผ่าน สายหรือ, Wifi ก็ระวังละกันตอน ifdown มันก็จะหลุดแล้วท่านก็จะเข้าไม่ได้ ดังนั้นยังไม่ทำตอนนี้ก็ได้ ให้เสร็จทุกอย่างแล้ว reboot เครื่องทีเดียว

เพิ่ม config ของ dnsmasq ให้จ่าย ip address ไปทาง wlan0 จะได้หน้าตาประมาณนี้

listen-address=172.24.1.1
listen-address=192.168.9.1
bind-interfaces
server=8.8.8.8
domain-needed
bogus-priv
dhcp-range=interface:eth0,172.24.1.10,172.24.1.250,12h
dhcp-range=interface:wlan0,192.168.9.1,192.168.9.250,1h

จัดการรับส่งข้อมูลระหว่าง interface ด้วย

sudo iptables -A FORWARD -i wlan1 -o wlan0 -m state –state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o wlan1 -j ACCEPT

จากนั้นก็ sudo sh -c "iptables-save > /etc/iptables.ipv4.nat" เพื่อ save ค่า

จากนั้น (ถ้า config ip address eth0, wlan0 แล้ว) ก็ลอง

sudo service hostapd start  
sudo service dnsmasq start 

หรือไม่ก็ sudo reboot รอ boot เสร็จก็ลองดูว่า มีสัญญาณ CAT-Register ปรากฎขึ้นไหมแล้วก็ลองเชื่อมต่อดูว่าเล่นเน็ตได้หรือไม่ สำหรับการเชื่อมต่อให้ wifi (wlan1) ออกเน็ตนั้นจะทำผ่าน GUI ของ rasbian pixel ก็ได้ (ง่ายดี) หรือ

ใส่ ssid ของ wifi เข้าไปในไฟล์   /etc/wpa_supplicant/wpa_supplicant.conf เช่น

network={
ssid=”CAT-Mobile”
key_mgmt=NONE
}

network={
ssid=”seal”
psk=”12345678″
key_mgmt=WPA-PSK
}

แล้วก็ restart networking (sudo service networking restart)

ท่อง web ได้แล้ว แต่กลัวช้า กลัวไม่แรงพอ ยัด proxy ลงไป ด้วย nginx

ใน /etc/nginx/sites-available/default

เพิ่ม

# Proxy server
#
server {
resolver 192.168.9.1;
access_log off;
listen 8080;
listen [::]:8080;

location / {
proxy_pass      $scheme://$host$request_uri;
proxy_set_header Host $http_host;
proxy_buffers   256 4k;
proxy_max_temp_file_size        0k;

}

}

จากนั้นก็ sudo service nginx restart

บังคับให้การเข้า web (ดัก 80 port) ให้วิ่งเข้า proxy ของ nginx ทาง 8080 port

sudo iptables -t nat -A PREROUTING -s 192.168.9.0/24 -p tcp –dport 80 -j DNAT –to 192.168.9.1:8080

อย่าลืม sudo sh -c "iptables-save > /etc/iptables.ipv4.nat" จะได้ไม่มีปัญหาเวลา boot เครื่องใหม่

จบข่าว

งานนี้ก็จะได้ raspberry pi 3 เก๋ หนึ่งเครื่อง บวก usb wifi หิ้วไปไหนมาไหนได้ เอาไว้ share net ได้สบายสบาย ทำอย่างอื่นได้ไหม ทำได้ อยู่แล้ว เพราะที่ทำไว้แบบนี้ ก็เพื่องานบางอย่าง ซึ่งอาศัยพื้นฐานของการตั้งค่าแบบนี้ ส่วนจะเอาไปทำอะไรได้นั้น ก็แล้วแต่ญาติโยมละเน้อ ยกตัวอย่างให้อันหนึ่ง เช่น เรามีสิทธิใช้งาน wifi แบบที่ต้องตรวจสอบ MAC Address และเราก็มีสิทธิให้ใช้ได้แค่ 10 อุปกรณ์ (10 ยังไม่พออีกเหรอ) พอมันครบสิบแล้ว แต่ถ้าเรามีอุปกรณ์ตัวที่ 11 มาจะทำอย่างไร ไอ้กล่องนีี้ช่วยได้ ก็เอาเจ้ากล่องนี้ไปลงทะเบียน 1 ใน 10 ของอุปกรณ์ที่เขาให้สิทธิ แล้วก็ให้มัน share wifi ต่อมาให้อุปกรณ์อื่นของเรา เท่านี้ก็สบายแล้ว ไชโย 😛

ปล. ถ้าออกเน็ตผ่าน 3G ล่ะ ทำไง ไปย้อนอ่านบทความก่อนหน้า แล้วประยุกต์เอาเอง มันทำได้อยู่แล้ว

Advertisements

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s