Привет, ребята, я совсем новичок во всём этом и очень нуждаюсь в помощи, если это возможно. Мой начальник хочет, чтобы я в итоге создал внешний captive portal, который будет требовать от гостей войти через их Facebook (только вход), чтобы подключиться к гостевой сети. Но сейчас я даже не могу заставить работать самый простой внешний captive portal.
Вот немного информации о настройке, надеюсь, кто-то сможет понять, в чём проблема:
- Контроллер установлен (как я понимаю) на сервере в нашем офисе в Гонконге
- Внешний сервер, который я использую — Ubuntu 14.04, размещённый на AWS EC2 в США
- На Ubuntu установлены все необходимые инструменты (по моим предположениям): apache, curl, php (если что-то забыл, скажите)
- IP внешнего сервера уже добавлен в предавторизованный доступ как: XX.XX.XX.XXX/32
Базовый код, с которым я работаю, взят отсюда:
Я также внес некоторые изменения согласно этому посту:
Но эти ссылки уже старые и, скорее всего, устаревшие, так как они для версий 4.X или раньше.
Я ещё сделал небольшие правки в коде, основываясь на разных сообщениях с форума, сейчас мой код выглядит так:
authorized.php
<?php
session_start();
function sendAuthorization($id, $minutes, $ap) {
$unifiServer = "https://unificontrollerserver:8443";
$unifiUser = "xxxxx";
$unifiPass = "xxxxxx";
// Запуск Curl для логина
$ch = curl_init();
// Отправляем POST-запрос
curl_setopt($ch, CURLOPT_POST, TRUE);
// Куки
$cookie_file = "/tmp/unifi_cookie";
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
// Разрешаем самоподписанные сертификаты
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
// Принудительно используем SSL3
curl_setopt($ch, CURLOPT_SSLVERSION, 1);
// Логинимся на UniFi контроллере
curl_setopt($ch, CURLOPT_URL, '$unifiServer/api/login');
$data = json_encode(array("username" => $unifiUser, "password" => $unifiPass));
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
// Отправляем команду на логин
curl_exec($ch);
// Отправляем команду авторизации пользователя и время доступа
$data = json_encode(array(
'cmd' => 'authorize-guest',
'mac' => $id,
'ap_mac' => $ap,
'minutes' => $minutes));
// Отправляем команду на API
curl_setopt($ch, CURLOPT_URL, $unifiServer.'/api/cmd/stamgr');
curl_setopt($ch, CURLOPT_POSTFIELDS, 'json='.$data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_exec($ch);
// Логаут с UniFi контроллера
curl_setopt($ch, CURLOPT_URL, $unifiServer.'/logout');
curl_exec($ch);
curl_close($ch);
unset($ch);
}
if ($_SESSION['loggingin'] == "unique key") { // Проверяем, отправлена ли форма
ob_start();
sendAuthorization($_SESSION['id'], (12*60), $_SESSION['ap'] ); // авторизуем пользователя на 12 часов
ob_end_clean();
unset($_SESSION['loggingin']);
}
?>
// даём время на авторизацию
setTimeout("location.href='http://www.Google.com'", 12000);
</script>
index.php
<?php
// PHP-скрипт для простого portal-а
// Требования: curl должен быть включён (php_curl.dll для Windows)
session_start();
$_SESSION['id'] = $_GET['id']; // MAC адрес пользователя
$_SESSION['ap'] = $_GET['ap']; // MAC адрес точки доступа
$_SESSION['ssid'] = $_GET['ssid']; // SSID, к которому пытается подключиться пользователь (POST 2.3.2)
$_SESSION['time'] = $_GET['t']; // Время запроса порталу
$_SESSION['refURL'] = $_GET['url']; // URL, к которому пытался получить доступ пользователь
$_SESSION['loggingin'] = "unique key"; // ключ для проверки, использовал ли пользователь этот форму, чтобы предотвратить переход напрямую на authorized.php
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Пример портальной страницы</title>
</head>
<body>
<form name="login" action="authorized.php" method="post">
<input id="submit" type="submit" name="submit" value="Подключиться" />
</form>
</body>
</html>
После нажатия кнопки "Подключиться" и появления сообщения "подключение к сети", меня перенаправляет обратно на страницу с кнопкой. И этот цикл повторяется бесконечно, доступа к интернету так и нет. Полагаю, пользователь так и не проходит аутентификацию, отсюда и бесконечный цикл. Но я не знаю, как это исправить.
Не уверен, связано ли это, но я проверял , открыт ли порт 8443 на внешнем сервере. Там написано, что он закрыт, но открыты порты 22 и 80. При этом firewall на Ubuntu я вообще не включал.
Буду очень благодарен за любую помощь!!!
Вот немного информации о настройке, надеюсь, кто-то сможет понять, в чём проблема:
- Контроллер установлен (как я понимаю) на сервере в нашем офисе в Гонконге
- Внешний сервер, который я использую — Ubuntu 14.04, размещённый на AWS EC2 в США
- На Ubuntu установлены все необходимые инструменты (по моим предположениям): apache, curl, php (если что-то забыл, скажите)
- IP внешнего сервера уже добавлен в предавторизованный доступ как: XX.XX.XX.XXX/32
Базовый код, с которым я работаю, взят отсюда:
Я также внес некоторые изменения согласно этому посту:
Но эти ссылки уже старые и, скорее всего, устаревшие, так как они для версий 4.X или раньше.
Я ещё сделал небольшие правки в коде, основываясь на разных сообщениях с форума, сейчас мой код выглядит так:
authorized.php
<?php
session_start();
function sendAuthorization($id, $minutes, $ap) {
$unifiServer = "https://unificontrollerserver:8443";
$unifiUser = "xxxxx";
$unifiPass = "xxxxxx";
// Запуск Curl для логина
$ch = curl_init();
// Отправляем POST-запрос
curl_setopt($ch, CURLOPT_POST, TRUE);
// Куки
$cookie_file = "/tmp/unifi_cookie";
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
// Разрешаем самоподписанные сертификаты
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
// Принудительно используем SSL3
curl_setopt($ch, CURLOPT_SSLVERSION, 1);
// Логинимся на UniFi контроллере
curl_setopt($ch, CURLOPT_URL, '$unifiServer/api/login');
$data = json_encode(array("username" => $unifiUser, "password" => $unifiPass));
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
// Отправляем команду на логин
curl_exec($ch);
// Отправляем команду авторизации пользователя и время доступа
$data = json_encode(array(
'cmd' => 'authorize-guest',
'mac' => $id,
'ap_mac' => $ap,
'minutes' => $minutes));
// Отправляем команду на API
curl_setopt($ch, CURLOPT_URL, $unifiServer.'/api/cmd/stamgr');
curl_setopt($ch, CURLOPT_POSTFIELDS, 'json='.$data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_exec($ch);
// Логаут с UniFi контроллера
curl_setopt($ch, CURLOPT_URL, $unifiServer.'/logout');
curl_exec($ch);
curl_close($ch);
unset($ch);
}
if ($_SESSION['loggingin'] == "unique key") { // Проверяем, отправлена ли форма
ob_start();
sendAuthorization($_SESSION['id'], (12*60), $_SESSION['ap'] ); // авторизуем пользователя на 12 часов
ob_end_clean();
unset($_SESSION['loggingin']);
}
?>
Подключение к сети...
<script>// даём время на авторизацию
setTimeout("location.href='http://www.Google.com'", 12000);
</script>
index.php
<?php
// PHP-скрипт для простого portal-а
// Требования: curl должен быть включён (php_curl.dll для Windows)
session_start();
$_SESSION['id'] = $_GET['id']; // MAC адрес пользователя
$_SESSION['ap'] = $_GET['ap']; // MAC адрес точки доступа
$_SESSION['ssid'] = $_GET['ssid']; // SSID, к которому пытается подключиться пользователь (POST 2.3.2)
$_SESSION['time'] = $_GET['t']; // Время запроса порталу
$_SESSION['refURL'] = $_GET['url']; // URL, к которому пытался получить доступ пользователь
$_SESSION['loggingin'] = "unique key"; // ключ для проверки, использовал ли пользователь этот форму, чтобы предотвратить переход напрямую на authorized.php
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Пример портальной страницы</title>
</head>
<body>
<form name="login" action="authorized.php" method="post">
<input id="submit" type="submit" name="submit" value="Подключиться" />
</form>
</body>
</html>
После нажатия кнопки "Подключиться" и появления сообщения "подключение к сети", меня перенаправляет обратно на страницу с кнопкой. И этот цикл повторяется бесконечно, доступа к интернету так и нет. Полагаю, пользователь так и не проходит аутентификацию, отсюда и бесконечный цикл. Но я не знаю, как это исправить.
Не уверен, связано ли это, но я проверял , открыт ли порт 8443 на внешнем сервере. Там написано, что он закрыт, но открыты порты 22 и 80. При этом firewall на Ubuntu я вообще не включал.
Буду очень благодарен за любую помощь!!!
