Przerobienie PC na AP przy wykorzystaniu adaptera Archer T4U

Przy pomocy tego howto przerobimy starego PC w coś na wzór routera WiFi. Do tego eksperymentu zaprzęgnąłem mojego już leciwego kompa z pentium D z 1GiB RAM na pokładzie. Wymontowałem z niego grafikę, muzykę i inne niepotrzebne podzespoły, zostawiając jedynie płytkę z prockiem i dysk twardy. Płyta ma wbudowany 1 port ethernetowy, do tego dołożyłem kartę Wifi Archer T4U . Generalnie chodzi o to by wszystkie sprzęty elektroniczne chcące korzystać z internetu mogły to robić za pośrednictwem tego komputera. Do portu rj45 będzie dostarczony sygnał od ISP. Na tym pseudo routerze będzie zainstalowany debian testing jako system operacyjny, a realizacją połączeń WiFi zajmie się oprogramowanie hostapd w połączeniu z dnsmasq, czyli te same narzędzia, które działają na routerach z OpenWRT.
Ten turotial można równie dobrze zaaplikować do innych kart WiFi, np TL-WN722n -- chodzi generalnie o to by model karty obsługiwał tryb AP. Zwykle karty WiFi nie posiadają tego trybu i mają dostępny jedynie tryb STA (czasem też i monitor), co przekreśla postawienie punktu dostępowego. Jeśli nie wiemy czy nasza karta WiFi potrafi przełączyć się w tryb AP, podłączamy kartę do portu USB i wydajemy poniższe polecenie:

# iw list
Wiphy phy0
...
	Supported interface modes:
		* IBSS
		* managed
		* AP
		* monitor
		* P2P-client
		* P2P-GO
		...

Karty WiFi potrzebują sterowników do prawidłowego działania, a obecnie w kernelu dla karty Archer T4U nie ma jeszcze odpowiednich modułów i te trzeba sobie skompilować ręcznie. Cały ten proces został opisany tutaj.

Musimy doinstalować również pakiety z hostapd oraz dnsmasq :

# apt-get install hostapd dnsmasq crda

Jeśli mamy już wgrane sterowniki, podłączamy adapter do portu usb -- powinien zostać wykryty i do naszej dyspozycji powinien być oddany nowy interfejs sieciowy, w tym przypadku jest to wlan1 . Przypisujemy temu interfejsowi statyczny adres IP -- u mnie odbywa się to przez edycję pliku /etc/network/interfaces :

auto wlan1
iface wlan1 inet static
	address 192.168.2.1
	network 192.168.2.0/24
	netmask 255.255.255.0
	broadcast 192.168.2.255

Podnosimy interfejs i w tej chwili karta powinna już posiadać adres IP.

# ifconfig wlan1
wlan1     Link encap:Ethernet  HWaddr e8:de:27:1d:4c:a5  
		  inet addr:192.168.2.1  Bcast:192.168.2.255  Mask:255.255.255.0
		  UP BROADCAST MULTICAST  MTU:1500  Metric:1
		  RX packets:0 errors:0 dropped:0 overruns:0 frame:0
		  TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
		  collisions:0 txqueuelen:1000 
		  RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Konfiguracja hostapd

Z pakietem hostapd jest dostarczany obszerny plik konfiguracyjny. Znajduje się on w /usr/share/doc/hostapd/examples/hostapd.conf.gz -- trzeba go przekopiować do /etc/hostapd/hostapd.conf :

# zcat /usr/share/doc/hostapd/examples/hostapd.conf.gz > /etc/hostapd/hostapd.conf

Edytujemy teraz ten plik i uzupełniamy w nim odpowiednie linijki:

interface=wlan1
driver=nl80211
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
ssid=Winter_Is_Coming
utf8_ssid=1
country_code=PL
ieee80211d=1
ieee80211h=1
hw_mode=g
channel=11
acs_num_scans=10
beacon_int=100
dtim_period=2
max_num_sta=255
rts_threshold=2347
fragm_threshold=2346
preamble=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wmm_enabled=0
ap_max_inactivity=300
skip_inactivity_poll=0
disassoc_low_ack=1
ap_isolate=0
ieee80211n=1
require_ht=0
eapol_version=2
eapol_key_index_workaround=0
eap_reauth_period=3600
wpa=2
wpa_psk=3636a6d31b2cda24ef42b764c2baf8fbca0faf5535df2f8fa04a78c4a13e7942
wpa_psk_radius=0
wpa_key_mgmt=WPA-PSK WPA-PSK-SHA256
wpa_pairwise=CCMP
rsn_pairwise=CCMP
wpa_group_rekey=600
wpa_gmk_rekey=21600
wpa_ptk_rekey=600
peerkey=1
okc=0
ap_table_max_size=255
ap_table_expiration_time=3600
wps_state=2
wps_independent=0
ap_setup_locked=0
uuid=7b3fb0ea-f068-446d-b803-7c1924b69613
wps_pin_requests=/var/run/hostapd_wps_pin_requests
device_name=Winter_Is_Coming
device_type=1-0050F204-1
config_methods=push_button
wps_rf_bands=g
time_zone=CET-1CEST,M3.5.0/2,M10.5.0/3
access_network_type=0
internet=1
ht_capab=

Większość opcji jest taka sama jak w przypadku OpenWRT, w końcu to samo oprogramowanie jest wykorzystywane. Musimy jeszcze określić parametr ht_capab= , a ten się różni w zależności od posiadanego sprzętu. By odpowiednio uzupełnić ten parametr, musimy zobaczyć co nam zwróci polecenie iw list :

# iw list
...
		Band 1:
				Capabilities: 0x1862
						HT20/HT40
						Static SM Power Save
						RX HT20 SGI
						RX HT40 SGI
						No RX STBC
						Max AMSDU length: 7935 bytes
						DSSS/CCK HT40
...

Zatem parametr ht_capab przybierze poniższą postać:

ht_capab=[HT40-][SHORT-GI-20][SHORT-GI-40][MAX-AMSDU-7935][DSSS_CCK-40]

Edytujemy także plik /etc/default/hostapd i zmieniamy w nim:

DAEMON_CONF="/etc/hostapd/hostapd.conf"

W celu wygenerowania hasła do naszej sieci wifi, użyjemy wpa_passphrase :

# wpa_passphrase 'Winter_Is_Coming' 'morfik-ma-kota'
...
   psk=3636a6d31b2cda24ef42b764c2baf8fbca0faf5535df2f8fa04a78c4a13e7942
...

Restartujemy daemona hostapd :

# /etc/init.d/hostapd restart
Stopping advanced IEEE 802.11 management: hostapd.
Starting advanced IEEE 802.11 management: hostapd.

Sieć powinna być już widoczna przy skanowaniu pasma:

root:~# wpa_cli scan
Selected interface 'wlan1'
OK
root:~# wpa_cli scan_results
Selected interface 'wlan1'
bssid / frequency / signal level / flags / ssid
e8:de:27:1d:4c:a5       2462    -48     [WPA2-PSK+PSK-SHA256-CCMP][WPS][ESS]    Winter_Is_Coming
...

Konfiguracja dnsmasq

Dostęp do sieci nam się na wiele nie zda bez odpowiedniej konfiguracji interfejsów na kliencie. Jeśli mamy jedną maszynę, to raczej możemy ustawić wszystko ręcznie. Natomiast, jeśli posiadamy wiele komputerów, które chcemy podłączyć do internetu, dobrze jest skonfigurować sobie serwer DHCP i DNS. Za te dwa w/w odpowiada dnsmasq, a jego konfiguracja trzymana jest w pliku /etc/dnsmasq.conf :

domain-needed
bogus-priv
resolv-file=/etc/resolv.conf
local=/mwifi.lh/
interface=wlan1
expand-hosts
domain=mwifi.lh
dhcp-range=192.168.2.100,192.168.2.250,1h
dhcp-lease-max=150
dhcp-leasefile=/etc/dnsmasq.leases
dhcp-authoritative
cache-size=1000
no-negcache

Podobnie jak w przypadku hostapd, powyższe wpisy również niczym się nie różnią od opcji dostępnych w OpenWRT. Przy ustawianiu adresów IP, trzeba pamiętać by serwer DHCP przydzielał adresy w oparciu o adres IP i maskę karty sieciowej, w tym przypadku jest to 192.168.2.1 oraz 255.255.255.0 , zatem sieć 192.168.2.0/24 .
W przypadku gdybyśmy chcieli statyczne lease DHCP, możemy precyzować hosty bezpośrednio w konfiguracji dnsmasq przy pomocy wpisów takich jak ten poniżej:
dhcp-host=c0:cb:38:01:f0:f5,morfikownia,192.168.2.200,2h
Powyższa linijka przydziela hostowi o adresie MAC c0:cb:38:01:f0:f5 adres IP 192.168.2.200 i nazwę morfikownia na 2 godziny.

Restartujemy dnsmasq:

# /etc/init.d/dnsmasq restart
Restarting DNS forwarder and DHCP server: dnsmasq.

Punkt dostępowy sieci WiFi jest po części skonfigurowany. Potrzebujemy jeszcze zrobić forwarding pakietów, tak by hosty w sieci miały dostęp do internetu.
Na początek edytujemy plik /etc/sysctl.conf , w którym to musimy odhashować poniższą linijkę:

net.ipv4.ip_forward=1

Teraz już tylko potrzebny jest nam kawałek skryptu firewalla. Jeśli nasz PC jest już za NATem, to w sumie potrzebna nam jest tylko jedna linijka:

iptables -t nat -A POSTROUTING -o eth1 -s 192.168.2.0/24 -d 0/0 -j MASQUERADE

Parametr -o eth1 określa, przez który interfejs jest wyjście na świat.

Jeśli potrzebny nam jest bardziej wymyślna zapora, to tworzenie całego skryptu iptables, zostało przystępnie opisane w tym wątku.

Pozostały nam do skonfigurowania już tylko klienty sieci WiFi. Dla tych ustawień hostapd , potrzebna nam jest poniższa zwrotka dla wpawupplicanta (/etc/wpa_supplicant/wpa_supplicant.conf):

network={
	id_str="home_wifi_static"
	priority=5
	ssid="Winter_Is_Coming"
	bssid=e8:94:f6:1e:15:e9
	#psk="morfik-ma-kota"
	psk=3636a6d31b2cda24ef42b764c2baf8fbca0faf5535df2f8fa04a78c4a13e7942
	proto=RSN
	key_mgmt=WPA-PSK-SHA256
	pairwise=CCMP
	group=CCMP
	auth_alg=OPEN
	scan_ssid=0
	disabled=0
}

Oraz konfiguracja dla samego interfejsu w /etc/network/interfaces :

auto wlan1
#allow-hotplug wlan1
iface wlan1 inet dhcp
	wpa-driver nl80211
	wpa-debug-level -1
	wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

Spróbujmy się połączyć do AP:

root:~# ifup wlan1
Internet Systems Consortium DHCP Client 4.3.1
Copyright 2004-2014 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/wlan1/e8:94:f6:1e:15:e9
Sending on   LPF/wlan1/e8:94:f6:1e:15:e9
Sending on   Socket/fallback
DHCPDISCOVER on wlan1 to 255.255.255.255 port 67 interval 6
DHCPDISCOVER on wlan1 to 255.255.255.255 port 67 interval 15
DHCPREQUEST on wlan1 to 255.255.255.255 port 67
DHCPOFFER from 192.168.2.1
DHCPACK from 192.168.2.1
bound to 192.168.2.209 -- renewal in 1776 seconds.

Udało się podłączyć do AP i serwer DHCP również działa, bo dostaliśmy adres IP. Sprawdźmy jeszcze czy działa internet:

root:~# ping wp.pl -c 3
PING wp.pl (212.77.100.101) 56(84) bytes of data.
64 bytes from www.wp.pl (212.77.100.101): icmp_seq=1 ttl=246 time=19.3 ms
64 bytes from www.wp.pl (212.77.100.101): icmp_seq=2 ttl=246 time=19.6 ms
64 bytes from www.wp.pl (212.77.100.101): icmp_seq=3 ttl=246 time=20.1 ms

--- wp.pl ping statistics

3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 19.335/19.714/20.138/0.348 ms

Wygląda w porządku. Rzućmy jeszcze okiem na firewall na punkcie dostępowym -- interesuje nas głównie tablica NAT:

# iptables -nvL -t nat
Chain PREROUTING (policy ACCEPT 45 packets, 3520 bytes)
 pkts bytes target     prot opt in     out     source               destination         
Chain INPUT (policy ACCEPT 5 packets, 592 bytes)
 pkts bytes target     prot opt in     out     source               destination         
Chain OUTPUT (policy ACCEPT 29 packets, 2581 bytes)
 pkts bytes target     prot opt in     out     source               destination         
Chain POSTROUTING (policy ACCEPT 29 packets, 2581 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   40  2928 MASQUERADE  all  --  *      eth1    192.168.2.0/24       0.0.0.0/0  

Jak widzimy wyżej, reguła, która utworzyliśmy łapie pakiety, zatem wszystko gra.
Ta karta niby potrafi operować także na 5GHz i w trybie klienta łączy się bez problemu, natomiast nie udało mi się postawić AP na paśmie 5GHz,