Пишу для себя, на будущее, так как когда нибудь придется опять переделывать сервак для WiFi точки доступа, это возможно сэкономит мне немного времени.
Сначала пользовался Ubuntu, дистрибутив нормальный, пока не поломался репозиторий apt-get, который ставит программы, в итоге плясок с бубном, удалил какую то важную директорию, без бекапа. все, линукс можно сносить.
Саша администратор посоветовал посмотреть на CentOS 6-ой версии, 7-ая чот не ставилась, скачал 6.7 LiveCD, дистр реально супер.
Но!!! есть одно но, перемудренно там с безопасностью. Действительно получается очень безопасный дистрибутив, т.е. на каждый чих, нужно какое то правило разрешать. встроенные правила для iptables тоже намекают на это. Какой то дополнительный встроенный selinux, который вообще всем управляет.
В общем делаю Captive Portal, это такая штука, которая через себя пропускает пользователей, которые подключаются через Free-WiFi, который требует у них паспортные данные номер телефона, шлет им СМС с паролем, если телефон свой указал, приходит пароль, вводишь в поле и ты в Интернете. Есть конечно какие то решения в Интернете по этому поводу, я сначала смотрел на них, но без полного понимания, как и что работает мне страшно такие штуки ставить. Да и вопрос сколько я с ними провожусь разбираясь. Даже что-то хотел вроде поставить, но там сорцы, а из сорцов что-то поставить тот еще геммор в настоящее время, нет, в CentOS мне как то это показалось более приятным чем в Ubuntu, так что + к CentOS'у. Так, ладно.
В первую очередь отключаем selinux
vi /etc/selinux/config
SELINUX=disabled <--------- на это меняем в файле.
reboot
Про selinux можно почитать тут
http://centos.name/?page/tipsandtricks/SelinuxBooleans дальше вводим команду visudo
нам нужно, чтобы PHP мог выполнять команды arp, iptables и rmtrack
Перво наперво, комментируем строчку:
#Defaults requiretty
эта строчка запрещает пользовать рутовыми командами, кому бы то ни было, кто не подключился к компьютеру через терминал RequireTTY
дальше в конце дописываем
www ALL=NOPASSWD: /sbin/arp
www ALL=NOPASSWD: /sbin/iptables
www ALL=NOPASSWD: /usr/bin/rmtrack
www - тут имя пользователя под которым запущен PHP.
Да, тут надо сказать, что все работает на nginx + fpm-php + mysql
узнать под каким пользователем запущен PHP, можно двумя способами,
1) echo get_current_user() в каком нибудь методе контроллера.
2) echo shell_exec("whoami"); причем пользователи могут быть разные, лучше сделать одинаковым и не париться.
если с iptables и arp понятно,
с помощью $mac = shell_exec("arp -an ".$_SERVER["REMOTE_ADDR"]); мы получаем МАК адрес пользователя, его нужно через регулярку еще распарсить.
Потом мы посылаем команду для iptables с IP и МАК адресом для того чтобы тот не заворачивал нас на внутренний ВЕБ-сервер.
rmtrack - это скрипт описанный вот здесь
http://www.andybev.com/index.php/Using_iptables_and_PHP_to_create_a_captive_portalон сбрасывает соединения, чтобы мы еще минуту при вводе того же адреса на который изначально направлялись не перенаправлялись на наш внутренний сервер.
Настройки iptables
у меня eth0 скажем 192.168.1.42 временный конечно же.
внутренний eth1 192.168.0.254
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.42 -j ACCEPT
эта команда, нужна для того, чтобы Linux стал роутером, все остальное можно найти по ссылке
http://redhat-club.org/2011/настройка-nat-в-rhel-centos-fedoraдальше:
iptables -t nat -A PREROUTING -p tcp --j DNAT --to-destination 192.168.0.254 -j ACCEPT
таким образом, кто подключится к нам, получит по DHCP IP адрес и настройки, шлюзом будет все тот же 192.168.0.254 будет перенаправлен на наш сервер.
Да, vsftpd в версии CentOS 2.2.2 вроде какой то, лучше сразу выкинуть, или подключить какой нибудь поновее репозиторий, чтобы установилась версия 3.х с которой проблем нет, как с версией 2
есть еще кое что рассказать про шайпинг скорости, будет что рассказать про СМС-гейт, но это в следующий раз.
Веб-морда конечно страшная, и ей обязательно нужно будет заняться в ближайшее время.
Первоначально пользователь вводит телефон и название устройства, так как устройств может быть много, а телефон один. Ну например, пришел я с планшетом и ноутбуком, телефон один, я могу выйти с ноутбука, указать номер телефона, название устройства например Ноутбук. Мне на телефон придет код для ноутбука, тоже самое с планшета, с планшета своего ребенка, жены и т.п. устройств много, телефон один. Коды как то нужно будет различать в последствии, код действует постоянно. Правда каждые полчаса нужно его повторно вбивать.
трафик не сниффится, ибо нафик надо, учитывается только заход на определенные сайты, собирается статистика через iptraf, есть конечно лучшие способы, например через лог того же iptables, но я пока не уверен, стоит ли забивать iptables еще и этим.