2008-09-09 20:58:59

Очередные эксперемнты с беспроводной сеткой или больная голова рукам покоя не дает

В мемориз Linux Wi-fi

Отсидка дома из-за болезни хороший повод поиграться с техникой да поэкспериментировать с чем-нибудь...

Как говорится "голь на выдумки хитра", а именно от того что болеть скучно купил себе Asus EEEPC 1000H, очень доволен но сейчас не об этом. Естественно хочется сразу на него дать инет и естественно без проводов. Покупать роутер жаба душит да и в магазин скататься пока нет возможности, поэтому все будем строить своими руками, благо в доме есть 2 компа и у второго есть беспроводная сетевуха.

Ставим задачу.

Имеется 2 компа в одной подсети: основной 192.168.19.112 с виндой и обычной сетевухой, и экспериментальный 192.168.19.25 с Fedora Core 7, обычной (eth0) и беспроводной (ath0) сетевухой. Упомянул про основной тк на него тож надо будет ходить. А также зачинщик всех экспериментов - новенький EEE PC. В подсети 192.168.19 имеется интернет посредством vpn-соедиения со шлюзом провайдера 192.168.19.2.

Что нужно: дать интернет и доступ к основному компу по беспроводной сети для EEE PC.

Решение.

Изначально пошел не правильным путем тк стоило бы сначала дать интернет на экспериментальный комп а потом морочиться со всем остальным.

Для решения на понадобится: поднять беспроводную сеть, организовать в ней раздачу адресов (dhcp-сервер кончено не обязательно, но это правильно), дать в беспроводную сеть инет, научиться ходить к основному компу.

Сначала поднимаем беспроводную сеть. Для этого ставим madwifi в виде rpm для нашей ОС. Было бы конечно проще через yum при наличии на машине интернета.

Ставим dhcpd тоже из rpm. Кстати dhcpd требует еще и openldap-servers которого на диске у меня не оказалось.


Теперь конфигурим беспроводную сетевуху чтоб она работала как точка доступа.

Для этого говорим в  консоли:

wlanconfig ath0 destroy

wlanconfig ath0 create wlandev wifi0 wlanmode ap

ifconfig ath0 up 172.17.1.1 netmask 255.255.255.0

Все это дописываем в /etc/rc.d/rc.local чтоб само поднималось при загрузке.

Была замечена проблема, что ath0 получает ip адрес только если он прописан и в rc.local и в /etc/sysconfig/network-scripts/ifcfg-ath0. На всякий случай, да и чтоб самому не забыть, содержимое ifcfg-ath0 привожу ниже:

# Atheros Communications, Inc. AR5005G 802.11abg NIC
DEVICE=ath0
ONBOOT=no
BOOTPROTO=none
HWADDR=00:11:95:c3:f3:9f
NETMASK=255.255.255.0
DHCP_HOSTNAME=
IPADDR=172.17.1.1
DOMAIN=
TYPE=Wireless
ESSID=Rebel_home
CHANNEL=
MODE=
RATE=

Теперь пишем в /etc/sysconfig/network-scripts/keys-ath0 для того чтобы сделать сеть безопасной:

KEY=s:parol

Подробнее о параметрах конфигурации madwifi см. на http://madwifi.org/. А от себя замечу, что текстовые ключи могут быть 5 или 13 ASCII символов, другой длинны никак.

Теперь DHCP. В принципе тут все и так понятно, а если что - все подробности есть в мане и гугле, но свой /etc/dhcpd.conf все же приведу:

ddns-update-style ad-hoc;
subnet 172.17.1.0 netmask 255.255.255.0 {
  range 172.17.1.10 172.17.1.100;  
option routers 172.17.1.1;
  option subnet-mask 255.255.255.0;  
option domain-name-servers 195.98.160.25, 195.98.163.16;
  max-lease-time 300;  

Замечание. Сервис dhcpd не стартует пока нет сетевухи с подходящим диапозоном адресов, а в rc.local, который выполняется после всего мы заново создаем ath0 на которой и должен работать dhcpd. Поэтому в /etc/rc.d/rc.local дописываем:

service dhcpd start

Ну что-ж, ура, половина сделана, беспроводная сеть есть, ноут получил адрес 172.17.1.100 и прекрасно видит экспериментального компа 

Теперь будем раздавать инет и заодно организовывать видимость основного компа.

Сначала научимся поднимать vpn-соединение с провайдером. Для этого на понадобится pppd и pptp. Первое обычно уже имеется, а вот второе можно поставить из rpm-ки для вашей ОС с http://pptpclient.sourceforge.net/.

В принципе в комплекте есть скрипт для автоматизации конфигурения и установки соединения, но у меня оно не завелось, поэтому пришлось брать скриптину из гугля. Скриптину называем /usr/bin/vpn и делаем исполняемой. Внутрь пишем:

#!/bin/sh

#
# fix broken path
#

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:.

export PATH

#
# network settings
#

USER=<ваш_логин>
NETWORK=192.168.25.0 # настроить на для своей сети
NETMASK=255.255.255.0 # обычно вроде такая и останется
VPNSERVER=192.168.19.2 # Смените на ваш адрес vpn-сервера
GATEWAY=192.168.19.2 # Указать свой
DEVICE=eth0 # если нужно, то тоже сменить

#
# vpn stuff
#

PPPD=/usr/sbin/pppd
PPTP=/usr/sbin/pptp

if [ ! -x $PPPD ]; then
echo «$0: $PPPD not found»
exit 1
fi

if [ ! -x $PPTP ]; then
echo "$0: $PPTP not found"
exit 1
fi

#
# here we go
#

case "$1" in
start)
if [ ! -d /var/run/pptp ]; then
mkdir /var/run/pptp
fi

if [ -f /var/run/pptp/remote ]; then
if ping -vc1 'cat /var/run/pptp/remote'; then
exit 1
fi
killall -HUP pptp
killall -TERM pppd
sleep 2
fi

rm -rf /var/run/pptp/* >/dev/null
route del default
route add -net $NETWORK netmask $NETMASK gw $GATEWAY dev $DEVICE
echo -n "===> Starting vpn: "
($PPTP $VPNSERVER defaultroute noauth user $USER && \
echo -n "done") || echo -n "failed"
echo
;;
stop)
echo -n "===> Stopping vpn: "
killall -HUP pptp
killall -TERM pppd
sleep 2
rm /var/run/pptp/* >/dev/null
route del -net $NETWORK netmask $NETMASK gw $GATEWAY dev $DEVICE
route add default gw $GATEWAY dev $DEVICE
echo "done"
;;
restart)
$0 stop
sleep 2
$0 start
;;
*)

echo "*** Usage: vpn {start|stop|restart}"
exit 1
;;
esac

exit 0

Таким образом получаем поднималку впн для свой сети, только не забываем в начала скрипта вписать что нужно.

Для того чтоб соединение устанавливалось автоматически дописываем в /etc/rc.d/rc.local:

/usr/bin/vpn start

Отлично, интернет есть. Теперь его надо раздать на беспроводную сеть 172.17.1 и плюс к этому дать этой сети ходить на 192.168.19.112 (основной комп). все это делается средствами iptables, описывать подробности неохота (есть-же гугль!), поэтому привожу просто наспех написанный /etc/sysconfig/iptables.Сразу оговорюсь, что он ориентирован не на безопасность в сети, а сделан наспех чтоб как-нибудь работало, потом надеюсь поправить.

# Generated by iptables-save v1.3.7 on Thu Sep 4 01:41:49 2008
*nat
:PREROUTING ACCEPT [22:1443]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -o ppp0 -j MASQUERADE
COMMIT
# Completed on Thu Sep 4 01:41:49 2008
# Generated by iptables-save v1.3.7 on Thu Sep 4 01:41:49 2008
*filter
:INPUT DROP [2:56]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -s 192.168.19.112 -j ACCEPT
-A INPUT -s 192.168.19.2 -j ACCEPT
-A INPUT -s 172.17.1.0/255.255.255.0 -j ACCEPT
-A INPUT -d 172.30.19.25 -j ACCEPT
-A FORWARD -s 192.168.19.112 -d 172.17.1.0/255.255.255.0 -j ACCEPT
-A FORWARD -s 172.17.1.0/255.255.255.0 -d 192.168.19.112 -j ACCEPT
-A FORWARD -o ppp0 -j ACCEPT
-A FORWARD -i ppp0 -j ACCEPT
-A OUTPUT -d 172.17.1.0/255.255.255.0 -j ACCEPT
-A OUTPUT -d 192.168.19.112 -j ACCEPT
-A OUTPUT -d 192.168.19.2 -j ACCEPT
-A OUTPUT -o ppp0 -j ACCEPT
-A OUTPUT -s 172.30.19.25 -j ACCEPT
COMMIT
# Completed on Thu Sep 4 01:41:49 2008

Не забываем сказать echo 1 > /proc/sys/net/ipv4/ip_forward чтоб форвардились пакеты. Ну а на основном компе, который тоже устанавливает впн с провайдером, надо прописать маршрут, чтоб он знал что сеть 172.17.1 расположена за 19.25 а вовсе на за основным шлюзом.

Вот такое получилось у меня развлечение на целый день из-за больной головы, зато сейчас сижу на диване за ноутом и пишу свой блог - это у меня постельный режим такой