суббота, 27 апреля 2013 г.

Подключение к Wi-Fi точке доступа через прокси

Привет всем! Понадобилось тут на днях настроить сеть вот таким образом
Почему именно такая конфигурация спросите вы? Почему нельзя сразу подключиться к Wi-Fi AP (Wi-Fi Access Point) без использования "proxy laptop"? Отвечаю:

  1. Появился свободный ноут, плюс я стал обладателем мощного Wi-Fi адаптера TP-LINK TL-WN7200ND, захотелось напрячь их обоих :)
  2. Получить возможность гибкого управления трафиком.
  3. Увеличить область действия Wi-Fi сигнала и получить возможность подключаться к тем точкам доступа, которые недосягаемы для машины "laptop1".
  4. Ну и конечно же, просто спортивный интерес. Знание - сила! ;)
Порыскав по инету я не нашел полноценный мануал как настроить такую конфигурацию. Итак, преступим. Что нам понадобится для работы данной конфигурации:

  • ОСь. Я выбрал Ubuntu 10.04 LTS; 
  • hostapd. Демон создающий программную точку доступа с поддержкой WPA/WPA2; 
  • DHCP-сервер;
  • squid. Собственно сам прокси.
Начнем с hostapd. В репах 10.04 находится версия 0.6. Сразу скажу, что нам понадобится версия 0.7 или выше, т.к. 0.6 мне так и не удалось завести на своем железе. Добавляем ppa с версией 0.7:

# add-apt-repository ppa:aspeed/ppa
# apt-get update
# apt-get install hostapd

Теперь настраиваем точку доступа. Это минимальный конфиг с которым можно поднять AP:

# nano /etc/hostapd/hostapd.conf
interface=wlan0
driver=nl80211
ssid=proxyap
hw_mode=g
channel=11
# Включить только WPA2 (1 - WPA, 2 - WPA2, 3 - WPA + WPA2)
wpa=2
wpa_passphrase=myappass

Теперь пробуем запустить:

# hostapd -d /etc/hostapd/hostapd.conf

Если в выводе есть строка:

wlan0: Setup of interface done.

Значит AP поднялась. Пробуем сканировать эфир с другой машины и видим нашу точку доступа "proxyap". Быстро просканировать можно командой:

# iwlist wlan0 scan | grep 'proxyap'

Теперь необходимо запустить DHCP-сервер для автоматического назначения IP-адресов клиентам нашей AP. Ставим его:

# apt-get install dhcp3-server

Теперь отредактируем и раскомментим секцию "subnet" в dhcpd.conf:

# nano /etc/dhcp3/dhcpd.conf
subnet 10.10.0.0 netmask 255.255.255.0 {
 option routers 10.10.0.1;
 option domain-name-servers 8.8.8.8;
 range 10.10.0.25 10.10.0.50;
 interface wlan0;
}

Мы создаем подсеть 10.10.0.x и разрешаем раздать клиентам до 25 IP-шников.
Теперь редактируем /etc/default/dhcp3-server:

# nano /etc/default/dhcp3-server
INTERFACES="wlan0"

Теперь сконфигурируем нашу сеть:

# ifconfig wlan0 down
# ifconfig wlan0 10.10.0.1 netmask 255.255.255.0 up
# ifconfig wlan0 up

Можно запускать DHCP и hostap:

# service dhcp3-server start
# service hostapd start

Проверим все ли запустилось:

# ps aux | egrep '(hostap|dhcpd)' | grep -v grep

Пробуем подключиться к точке доступа, вводим пасс, ждем пока назначится IP. После подключения убедимся что IP назначился и мы видим прокси-ноут. Эти действия делаем на "laptop1":

# ifconfig wlan0
wlan0 Link encap:Ethernet HWaddr 70:f3:95:e4:53:87
inet addr:10.10.0.25 Bcast:10.10.0.255 Mask:255.255.255.0
inet6 addr: fe80::72f3:95ff:fee4:5387/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:137215 errors:0 dropped:0 overruns:0 frame:0
TX packets:139973 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:129062378 (129.0 MB) TX bytes:41828862 (41.8 MB)

# ping 10.10.0.1
PING 10.10.0.1 (10.10.0.1) 56(84) bytes of data.
64 bytes from 10.10.0.1: icmp_req=1 ttl=64 time=1.09 ms
64 bytes from 10.10.0.1: icmp_req=2 ttl=64 time=1.05 ms
64 bytes from 10.10.0.1: icmp_req=3 ttl=64 time=1.04 ms
64 bytes from 10.10.0.1: icmp_req=4 ttl=64 time=1.08 ms

Теперь завершающий шаг. Установка и настройка прокси-сервера:

# apt-get install squid
# nano /etc/squid/squid.conf

Раскомментируем эти строки:

http_port 3128 transparent # в конце обязательно добавляем 'transparent'
cache_dir ufs /var/spool/squid 100 16 256
acl localnet 10.10.0.0/24
http_access localnet
dns_nameservers 8.8.8.8 8.8.4.4

Остальное оставляем как есть. На данном этапе необходимо настроить сетевые правила и направить трафик приходящий в wlan0 на wlan1. Для этого добавим правила:

# iptables -t nat -A PREROUTING -i wlan0 -d ! 10.10.0.0/24 -p tcp -m multiport --dport 80,8080 -j DNAT --to 10.10.0.1:3128
# iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o wlan1 -j MASQUERADE

И не забываем включить IP Forwarding для включения проброса трафика на другую сетевуху:

# echo 1 > /proc/sys/net/ipv4/ip_forward

Вот и все. Для удобства пользования прокси-ноутом я убрал из автозагрузки все установленные нами демоны:

# update-rc.d dhcp3-server disable
# update-rc.d hostapd disable

И создал скрипт для поднятия dhcp+hostap+squid и настройки iptables:

#!/bin/sh
service squid stop
service hostapd stop
service dhcp3-server stop
ifconfig wlan0 down
ifconfig wlan0 10.10.0.1 netmask 255.255.255.0 up
ifconfig wlan0 up
echo 1 > /proc/sys/net/ipv4/ip_forward
service dhcp3-server start
service hostapd start
service squid start
iptables -t nat -F
iptables -t nat -A PREROUTING -i wlan0 -d ! 10.10.0.0/24 -p tcp -m multiport --dport 80,8080 -j DNAT --to 10.10.0.1:3128
iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o wlan1 -j MASQUERADE

The end.