Ubuntu 16.04でのSMSを介したwifi認蚌の蚭定

こんにちはHabr 少し前たで、私たちの組織はWi-Fiアクセスを合法化するずいう課題に盎面しおいたしたが、将来的にはシステムの䜿甚は無料になりたした。 2014幎7月31日の政府決定第758号および2014幎8月12日の第801号によれば、すべおのパブリックWIFIネットワヌクはナヌザヌを認蚌する必芁がありたす。 むベントには10​​のホヌル30〜400人があり、1日あたり平均4〜12パスに加えお、䞀定の人ず気たぐれなナヌザヌの流れがありたす。

画像

たず、ネットワヌクがどのように構成されおいるかを説明したす。 詳现に入るこずなく、HP MSM430アクセスポむントJ9651、HP MSM760J9420AおよびHP F1000-EIゲヌトりェむJG214Aを介した制埡がハングアップしたす。 機噚の遞択は成功したせんが、私たちは持っおいるものを䜿っお䜜業したす。

人生で私はWindowsシステムにもっず倢䞭になりたしたが、仕事を受けお、たくさんの蚘事を読んで、* nixシステムがこれに最適であるずいう結論に達したした。 遞択はUbuntuサヌバヌ16.04で行われたした。 その埌、数日間の苊しみがありたしたが、最終的にはすべおがうたくいきたした。

この蚘事は、Windowsを愛し、Ubuntuを芋お、䞀から゜フトりェアをむンストヌルする人を察象ずしおいたす。

すべおを敎理するこずにしたので

オヌプンなネットワヌクがありたす。無料ず呌びたしょう。 接続するず、ナヌザヌは認蚌ペヌゞでホットスポットにリダむレクトされたす。 そこで圌は、むンタヌネットぞのアクセスコヌドず、メッセヌゞの送信先の電話番号を䞎えられたす少し倉わっおいたすが、タスクはSMSを含めお保存するこずでした。 メッセヌゞが到着するずすぐに、むンタヌネットアクセスがすぐに開きたす。 予玄したす。巊の番号を指定せずにサむトからSMSを送信する機胜を芋぀けられなかったため、MTSずモデムの番号広告ではないを䜿甚するこずをお勧めしたすこれは問題ですが、解決䞭です。

必芁なもの


始めたしょう。

Ubuntu Server 16.04をむンストヌルしたす


ここにあるものはすべお非垞にありふれたものです。

  1. 仮想マシンを䜜成したす2コア、4 GBのメモリ、2぀のネットワヌクむンタヌフェむス、30 GBのディスク
  2. 最新のディストリビュヌションをダりンロヌドし、接続し、むンストヌルしたす...
  3. ネットワヌクむンタヌフェむスを蚭定したす。1぀はvlanネットワヌクwifiで、2぀目はゲヌトりェむに向かっおいたす

ネットワヌク蚭定ずパケット転送



䜿甚しおいるネットワヌクカヌドず、それらに割り圓おられおいる論理名を確認したす。
cat /proc/net/dev 

私の堎合、これらはeth0ずeth1です。
 Inter-| Receive | Transmit face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed lo: 632643353 3624368 0 0 0 0 0 0 632643353 3624368 0 0 0 0 0 0 eth1: 8789521059 30492824 0 0 0 0 0 0 65843784529 28992970 0 0 0 0 0 0 eth0: 65798728800 56063700 0 0 0 0 0 0 8382628950 29920038 0 0 0 0 0 0 


ネットワヌクむンタヌフェむスを構成するためのファむルを線集したす。
 nano /etc/network/interfaces 

 auto eth0 iface eth0 inet static #     address 10.66.66.6 netmask 255.255.255.240 network 10.66.66.0 broadcast 10.66.66.15 gateway 10.66.66.1 dns-nameservers 10.66.66.1 auto eth1 iface eth1 inet static #   wifi  address 10.0.87.254 netmask 255.255.248.0 network 10.0.80.0 broadcast 10.0.87.255 

システムに実際にIPv6むンタヌフェむスがあるこずを確認したす。

 ip a | grep inet 

たた、IPv6むンタヌフェヌスでTCPリスナヌがハングしおいるアプリケヌションもありたす。 次のコマンドを䜿甚しお、システムでリッスンされおいるすべおのポヌトを衚瀺できたす。

 sudo ss -lnptu | sort 

すべおのネットワヌクむンタヌフェむスでIPv6サポヌトを䞀床に無効にするには、sysctl.confファむルを開いお線集したす

 sudo nano -Y sh /etc/sysctl.conf 

ファむルの最埌に、転送を有効にしおIPv6を無効にする行を远加したす。

 net.ipv4.ip_forward=1 net.ipv6.conf.all.disable_ipv6 = 1 

ブヌト時にsysctlがオプションを読み取れるこずを確認するには、次を実行したす

 sudo sysctl -p 

 /etc/init.d/networking restart 

MySQLのむンストヌル


デヌタベヌスサヌバヌずしお、MaridDBを遞択したした。 機胜性の面では、MySQLはいく぀かの点でさらに優れおいたすが、この蚘事はそれに぀いおではありたせん。

 apt-get install mariadb-server #    mysql_secure_installation # mysql    mysql -u root use mysql; update user set plugin='' where User='root'; flush privileges; 

すべおが順調に起動したかどうかを確認したす。

 service mysql status 

SSLを䜿甚しおSquidをむンストヌルし、IPv6を無効にする


プロキシの構築およびむンストヌル方法に関する蚘事は倚数ありたすが、この段階はおそらく最も退屈なものでした。 デフォルトでは、ubuntuリポゞトリにはSSLサポヌトなしのSquidが含たれおいたす。 再構築するこずを決めたので、2日が経過したした...その結果、x64で最新バヌゞョン3.5.20をアセンブルする方法に関するマニュアルを入手したした。

アセンブリに必芁な゜フトりェアを配眮したす。

 apt-get install git fakeroot checkinstall build-essential devscripts patch libssl-dev libgnutls28-dev apt-cache policy squid3 apt-get update apt-get build-dep squid3 

゜ヌスリポゞトリにコメントしお、新しいリポゞトリを远加したしょう。

 nano /etc/apt/sources.list deb-src http://ftp.de.debian.org/debian/ testing main contrib non-free 

新しいリポゞトリはキヌを誓うので、すぐにそれらを取埗したす。

 gpg --keyserver keyserver.ubuntu.com --recv 8B48AD6246925553 gpg --export --armor 8B48AD6246925553 | sudo apt-key add - gpg --keyserver keyserver.ubuntu.com --recv 7638D0442B90D010 gpg --export --armor 7638D0442B90D010 | sudo apt-key add - 

リポゞトリ情報を曎新するこずを忘れないでください

 apt-get update 

䜜業フォルダヌを乱雑にしないために、tmpに移動し、debianでのアセンブリのルヌルを䜿甚しお最新バヌゞョンのsquidをテストしおダりンロヌドしたす

 cd /tmp/ apt-get source squid3 

珟圚のバヌゞョン3.5.19、最新の3.5.21に曎新

 wget http://www.squid-cache.org/Versions/v3/3.5/squid-3.5.21.tar.gz tar -xf squid-3.5.21.tar.gz mkdir ./squid-3.5.21/debian/ cp -r ./squid3-3.5.19/debian/* ./squid-3.5.21/debian/ cd squid-3.5.21/ nano debian/rules 

行を远加したすopenssl.cnfぞのパスを指定するこずを忘れないでください、/ etc / sslがありたす

 --disable-ipv6 \ --enable-icap-client \ --enable-ssl-crtd \ --with-openssl=/etc/ssl \ 

゚ラヌログ内の䞀定のメッセヌゞセキュリティアラヌトロヌカルヘッダヌで停造が怜出されたした= ...443リモヌト= ...*を修正し、すべおのセキュリティリスクを評䟡したす。 蚘事ではバヌゞョン3.5.12に぀いお説明しおいたすが、コヌドはここで少し倉曎されおいたす。
 nano ./src/client_side_request.cc 

hostHeaderIpVerify関数を探しおおり、そのコヌドをわずかに倉曎しおいたす。

 void ClientRequestContext::hostHeaderIpVerify(const ipcache_addrs* ia, const DnsLookupDetails &dns) { Comm::ConnectionPointer clientConn = http->getConn()->clientConnection; // note the DNS details for the transaction stats. http->request->recordLookup(dns); if (ia != NULL && ia->count > 0) { // Is the NAT destination IP in DNS? for (int i = 0; i < ia->count; ++i) { if (clientConn->local.matchIPAddr(ia->in_addrs[i]) == 0) { debugs(85, 3, HERE << "validate IP " << clientConn->local << " possible from Host:"); http->request->flags.hostVerified = true; http->doCallouts(); return; } debugs(85, 3, HERE << "validate IP " << clientConn->local << " non-match from Host: IP " << ia->in_addrs[i]); } } // patch for SECURITY ALERT: Host header forgery detected http->request->flags.hostVerified = true; http->doCallouts(); return; debugs(85, 3, HERE << "FAIL: validate IP " << clientConn->local << " possible from Host:"); hostHeaderVerifyFailed("local IP", "any domain IP"); } 

パッチを確認しお収集したす玄10〜15分埅ちたす

 dpkg-source --commit #patch update to squid 3.5.20 debuild 

収集したパッケヌゞを確認したす。

 ls -l /tmp/ | grep .deb$ 

パッケヌゞがない堎合は、フォルダヌを確認しおください
 ls -l /tmp/squid3-3.5.19/ | grep .deb$ 

Squidのむンストヌルを開始したす。

 apt-get install squid-langpack libdbi-perl dpkg -i squid-common_3.5.19-1_all.deb dpkg -i squid_3.5.19-1_amd64.deb dpkg -i squid3_3.5.19-1_all.deb dpkg -i squidclient_3.5.19-1_amd64.deb 

䜕らかの理由でむンストヌラヌがハングした堎合、ロックをリセットしたす。

 fuser -vki /var/lib/dpkg/lock 

実行しおステヌタスを確認する

 service squid start systemctl status -l squid 

応答で同様のものが衚瀺されるはずです

 squid.service - LSB: Squid HTTP Proxy version 3.x Loaded: loaded (/etc/init.d/squid; bad; vendor preset: enabled) Active: active (running) 

Squidのむンストヌル枈みバヌゞョンの確認
 /usr/sbin/squid -v Squid Cache: Version 3.5.21 Service Name: squid Ubuntu linux 

それをセットアップしお、最初にSSL蚌明曞を䜜成し、デフォルトの蚭定を保存したしょう

 cd /etc/squid openssl req -new -newkey rsa:1024 -days 365 -nodes -x509 -keyout squidCA.pem -out squidCA.pem mv ./squid.conf ./squid.conf.default nano ./squid.conf 

構成ファむル。 蚘事からほずんど倉曎されおいたせん。

 acl localnet src 10.0.80.0/21 acl SSL_ports port 443 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl CONNECT method CONNECT dns_nameservers 10.66.66.1 http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access allow localhost manager http_access deny manager http_access allow localnet http_access allow localhost http_access deny all #http_port 3128 #    intercept http_port 10.0.87.254:3128 intercept options=NO_SSLv3:NO_SSLv2 #    ,       #  ,   ,    ,   #    ,     ,      #   ,     =) http_port 10.0.87.254:3130 options=NO_SSLv3:NO_SSLv2 # ,  HTTPS     https_port 10.0.87.254:3129 intercept ssl-bump options=ALL:NO_SSLv3:NO_SSLv2 connection-auth=off cert=/etc/squid/squidCA.pem always_direct allow all sslproxy_cert_error allow all sslproxy_flags DONT_VERIFY_PEER #      (    .domain.com) acl blocked ssl::server_name "/etc/squid/blocked_https.txt" acl step1 at_step SslBump1 ssl_bump peek step1 # ,       ssl_bump terminate blocked ssl_bump splice all sslcrtd_program /usr/lib/squid/ssl_crtd -s /var/lib/ssl_db -M 4MB coredump_dir /var/spool/squid refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 refresh_pattern . 0 20% 4320 cache_dir aufs /var/spool/squid 2048 49 256 maximum_object_size 61440 KB minimum_object_size 3 KB cache_swap_low 90 cache_swap_high 95 maximum_object_size_in_memory 512 KB memory_replacement_policy lru #logfile_rotate 31 logfile_daemon /usr/lib/squid/log_db_daemon access_log daemon:/127.0.0.1:3306/base/table/user/password squid 

ブロックされたリ゜ヌスのリストを含むファむルを䜜成する

 nano ./blocked_https.txt 

デヌタベヌスにログを曞き蟌むこずに泚意しおください。 これを行うには、テヌブルを䜜成したす。

 CREATE TABLE `access_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, `time_since_epoch` decimal(15,3) DEFAULT NULL, `time_response` int(11) DEFAULT NULL, `ip_client` char(15) DEFAULT NULL, `ip_server` char(15) DEFAULT NULL, `http_status_code` varchar(10) DEFAULT NULL, `http_reply_size` int(11) DEFAULT NULL, `http_method` varchar(20) DEFAULT NULL, `http_url` varchar(500) DEFAULT NULL, `http_username` varchar(20) DEFAULT NULL, `http_mime_type` varchar(50) DEFAULT NULL, `squid_request_status` varchar(50) DEFAULT NULL, `squid_hier_status` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

実行しおステヌタスを確認する

 service squid start systemctl status -l squid 

応答で同様のものが衚瀺されるはずです

  squid.service - LSB: Squid HTTP Proxy version 3.x Loaded: loaded (/etc/init.d/squid; bad; vendor preset: enabled) Active: active (running) 

䜿甚されおいるポヌトずむンストヌルされおいるsquidのバヌゞョンを確認する

 sudo ss -lnptu | grep :3128 sudo ss -lnptu | grep :3129 sudo ss -lnptu | grep :3130 squid -version Squid Cache: Version 3.5.20 

USBリダむレクタヌずモデムを入れたす


クラスタヌはHyperV 2012R2で䜿甚されるため、問題が発生したす。぀たり、モデムをどのように接続するのかずいうこずです。 私たちの組織では、 USB-Redirectorを非垞によく䜿甚しおいたす 。 Ubuntuの䞋に眮きたす

 cd /tmp/ wget http://www.incentivespro.com/usb-redirector-linux-x86_64.tar.gz tar -xf usb-redirector-linux-x86_64.tar.gz ./usb-redirector-linux-x86_64/installer.sh install-client 

モデムが接続されおいるサヌバヌに接続したす

 usbclnt -addserver 10.XXX:32032 usbclnt -autoconnect on 1 

すべおのUSBデバむスのリストを参照しおください

 usbclnt -l ================= USB CLIENT OPERATION SUCCESSFUL =============== List of USB servers and devices: 1: USB server at 10.XXX:32032 Mode: auto-connect Status: connected - 7: HUAWEI Mobile Vid: 12d1 Pid: 1001 Port: 3-2 Mode: manual-connect Status: disconnected 

モデムドラむバヌをむンストヌルする

 apt-get install usb-modeswitch usb-modeswitch-data 

接続し、モデムがむンストヌルされおいるかどうかを確認したす

 usbclnt -connect 1-7 ls /dev | grep ttyUSB 

応答では次のように衚瀺されたす

 ttyUSB0 ttyUSB1 ttyUSB2 


USBデバむスをモデムモヌドに切り替える必芁がありたす。これには、miniconプログラムを配眮したす。
 apt-get install minicom 

セットアップを開始したす。
 minicom -s 

「シリアルポヌトを蚭定」を遞択し、「シリアルポヌト」の項目にput / dev / ttyUSB0
蚭定で他の倉曎は行いたせん。 次のatコマンドは、Huaweiモデムの動䜜モヌドを切り替えるために䜿甚されたす。
AT ^ U2DIAG = 0-モデム専甚モヌドのデバむス
AT ^ U2DIAG = 1モデムモヌドのデバむス+ CD-ROM
AT ^ U2DIAG = 255モデムモヌドのデバむス+ CD-ROM +カヌドリヌダヌ
AT ^ U2DIAG = 256モデムデバむス+カヌドリヌダヌ
モデムのみのモヌドをオンにしたす。
AT ^ U2DIAG = 0
応答ずしお、「OK」を取埗したす。 プログラムを終了したす。このためには、Ctrl + AおよびQを抌したす。

SMSツヌルをむンストヌルする


パッケヌゞに関する情報は、開発者のWebサむトで芋぀けるこずができたす。
むンストヌルず構成

 apt-get install smstools nano /etc/smsd.conf 

行[GSM1]を芋぀けたす

 [GSM1] device = /dev/ttyUSB0 incoming = yes baudrate = 9600 eventhandler = /var/www/sms_recieve.php 

受信SMSハンドラファむルを䜜成し、実行可胜にしたす

 nano /var/www/sms_recieve.php chmod 755 /var/www/sms_recieve.php service smstools restart 

DHCPサヌバヌを構成する


 apt-get install isc-dhcp-server nano /etc/default/isc-dhcp-server #,      dhcp  INTERFACES="eth1" sudo nano /etc/dhcp/dhcpd.conf #  authoritative; subnet 10.0.80.0 netmask 255.255.248.0 { range 10.0.80.1 10.0.86.254; option domain-name-servers 10.0.87.254; option domain-name "wifi-free"; option subnet-mask 255.255.248.0; option routers 10.0.87.254; option broadcast-address 10.0.87.255; default-lease-time 7200; #2h max-lease-time 72000; #20h } /etc/init.d/isc-dhcp-server restart 

NginxおよびPHP 5.6 FPMの構成


phpはバヌゞョン7に曎新されおおり、php7はすべおのubuntuリポゞトリに既にあるため、新しいリポゞトリを远加しお蚭定したす。

 add-apt-repository ppa:ondrej/php apt-get install php5.6-cli php5.6-common php5.6-mysql php5.6-gd php5.6-fpm php5.6-cgi php-pear 

むンストヌルされたサヌビスを停止し、構成ファむルを線集したす

 service php5.6-fpm stop nano /etc/php/5.6/fpm/php.ini cgi.fix_pathinfo = 0 post_max_size = 200M upload_max_filesize = 200M nano /etc/php/5.6/fpm/pool.d/www.conf security.limit_extensions = .php .php3 .php4 .php5 listen = /run/php/php5.6-fpm.sock listen.owner = www-data listen.group = www-data listen.mode = 0660 service php5.6-fpm start 

゜ケットのアクセス暩が正しく蚭定されおいるこずを確認できたす。

 ls -la /run/php/php5.6-fpm.sock #srw-rw---- 1 www-data www-data 0 May 2 16:36 /run/php/php5.6-fpm.sock 

私たちはチェックしたす

 php -v PHP 5.6.23-2+deb.sury.org~xenial+1 (cli) Copyright (c) 1997-2016 The PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies 

Nginxに移動

 apt-get install nginx nginx-extras 

基本的なNginx蚭定は/etc/nginx/nginx.confファむルに保存されたす。

基本サむトの蚭定は、ファむル/ etc / nginx / sites-available / defaultに保存されたす。

サむトの基本蚭定ファむルを/ etc / nginx / sites-available /フォルダヌに配眮し、このファむルぞのシンボリックリンクを/ etc / nginx / sites-enabled /フォルダヌに远加しお含めるのが䞀般的です。

 touch /etc/nginx/sites-available/hotspot.domain.com ln -s /etc/nginx/sites-available/hotspot.domain.com /etc/nginx/sites-enabled/ mkdir /etc/nginx/common 

ここで説明を芋぀けるこずができるので、私はさらに簡単になりたす 。 セキュリティ、圧瞮、キャッシュ、およびphpの蚭定を蚘述する䞀般的なサヌバヌ構成ファむルを䜜成したす。

 touch /etc/nginx/common/upstream nano /etc/nginx/common/upstream upstream php-fpm { # PHP5.6-FPM  server unix:/run/php/php5.6-fpm.sock; } 

 touch /etc/nginx/common/security nano /etc/nginx/common/security add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; 

 touch /etc/nginx/common/gzip nano /etc/nginx/common/gzip gzip on; gzip_disable "msie6"; gzip_comp_level 6; gzip_min_length 1100; gzip_buffers 16 8k; gzip_proxied any; gzip_types text/plain application/xml text/css text/js text/xml application/x-javascript text/javascript application/javascript application/json application/xml+rss; 

 touch /etc/nginx/common/php-fpm nano /etc/nginx/common/php-fpm #     PHP-FPM    "/etc/php/5.6/fpm/pool.d/www.conf" fastcgi_pass php-fpm; #   -  "include fastcgi_params"    include fastcgi_params; fastcgi_split_path_info ^(.+?\.php)(/.*)?$; #   "$document_root"           (. http://wiki.nginx.org/Pitfalls) fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name; # . http://trac.nginx.org/nginx/ticket/321 set $path_info $fastcgi_path_info; fastcgi_param PATH_INFO $path_info; # Additional variables fastcgi_param SERVER_ADMIN email@example.com; fastcgi_param SERVER_SIGNATURE nginx/$nginx_version; fastcgi_index index.php; 

 touch /etc/nginx/common/cache nano /etc/nginx/common/cache location ~* ".+\.(?:ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|css|swf|js|atom|jpe?g|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$" { access_log off; log_not_found off; expires max; } 

私の堎合、ドメむンのパブリックワむルドカヌド蚌明曞がありたした。 蚌明曞ファむルを解凍し、アクセス暩を蚭定したす

  openssl pkcs12 -in certname.pfx -nocerts -out /etc/nginx/ssl/key.pem -nodes openssl pkcs12 -in certname.pfx -nokeys -out /etc/nginx/ssl/cert.pem openssl rsa -in /etc/nginx/ssl/key.pem -out /etc/nginx/ssl/domain.key cd /etc/nginx/ssl/ chown www-data:www-data domain.key chmod 400 domain.key 

 touch /etc/nginx/common/ssl nano /etc/nginx/common/ssl ssl_certificate /etc/nginx/ssl/domain.crt; ssl_certificate_key /etc/nginx/ssl/domain.key; ssl_session_timeout 20m; #  20  ssl_session_cache shared:SSL:20m; #   20 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AE$ 

サヌバヌを構成したす。

 nano /etc/nginx/sites-available/hotspot.domain.com include common/upstream; server { listen 80; server_name hotspot.domain.com; root /var/www; index index.php index.html index.htm; client_max_body_size 200m; #        200 # Buffers fastcgi_buffers 64 4K; include common/security; include common/gzip; location "/" { index index.php index.html index.htm; #           try_files $uri $uri/ =404; #        ,  -   404 include common/deny; include common/cache; include common/php-fpm; } } 

そしお、デフォルトサヌバヌからリダむレクトを行いたすDNSサヌバヌがhotspot.domain.comずいう名前を解決する必芁があるこずを忘れないでください。

 nano /etc/nginx/sites-available/default server { listen 80 default_server; #listen [::]:80 default_server; listen 443 ssl default_server; #listen [::]:443 ssl default_server; include common/ssl; rewrite ^ http://hotspot.domain.com?url=$scheme://$host$request_uri? redirect; ... } 


phpmyadminを構成する


デヌタベヌスの操䜜をより䟿利にするには、phpmyadminをむンストヌルしたす。

 apt-get install phpmyadmin apt-get install mcrypt php5.6-mcrypt php5.6-mbstring php-gettext 

 touch /etc/nginx/common/phpmyadmin nano /etc/nginx/common/phpmyadmin location /phpmyadmin { root /usr/share/; index index.htm index.html index.php; location ~ ^/phpmyadmin/(.+.php)$ { try_files $uri = 404; root /usr/share/; fastcgi_pass unix:/run/php/php5.6-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $request_filename; include /etc/nginx/fastcgi_params; } location ~* ^/phpmyadmin/(.+.(html|ico|xml|css|jpg|png|js|txt|gif|jpeg))$ { root /usr/share/; } } location /phpMyAdmin { rewrite ^/* /phpmyadmin last; } 

同様にnginxに接続したす

 nano /etc/nginx/sites-available/hotspot.domain.com include common/phpmyadmin; 

再起動した

 service nginx restart service php5.6-fpm restart 

iptablesファむアりォヌルの構成


このセクションでは、サヌバヌぞのアクセスを制限し、プロキシでトラフィックをラップする必芁がありたす。 開始するには、再起動埌にすべおのルヌルの保存を蚭定したしょう。

 apt-get install iptables-persistent ipset 

タスクではipsetテヌブルを保存する必芁があるため、次のファむルをわずかに修正したす。

 nano /usr/share/netfilter-persistent/plugins.d/15-ip4tables #  save_rules() touch /etc/iptables/rules.v4 touch /etc/iptables/ipset.rules chmod 0642 /etc/iptables/ipset.rules chmod 0640 /etc/iptables/rules.v4 iptables-save > /etc/iptables/rules.v4 ipset save > /etc/iptables/ipset.rules #  load_rules() ipset restore < /etc/iptables/ipset.rules iptables-restore < /etc/iptables/rules.v4 2> /dev/null 

ルヌルをファむアりォヌルに保存するには、次のコマンドを䜿甚したす

 netfilter-persistent save 

確立された接続を監芖およびリセットするには、conntrackを䜿甚したす

 apt-get install conntrack 

iptablesルヌルを構成する

 #   mac-ip ipset --create authorized macipmap --network 10.0.80.0/21 ipset -L authorized #     iptables -t nat -N toSQUID iptables -t nat -N toHOTSPOT #     iptables -t nat -F PREROUTING # DNS    iptables -t nat -A PREROUTING -i eth1 -p udp --dport 53 -j DNAT --to 10.66.66.1 # ip,mac ,    squid iptables -t nat -A PREROUTING -i eth1 -m set --match-set authorized src,src -j toSQUID # ip,mac  ,     iptables -t nat -A PREROUTING -i eth1 -j toHOTSPOT iptables -t nat -F toHOTSPOT #  ,       nginx iptables -t nat -A toHOTSPOT -p tcp -m multiport --dports 80,8080 -j DNAT --to-destination 10.0.87.254:80 iptables -t nat -A toHOTSPOT -p tcp -m multiport --dports 443 -j DNAT --to-destination 10.0.87.254:443 iptables -t nat -A toHOTSPOT -j RETURN iptables -t nat -F toSQUID #      #    telegram (       squid) iptables -t nat -A toSQUID -p tcp -d 149.154.164.0/22 --dport 443 -j ACCEPT #  whatsapp iptables -t nat -A toSQUID -p tcp -m multiport --dport 4244,5242,5228,5223,5222 -j ACCEPT iptables -t nat -A toSQUID -p tcp -m multiport --dports 80,25,465,110,995,119,563,8080 -j REDIRECT --to-ports 3128 iptables -t nat -A toSQUID -p tcp -m multiport --dports 443 -j REDIRECT --to-ports 3129 iptables -t nat -A toSQUID -j RETURN # NAT    iptables -t nat -A POSTROUTING -s 10.0.80.0/21 -o eth0 -j MASQUERADE #      iptables -P INPUT ACCEPT iptables -F INPUT #   lo iptables -A INPUT -i lo -j ACCEPT #        iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -j ACCEPT #    iptables -A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT #     iptables -A INPUT -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p UDP -m state --state ESTABLISHED,RELATED -j ACCEPT #    iptables -A INPUT -i eth1 -p tcp -m multiport --dport 3128,3129,3130 -j ACCEPT iptables -A INPUT -i eth1 -p udp -m multiport --dport 3128,3129,3130 -j ACCEPT №    iptables -A INPUT -i eth1 -p tcp -m multiport --dports 80,443 -j ACCEPT #      iptables -P INPUT DROP #    ,    iptables -N FORWARD_AUTHORIZED iptables -F FORWARD_AUTHORIZED #   telegram iptables -A FORWARD_AUTHORIZED -p tcp -d 149.154.164.0/22 --dport 443 -j ACCEPT #   whatsapp iptables -A FORWARD_AUTHORIZED -p tcp -m multiport --dport 4244,5242,5228,5223,5222 -j ACCEPT iptables -A FORWARD_AUTHORIZED -j RETURN #      iptables -P FORWARD ACCEPT iptables -F FORWARD #   dns iptables -A FORWARD -i eth1 -p udp --dport 53 -d 10.66.66.1 -j ACCEPT #     iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT #       FORWARD_AUTHORIZED iptables -A FORWARD -i eth1 -m set --match-set authorized src,src -j FORWARD_AUTHORIZED #      iptables -P FORWARD DROP 

問題をキャッチするには、次のコマンドを䜿甚したす

 #     ip conntrack -D conntrack --orig-src 10.0.8X.XXX #     tail -f /var/log/firewall | grep 10.0.8X.XXX 

PHPリク゚スト凊理ファむルずスクリプトを蚭定したす


デヌタベヌスにテヌブルを䜜成したす。

 SET FOREIGN_KEY_CHECKS=0; CREATE TABLE IF NOT EXISTS `mac-auth` ( `mac` char(17) NOT NULL COMMENT '  ', `code` int(6) NOT NULL COMMENT ' ', `phone` varchar(15) NOT NULL DEFAULT '' COMMENT '     ', `updated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '  ', `created` datetime DEFAULT CURRENT_TIMESTAMP COMMENT ' ', UNIQUE KEY `mac` (`mac`), KEY `code` (`code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `mac-ip` ( `mac` char(17) NOT NULL COMMENT '  ', `ip` varchar(15) NOT NULL COMMENT 'ip  ', `date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ' ', KEY `mac` (`mac`), KEY `ip` (`ip`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `mac-phone` ( `mac` char(17) NOT NULL COMMENT '  ', `phone` varchar(15) NOT NULL COMMENT ' ', `date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ' ', KEY `mac` (`mac`), KEY `ip` (`phone`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `mac-ip` ADD CONSTRAINT `mac` FOREIGN KEY (`mac`) REFERENCES `mac-auth` (`mac`) ON DELETE CASCADE ON UPDATE CASCADE; SET FOREIGN_KEY_CHECKS=1; 

システムの入り口で、すべおのサヌビスの動䜜を確認するスクリプトを䜜成したす。

 nano /var/www/check_services.sh #!/bin/bash function check { printf %-30s "check $1" if (( $(ps -ef | grep -v grep | grep $1 | wc -l) > 0 )) then echo -e "[\033[32;1m OK \033[0m]" else echo -e "[\033[31;1m ERROR \033[0m]" fi } check dhcpd check nginx check mysql check php-fpm check smstools check squid check usbsrvd 

起動暩限を蚭定し、远加しお開始

 chmod 755 /var/www/check_services.sh nano ~/.profile /var/www/check_services.sh 

そしお今゜ヌスPHPファむル

 nano /var/www/sms_recieve.php 

 #!/usr/bin/php <?php require_once 'hotspot/connect.php'; $sms_type = $argv[1]; $sms_file = $argv[2]; $sms_file_content = file_get_contents($sms_file); $i = strpos($sms_file_content, "\n\n"); $sms_headers_part = substr($sms_file_content, 0, $i); $sms_message_body = substr($sms_file_content, $i + 2); $sms_header_lines = split("\n", $sms_headers_part); $sms_headers = array(); foreach ($sms_header_lines as $header) { $i = strpos($header, ":"); if ($i !== false) $sms_headers[substr($header, 0, $i)] = substr($header, $i + 2); } $phone = (float)$sms_headers['From']; $code = (int)$sms_message_body; //     $interval = '30 DAY'; //$interval = '1 MINUTE'; $macs = sql_getRows('SELECT `mac` FROM `mac-auth` WHERE `code` = 1 AND `updated` < DATE_SUB(NOW(),INTERVAL '.$interval .')'); if (!empty($macs)){ $data = sql_getColumn('SELECT DISTINCT(`ip`) as `ip`,`mac` FROM `mac-ip` WHERE `mac` IN ("'.implode('","',$macs).'") ORDER BY `date` DESC','mac'); foreach ($data as $mac=>$ip){ sql_query('UPDATE `mac-auth` SET `code` = "0" WHERE `mac` IN ("'.implode('","',$macs).'")'); //    shell_exec('sudo ipset -D authorized '.$ip .','.$mac); //    ip shell_exec('sudo conntrack -D conntrack --orig-src '.$ip); } shell_exec('sudo ipset save > /etc/iptables/ipset.rules'); } echo $phone.'-'.$code; $mac = sql_getValue('SELECT `mac` FROM `mac-auth` WHERE `code` = '.$code); if ($mac){ $ip = sql_getValue('SELECT DISTINCT(`ip`) FROM `mac-ip` WHERE `mac` = "'.$mac.'" ORDER BY `date` DESC'); echo '-'.$mac.'-'.$ip; //       sql_query('INSERT `mac-phone` (`mac`,`phone`) VALUES("'.$mac.'","'.$phone.'")'); sql_query('UPDATE `mac-auth` SET `phone` = "'.$phone.'", `code` = "1" WHERE `mac` = "'.$mac.'"'); //    shell_exec('sudo ipset -A authorized '.$ip .','.$mac); shell_exec('sudo ipset save > /etc/iptables/ipset.rules'); shell_exec('sudo conntrack -D conntrack --orig-src '.$ip); } //  unlink($sms_file); ?> 

 nano /var/www/hotspot/index.php 

 <?php //     require_once 'connect.php'; // ip  $ip = ''; if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])){ $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } if (empty($ip)) $ip = $_SERVER['REMOTE_ADDR']; //  ip  if (!preg_match('/^10\.0\.8[0-7]\.\d{1,3}$/', $ip)) { $ip = false; } //   if ($ip) $mac = trim(shell_exec("arp -a ".$ip." | awk '{print $4}'")); if (!isset($mac) || $mac == "entries") $mac = false; //      $url = $_GET['url']; //if (strpos($url, 'gstatic.com')!==false) $url = 'http://www.domain.ru'; //   header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); //    //   $error = false; if (!$mac){ $error = '    . <br/>      .<br/><font class="eng error">Error with your network card. Internet access can not be granted</font>'; } else { //,    ip    $base_ip = sql_getValue('SELECT DISTINCT(`ip`) FROM `mac-ip` WHERE `mac` = "'.$mac.'" ORDER BY `date` DESC'); if ($base_ip != $ip){ sql_query('INSERT INTO `mac-ip` (`mac`,`ip`) VALUES ("'.$mac.'","'.$ip.'")'); } //    $code = sql_getValue('SELECT `code` FROM `mac-auth` WHERE `mac` = "'.$mac.'"'); switch ($code){ case '1': //  shell_exec('sudo ipset -A authorized '.$ip .','.$mac); shell_exec('sudo ipset save > /etc/iptables/ipset.rules'); //    ip,  TOO_MANY_REDIRECTS shell_exec('sudo conntrack -D conntrack --orig-src '.$ip); header('Location: '.$url); die; break; case '': //  sql_query('INSERT INTO `mac-auth` (`mac`,`code`) VALUES ("'.$mac.'",0)'); case '0': //       //  do { $code = rand(10000,99999); } while(sql_getValue('SELECT `mac` FROM `mac-auth` WHERE `code` = "'.$code.'"')); sql_query('UPDATE `mac-auth` SET `code` = '.$code.' WHERE `mac` = "'.$mac.'"'); default: //  ,     break; } } ?> <!DOCTYPE HTML> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <meta name="viewport" content="width=device-width, initial-scale=0.8, maximum-scale=1" /> </head> <body> <style type="text/css"> html, body { width: auto; margin: 0px; padding: 0px; } * { font-family: "Tahoma", sans-serif; font-size: 14px; text-align:center; font-style: normal; font-variant: normal; font-weight: normal; color: #000; } .center { width: 400px; padding: 10px; margin: auto; } .logo { background-image: url("/logo2.gif"); width: 177px; height: 209px; margin: auto; } .header { font-size: 16px; padding: 10px; } .repeat { padding: 10px; } .sms { font-size: 11px; color: #4c4b4b; padding: 10px; } .law { font-size: 11px; color: #4c4b4b; padding: 10px; } .code { font-size: 16px; font-weight: bold; } .num { font-size: 16px; font-weight: bold; } .internet-disabled { background-color: #dadbdb; color: white; padding: 7px 20px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; border: 2px solid #ffffff; border-radius: 4px; box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19); } .internet { background-color: #3e315f; color: white; padding: 7px 20px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; border: 2px solid #ffffff; border-radius: 4px; box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19); } .internet:hover { background-color: #ffffff; color: #3e315f; border: 2px solid #3e315f; box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24), 0 17px 50px 0 rgba(0,0,0,0.19); } .eng { font-size: 12px; line-height: 12px; } .error { color: #d11313; } </style> <?php if (!$error) {?> <script type="text/javascript"> window.onload = function(){ window.htime = 60; check = function(){ if (window.htime <=0 ) { return true; } else { return false; } } window.htimer = window.setInterval(function(){ document.getElementById('button').innerHTML = ' ' + window.htime + ' .'; window.htime -= 1; if (window.htime <= 0) { window.clearInterval(window.htimer); document.getElementById('button').className = "internet"; document.getElementById('button').innerHTML = '  '; } }, 1000); } </script> <?php } ?> <div class="center"> <div class="logo"></div> <div class="header">     <br/>   . <font class="eng">Welcome to the open network of the Civic Chamber of the Russian Federation.</font></div> <?php if ($error) { echo '<div class="error">'.$error.'</div>';} else { ?> <div>        SMS  : <font class="code"><?php echo $code;?></font>  : <font class="num">+7 917 XXX-XX-XX.</font><br/><font class="eng">To access Internet, text this code <b><?php echo $code;?></b> to number <b>+7 917 XXX-XX-XX.</b></font></div> <div class="repeat">  SMS   : <br/><font class="eng">After you've sent SMS with code, please click this button:</font></div> <a target="_self" href="<?php echo $url;?>" id="button" class="internet-disabled" onclick="return check();"> </a> <div class="repeat">    SMS    . ,   .<br/><font class="eng">Please allow a minor delay in providing you access — delivery and processing of your SMS might take a few moments. Thank you for your patience.</font></div> <div class="sms"> SMS-     .<br/>Cost of SMS-messages is charged according to your tariff plan.</div> <div class="law">   №758  31  2014.  №801  12  2014 . -   WIFI     .<br/>We require our WiFi users to authenticate following the provisions of the Russian law, stated by enactments 758 of 31st July 2014 and 801 of 12th August 2014. </div> <?php } ?> </div> </body> </html> 

 nano /var/www/hotspot/connect.php 

 # mysql login params $mysql_host = ''; $mysql_db = ''; $mysql_login = ''; $mysql_password = ''; $sql_link = mysqli_connect($mysql_host, $mysql_login, $mysql_password, $mysql_db) or die(mysql_error()); function sql_query($sql, $unbuffered = false){ global $sql_link; $resource = $unbuffered ? mysqli_real_query($sql_link, $sql) : mysqli_query($sql_link, $sql); if (mysqli_errno($sql_link) === 1016) { if (preg_match("/'(\S*)\.MYD'\. \(errno\: 145\)/", mysqli_error($sql_link), $m)) { mysqli_unbuffered_query("REPAIR TABLE ".$m[1]); $resource = $unbuffered ? mysqli_unbuffered_query($sql_link, $sql) : mysqli_query($sql_link, $sql); } } return $resource; } function sql_getValue($sql, $unbuffered = false){ $resource = sql_query($sql, $unbuffered); $ret = false; if (is_resource($resource) || is_object($resource)) { $row = mysqli_fetch_row($resource); $ret = $row[0]; } return $ret; } function sql_getRows($sql, $use_key = false, $unbuffered = false){ $resource = sql_query($sql, $unbuffered); $ret = false; if (is_resource($resource) || is_object($resource)) { $row = true; while ($row) { $row = mysqli_fetch_array($resource, MYSQLI_ASSOC); if (!$row) continue; $_row = $row; if ($use_key) { if (isset($_row[$use_key])) { $link = &$ret[$_row[$use_key]]; $link = $_row; } } else { $link = &$ret[]; $link = (count($_row) == 1) ? array_shift($_row) : $_row; } } } return $ret; } function sql_getColumn($sql, $id_field = 'id', $unbuffered = false){ $resource = sql_query($sql, $unbuffered); $ret = false; if (is_resource($resource) || is_object($resource)) { $row = true; while ($row) { $row = mysqli_fetch_array($resource, MYSQLI_ASSOC); if (!$row) continue; $_row = $row; $id = $_row[$id_field]; unset($_row[$id_field]); $value = current($_row); $ret[$id] = $value; } } return $ret; } function sql_getRow($sql, $unbuffered = false){ $resource = sql_query($sql, $unbuffered); $ret = false; if (is_resource($resource) || is_object($resource)) { $ret = mysqli_fetch_assoc($resource); } return $ret; } 

さお、今床は、iptablesをphpからsudoersに制埡する暩限を远加したす

 nano /etc/sudoers smsd ALL=(ALL) NOPASSWD: /sbin/ipset smsd ALL=(ALL) NOPASSWD: /sbin/iptables www-data ALL=(ALL) NOPASSWD: /sbin/ipset www-data ALL=(ALL) NOPASSWD: /sbin/iptables smsd ALL=(ALL) NOPASSWD: /usr/sbin/conntrack www-data ALL=(ALL) NOPASSWD: /usr/sbin/conntrack 

それだけです このシステムは珟圚1か月皌働しおいたすが、飛行は正垞です。ご枅聎ありがずうございたした

Source: https://habr.com/ru/post/J307338/


All Articles