FreeBSD 10.1 x64 WiFi Captive Portal


Vores mål er at opbygge en FreeBSD-server Captive Portal som den er i hoteller og lufthavne. Gæsten slutter sig til wifi uden at indtaste et brugernavn eller kodeord, men når du forsøger at deltage i internettet, bliver brugeren bedt om brugernavn og adgangskode. Hvis brugernavnet og adgangskoden er sandt, vil gæsten kunne bruge internettet. I mit miljø brugte jeg AP ubiquiti (officiel side: https://www.ubnt.com/). Det er billigere, stabilt og har open source trådløs controller. Netværksstrukturen er som følger:
UNIXMEN-FR

Det antages, at du allerede har konfigureret FAMP og Apache PHP er stabil. Apache webserver arbejder på en gruppe og bruger navngivet unixmen som er oprettet før. (Med andre ord i httpd.conf fildirektiver er tilgængelige: Bruger unixmen og Gruppe Unixmen)

I alle Access Points IP-adresser er konfigureret som vist i billede og DHCP-server og ROUTER, vises FreeBSD-serverens interne netværkskorts IP-adresse. I Apache konfigureret VirtualHost og den opererer under domænenavnet wifi.unixmen.com

VirtualHost s public_html mappe er adressen til / Usr / local / www / wifi /, og mappens medlemskab og myndighed er unixmen. Og det samme som /usr/local/etc/apache24/httpd.conf konfigureret fil Lyt 80 og Lyt 443 defineret. /usr/local/domen/wifi.unixmen.com virtualhos indholdet af filen er som følger:
<VirtualHost *: 80> OmskrivningEngine på ReWriteCond% {SERVER_PORT}! ^ 443 $ RewriteRule ^ / (. *) Https: //% {HTTP_HOST} / $ 1 [NC, R, L] </ VirtualHost> <VirtualHost *: 443> SSLEngine på SSLCertificateFile /usr/local/etc/apache24/ssl/wifi.pem SSLCertificateKeyFile /usr/local/etc/apache24/ssl/wifi.key DocumentRoot / usr / local / www / wifi / <Katalog "/ usr / local / www / wifi"> AllowOverride All Kræv alle tildelte </ Directory> </ VirtualHost>

Det er nødvendigt at installere pære for php og oprette database og dets bruger hos MySQL Vi installerer pære og konfigurere for php.
# cd `hvor er pære | awk '{print $ 2}' ` - indtast portvej # make -DBATCH installer - installer

Når vi kopierer php-filen og ændrer korrekt ændringerne i konteksten.
# cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini

Vi gør ændringerne i filen /usr/local/etc/php.ini:
date.timezone = 'Asien / Baku' include_path = '.: / usr / local / share / pear'

Nu kan vi oprette MySQL database og definere en bruger til denne database. Og lav en tidsplan for wifi-brugere
mysql> CREATE database wifi;
mysql> grant all privileges on wifi.* to [email protected] identified by 'wifidbpassword';
mysql> use wifi;
mysql> CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL auto_increment,
`username` varchar(50) default NULL,
`password` varchar(50) default NULL,
`created` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
`time_begin` timestamp NOT NULL default '0000-00-00 00:00:00',
`time_end` timestamp NOT NULL default '0000-00-00 00:00:00',
`status` tinyint(4) NOT NULL default '0',
`rule_num` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `rule_num` (`rule_num`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=6 ;

/etc/rc.conf konfigurationsfilen er som følger
værtsnavn = "wifinat.unixmen.com" ifconfig_em0 = "inet 88.8.9.10 netmaske 255.255.255.0" ifconfig_em1 = "inet 10.0.0.1 netmaske 255.255.255.0" defaultrouter = "88.8.9.1" sshd_enable = "YES" dumpdev = "NO"

#### Lokale handicappede tjenester ####
sendmail_enable =”NO”
sendmail_submit_enable =”NO”
sendmail_outbound_enable =”NO”
sendmail_msp_queue_enable =”NO”
sendmail_rebuild_aliases =”NO”
syslogd_enable =”YES”
syslogd_program =”/ usr / sbin / syslogd”
syslogd_flags =”- ss”

#### Lokale arbejdstjenester ####
tcp_drop_synfin =”YES”
icmp_drop_redirects =”YES”
dhcpd_enable =”YES”
dhcpd_ifaces =”em1"
dhcpd_conf =”/ usr / local / etc / dhcpd.conf”
gateway_enable =”YES”
natd_enable =”YES”
natd_interface =”em0"
firewall_enable =”YES”
firewall_type =”UNKNOWN”
firewall_script =”/ etc / ipfw.conf”

#### Tredjeparts tjenester ####
apache24_enable =”YES”
mysql_enable =”YES”

vi tilføjer følgende linjer til filen /etc/ipfw.conf for at vores konfigurerede firewall skal køre efter genstart.
ipfw tilføj 00200 omdirigere 8668 ip fra nogen til nogen via em0 ipfw tilføj 10800 tillader ip fra nogen til 88.8.9.58 ipfw tilføj 10900 tillader ip fra 88.8.9.58 til nogen ipfw tilføj 11000 tillader ip fra nogen til 88.8.9.59 ipfw tilføj 12000 tillader ip fra 88.8.9.59 til nogen ipfw tilføj 60000 fwd 10.0.0.1,80 tcp fra nogen til enhver dst-port 80 via em1 ipfw tilføj 60001 fwd 10.0.0.1,443 tcp fra nogen til enhver dst-port 443 via em1 ipfw tilføj 65000 tillader ip fra nogen til nogen ipfw tilføj 65535 nægte ip fra nogen til nogen

Minimer systemkernen og kompilér følgende muligheder:
indstillinger IPDIVERT indstillinger IPFIREWALL indstillinger IPFIREWALL_VERBOSE indstillinger IPFIREWALL_VERBOSE_LIMIT = 3 indstillinger DUMMYNET indstillinger IPFIREWALL_FORWARD indstillinger IPFIREWALL_NAT muligheder LIBALIAS

Installer DHCP-server fra porte
# cd / usr / ports / net / isc-dhcp42-server / - indtast portadressen # make config - Vælg de nødvendige moduler # make -DBATCH installer - installer

/usr/local/etc/dhcpd.conf vi laver installationsfilens indhold som følger:
option domænenavn "wifiofis.unixmen.com"; option domænenavn-servere ns1.unixmen.com, ns2.unixmen.com; standard leasingtid 3600; max-leasing-time 86400; ddns-update-style none; autoritative; subnet 10.0.0.0 netmaske 255.255.255.0 { interval 10.0.0.50 10.0.0.254; option routere 10.0.0.1; } # Vi forbeholder os adgangspunkter til de IP-adresser, der vises på billedet vært Wifi-1f.1 { hardware ethernet 04: 18: 76: 8c: 9a: a3; fast adresse 10.0.0.10; } vært Wifi-2f.1 { hardware ethernet 04: 18: 66: 43: 11: 11; fast adresse 10.0.0.20; } vært Wifi-3f.1 { hardware ethernet 04: 18: 36: 68: a9: 9b; fast adresse 10.0.0.30;

vi opretter en journalfil for DHCP og filter fra Syslog (/var/db/dhcpd/dhcpd.leases (du kan se i denne fil)
# touch /var/log/dhcp.log

Vi tilføjer follofing linjer til slutningen af /etc/syslog.conf fil:
! dhcpd *. * /var/log/dhcp.log

Vi kører DHCP og tjekker lytning:
# /usr/local/etc/rc.d/isc-dhcpd start # sockstat -l | grep dhcp dhcpd dhcpd 4695 7 udp4 *: 67 *: * dhcpd dhcpd 4695 20 udp4 *: 8997 *: *

Installer Sudo fra portene:
# cd `whereis sudo | awk '{print $ 2}' ` - skift katalog til porten # make config - vælg nødvendige moduler # make -DBATCH installer - installer

tilføj til / usr / local / etc / sudoers fil følgende linjer (det kræves for adgang til webserver til firewall):
unixmen ALL = (ALLE) NOPASSWD: SETENV: ALL

/usr/local/www/wifi/config.php indholdet af konfigurationsfilen vil være som følgende linjer (registreringen og stop registrerede brugere er opfyldt ved at tilføje eller fjerne reglerne for IPFW):
# cat /usr/local/www/wifi/config.php
<?php
define('DEBUG', true);
define('conf_DB_HOST', 'localhost'); //Database IP
define('conf_DB_USER', 'wifidbuser'); //username of database
define('conf_DB_PASS', 'wifidbpassword'); //the password of database
define('conf_DB_NAME', 'wifi'); //the name of database
define('RULE_NUM_MIN', 400); //IPFW rules begin from 400
define('RULE_NUM_MAX', 600); //IPFW rule finishs with 600
define('CLIENTS_IP_BEGIN', '10.0.0.50'); // the clients will start IP adress from
define('CLIENTS_IP_COUNT', '200');
define('CLIENTS_TIME', '3600'); //the period of internet access for users(an hour)
define('RULE_ADD_IP', 'sudo ipfw add %s allow ip from any to %s');
define('RULE_ADD_IP2', 'sudo ipfw add %s allow ip from %s to any');
define('RULE_DEL_IP', 'sudo ipfw del %s');
define('RULE_DEL_IP2', 'sudo ipfw del %s');
/*
STATUS:
0 – If the information of connection is true you are connected, otherwise the rule is not added!
1 - You have already connected
2 – The username has been already used.
3 – The user is stopped.
*/
$db_link = mysql_connect(conf_DB_HOST, conf_DB_USER, conf_DB_PASS);
if (!$db_link) return cms_errors('The connection to database is failed!);
if (!mysql_select_db(conf_DB_NAME, $db_link)) return cms_errors('The connection to database is failed!!!');
function cms_errors($text)
{
if (DEBUG) echo $text;
return false;
}
function dumpVarX(&$Var, $Var_s = null)
{
echo "<div align='left' class='debug'>";
dumpVar($Var, 0, $Var_s);
echo "<div>";
return true;
}
function dumpVar(&$Var, $Level = 0, $Var_s = null)
{
if ($Level > 4)
{
echo "<b>...</b> LEVEL > 4<br>n";
return;
}
$is_ob_ar = false;
$Type = gettype($Var);
if (is_array($Var)) {$is_ob_ar = true; $Type = "Array[".count($Var)."]";}
if (is_object($Var)) $is_ob_ar = true;
if ($Level == 0)
{
if ($Var_s) echo "n<br>n<b><span style="color:#ff0000">".$Var_s." = {</span></b>";
if ($is_ob_ar && count($Var)) echo "<pre>n";
else echo "n<tt>";
$Level_zero = 0;
}
if ($is_ob_ar)
{
echo "<span style="color:#05a209">$Type</span>n";
for (Reset($Var), $Level++; list($k, $v)=each($Var);)
{
if (is_array($v) && $k==="GLOBALS") continue;
for ($i=0; $i<$Level*3; $i++) echo " ";
echo "<b>".HtmlSpecialChars($k)."</b> => ";
dumpVar($v, $Level);
}
}
else
{
if (is_string($Var) && strlen($Var)>400)
echo '('.$Type.') <span style="color:#35BBFA">strlen = '.strlen($Var).'</span>'."n";
else echo '('.$Type.') "<span style="color:#0000FF">',HtmlSpecialChars($Var),'</span>"'."n";
}
if (isset($Level_zero))
{
if ($is_ob_ar && count($Var)) echo "</pre>";
else echo "</tt>";
if ($Var_s) echo "<b><span style="color:#ff0000">}</span></b><br>n";
}
return true;
}
?> = {</ span> </ b> "; hvis ($ is_ob_ar && count ($ Var)) ekko "<pre> n"; ellers ekko "n <tt>"; $ Level_zero = 0; } hvis ($ er_ob_ar) { ekko "<span style =" color: #05a209 "> $ Type </ span> n"; for (Reset ($ Var), $ Level ++; liste ($ k, $ v) = hver ($ Var);) { hvis (is_array ($ v) && $ k === "GLOBALS") fortsætter; for ($ i = 0; $ i <$ Level * 3; $ i ++) ekko ""; ekko "<b>". HtmlSpecialChars ($ k). "</ b> =>"; dumpVar ($ v, $ Level); } } andet { hvis (is_string ($ Var) && strlen ($ Var)> 400) ekko '('. $ Type. ') <span style = "color: #35BBFA"> strlen =' .strlen ($ Var). '</ span>'. "n"; ellers ekko '('. $ Type. ') "<span style =" farve: #0000FF ">', HtmlSpecialChars ($ Var), '</ span>' '." n "; } hvis (isset ($ Level_zero)) { hvis ($ is_ob_ar && count ($ Var)) ekko "</ pre>"; ellers ekko "</ tt>"; hvis ($ Var_s) ekko "<b> <span style =" color: #ff0000 ">} </ span> </ b> <br> n"; } returnere sandt; } ?>

Brugerens registreringsskript: /usr/local/www/wifi/add.php filen vil være som følger:
# cat /usr/local/www/wifi/add.php <? php require_once ( 'config.php'); $ user = get_user ($ _ GET ['login'], $ _GET ['pass']); hvis ($ bruger) { skifte ($ bruger ['status']) { sag 0: hvis (add_rule ($ user)) ekko '<h2> Du er forbundet! </ h2>'; Ellers ekko 'Den forkerte regel er ikke tilføjet!'; pause; tilfælde 1: echo '<h2> Du har allerede tilsluttet </ h2>'; pause; tilfælde 2: echo '<h2> Brugernavn er allerede brugt </ h2>'; pause; tilfælde 2: echo '<h2> Brugernavn er stoppet </ h2>'; pause; standard: ekko 'Fejl'; pause; } } ellers ekko '<h2> Brugernavn eller kodeord er forkert </ h2>';

// Registrering
funktion get_user ($ login, $ pass)
{
$ user = null;
hvis (! $ login ||! $ pass) returnere null;
$ login = addslashes ($ login);
$ sql = 'SELECT * FRA brugere, hvor brugernavn = "'. $ login. '" og password = "'. $ pass. '" LIMIT 1';
$ res = mysql_query ($ sql);
hvis ($ res) $ user = mysql_fetch_assoc ($ res);
returnere $ user;
}

// Tilføjelse af reglen
funktion add_rule ($ bruger)
{
$ user_ip = $ _SERVER ['REMOTE_ADDR'];
$ current_date = tid ();
hvis (! checkip ($ user_ip)) returnerer falsk;
$ temp = 0;
$ sql = 'SELECT rule_num FRA brugere WHERE status = 1 ORDER BY rule_num';
$ res = mysql_query ($ sql);
hvis ($ res)
{
$ t = mysql_fetch_array ($ res);
hvis (! $ t) $ rule_num = RULE_NUM_MIN;
else {
mens ($ temp = mysql_fetch_array ($ res))
{
Hvis (($ t [0] + 1) <$ temp [0]) brydes;
$ t = $ temp;
}
hvis ($ t [0] <RULE_NUM_MAX) $ rule_num = $ t [0] + 1; ellers returnere falsk;
}
} returnere ellers falsk;
$ command = sprintf (RULE_ADD_IP, $ rule_num, $ user_ip);
exec ($ kommando);
$ command2 = sprintf (RULE_ADD_IP2, $ rule_num + 100, $ user_ip);
exec ($ command2);
$ sql = 'UPDATE brugere SET status = 1, time_begin = NU (), rule_num ='. $ rule_num. ' Hvor id = '. $ Bruger [' id '];
mysql_query ($ sql);
returnere sandt;
}
funktion checkip ($ ip)
{
hvis (! $ ip) returnerer falsk;
$ user_ip = eksplodere ('.', $ ip);
$ check_ip = eksplodere ('.', CLIENTS_IP_BEGIN);
hvis (($ check_ip [0]! = $ user_ip [0]) && $ check_ip [0]! = "*") returner falsk;
hvis (($ check_ip [1]! = $ user_ip [1]) && $ check_ip [1]! = "*") returner falsk;
hvis (($ check_ip [2]! = $ user_ip [2]) && $ check_ip [2]! = "*") returner falsk;
hvis (! (($ check_ip [3] <= $ user_ip [3] && ($ check_ip [3] + CLIENTS_IP_COUNT)> = $ user_ip [3])) && $ check_ip [3]! = "*") returnere falsk ;
returnere sandt;
}
?>

Brugerens lukkede script i henhold til slutningen af ​​tiden /usr/local/www/wifi/cron.php:
# cat /usr/local/www/wifi/cron.php <? php require_once ( 'config.php'); check_users (); funktion check_users () { $ sql = 'SELECT * FRA brugere WHERE status = 1 OG time_begin> 0 OG (TIME_TO_SEC (TIMEDIFF (NU (), time_begin))>' .CLIENTS_TIME. ')'; $ res = mysql_query ($ sql); hvis ($ res) { mens ($ user = mysql_fetch_assoc ($ res)) { $ command = sprintf (RULE_DEL_IP, $ user ['rule_num']); exec ($ kommando); $ command2 = sprintf (RULE_DEL_IP2, $ user ['rule_num'] + 100); exec ($ command2); $ sql = 'UPDATE brugere SET status = 2, time_end = NU () hvor id ='. $ bruger ['id']; mysql_query ($ sql); } } returnere sandt; } ?>

Formularen for at tilføje brugernavn og adgangskode (f.eks index.html fil):
# cat /usr/local/www/wifi/index.html <! DOCTYPE html OFFENTLIG "- // W3C // DTD XHTML 1.0 Strict // EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns = "http://www.w3.org/1999/xhtml" xml: lang = "da" lang = "da"> <head> <meta http-equiv = "Content-Type" content = "tekst / html; charset = UTF-8" /> <title> Administration </ title> <link rel = "stylesheet" type = "text / css" href = "admin.css" /> <! - [hvis lt IE 7]> <link rel = "stylesheet" type = "text / css" href = "stil-ie.css" /> <! [endif] -> </ head> <body> <div class = "login"> <div class = "form"> <form method = "get" action = "add.php"> <p> <label> Login: </ label> <input class = "text" name = "login" type = "text" size = "17" /> </ p> <p> <label> Adgangskode: </ label> <input class = "text" name = "pass" type = "password" size = "16" /> </ p> <p> <input class = "submit" type = "submit" value = "Alt er OK!" /> </ formular> </ div> <div class = "rules"> <h1> Wi-Fi, hvordan du bruger </ h1> <ol> <li> Det er gratis for gæster! </ li> <li> Kom til modtagelse </ li> <li> Få brugernavn og kodeord </ li> <li> Brug wifi </ li> </ ol> </ div> </ div> </ body> </ html>

Administration panel vil være i / Usr / local / www / wifi / admin folder. Vi skal beskytte denne mappe med htpasswd for sikkerhed. Indholdet af filen /usr/local/www/wifi/admin/admin.php vil være som følger:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Administration panel</title>
<link type="text/css" rel="stylesheet" href="style.css">
</head>
<body>
<form method="post" action="admin.php">
The amount of users: <input type="text" value="" name="num" size=2> count.<br><br>
<input type="submit" value="Generate">
</form><hr>
<?php
require_once('/usr/local/www/wifi/config.php');
$n = (int) $_POST['num'];
if ($n > 10) { echo 'The number of users that can be created is over limited! <br><br>'; $n=0; }
function generate_password($number=10)
{
$arr = array('1','2','3','4','5','6',
'7','8','9','0');
// Generate the password
$pass = "";
for($i = 0; $i < $number; $i++)
{
// Calculate random index of massive
$index = rand(0, count($arr) - 1);
$pass .= $arr[$index];
}
return $pass;
}
for ($i=0; $i<$n; $i++)
{
$login = generate_password(4);
$pass = generate_password(6);
$sql = 'INSERT INTO users (username, password, status, rule_num) VALUES("apt'.$login.'", "'.$pass.'", 0, 0)';
$res = mysql_query($sql);
}
if ($res) echo 'Count of users <b>'.$n.'</b> is added.<br><br>';
$sql = 'SELECT * FROM users';
$res = mysql_query($sql);
echo '<table width='30%'><td><b>Username</b></td><td><b>Password</b></td><td><b>Status</b></td><td><b>Rule</b></td>';
while ($data = mysql_fetch_assoc($res))
{
echo '<tr>';
echo '<td>'.$data['username'].'</td>';
echo '<td>'.$data['password'].'</td>';
if ($data['status'] == 0) { echo '<td class='blue'>Is not active</td>'; }
if ($data['status'] == 1) { echo '<td class='green'>Used</td>';
echo '<td>'.$data['rule_num'].'</td>';}
if ($data['status'] == 2) { echo '<td class='reds'>Was used</td>'; }
if ($data['status'] == 3) { echo '<td><b>Was stopped</b></td>'; }
echo '</tr>';
}
echo '</table>';
?>
</body>
</html>

/usr/local/www/wifi/admin/style.css indholdet af filen vil være som følger: .reds {color: #f30;} .blue {farve: #0000cc;} .green {color: #0f0;}

I mappen / Usr / local / www / wifi vi vil oprette fil med navnet .htaccess og tilføj følgende linjer.
AuthUserFile / usr / local / www / wifi /.htpasswd AuthName "Soft Admin" AuthType Basic Kræver gyldig bruger

Vi opretter brugernavn og adgangskode i / Usr / local / www / wifi folder:
htpasswd -bc .htpasswd admin freebsd - Skriv admin brugernavn og freeBSD password i . Htpasswd fil
-b Tag brugernavn og adgangskode fra kommandolinjen.
-c -Creat filen, som vises og tilføj den (hvis den eksisterer, vil den fjerne og omskrive)

For at kontrollere brugere grænser vil vi tilføje cron fil vores globale / Etc / crontab konfigurationsfil. Dette vil kontrollere brugere hvert 1-minutinterval.
# echo "* / 1 * * * * root / usr / local / bin / php /usr/local/www/wifi/cron.php" >> / etc / crontab # /etc/rc.d/cron genstart

/usr/local/www/wifi/admin.css Filens indhold vil være som følger (Denne fil indstiller billederne i baggrunden). Men billederne er læst fra / Usr / local / www / wifi / img / folder. Billeder er /usr/local/www/wifi/img/gp.gif og /usr/local/www/wifi/img/logo.png (Du kan ændre disse billeder til hvor som helst du vil):
.login {width: 800px; højde: 540px; position: absolut; venstre: 50%; top: 50%; margen: -250px 0 0 -400px; grænse: stiplede 1px #ddd; baggrund: url (img / logo.png) 30px 30px no-repeat #fff;} .login. form {margin: 120px 0 0 450px;} .login .form p {position: relative; margen: 0 0 30px 0;} .login .form label {font: normal 18px arial; position: absolut; margen: 3px 0 0 0; farve: #aaa;} .login. form input {margin: 0 0 0 100px; padding: 2px; skrifttype: normal 18px arial;} .login .form input.text {grænse-højre: solid 1px #ccc; border-bottom: solid 1px #ccc; grænse-venstre: solid 1px #888; border-top: solid 1px #888;} .login .rules {polstring: 10px 20px; margen: 50px 30px; baggrund: url (img / gp.gif) 420px 20px no-repeat #ececec;} h1 {margin: 10px 0; skrifttype: normal 20px tahoma; farve: #c00;} ol {margen: 20px 0 0 30px; padding: 0;} ol li {margen: 0 0 10px 15px; skrifttype: normal 16px arial; }

Vi opdaterer alle autoriteter i mappen for at indstille alle nye filer:
# chown -R unixmen: unixmen / usr / local / www / wifi /

Når vi går ind på siden, bliver vi bedt om brugernavn og kodeord (vi skriver admin brugernavn og adgangskode, som vi oprettede før, og tryk derefter på enter):
Admin-panelets første side

Administratorinterfacet vil være som følger:
Admin-panel

Brugergrænsefladen vil være sådan:
Wifi-fangenskab portal

Kilden til brugte PHP koder er fra http://lissyara.su
Du kan downloade kildekoder fra her

Giv en kommentar

Dette websted bruger Akismet til at reducere spam. Lær, hvordan dine kommentardata behandles.