orz.conf

技術メモ✍

SoftEther VPNの不具合??

さてSoftEtherVPNの設定が終わりました。

あれ、なんだかパソコンが熱いな・・・・?
このパソコンではvpnsambaくらいしか動かしてないはずだけどな。
夏だからかな?

ちょっとプロセス使用率確認

$ top
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 2600 root       0 -20 1166588 170944   5220 S 119.1  8.8   5:34.77 vpnserver

信じられないCPUの使用率!
SoftEtherVPNってこんな使用率になるの???
しょうがないのでCPU使用率下げるよう小細工しましょう(後々この判断が間違いだったと気付きます)

以下はその小細工です。

CPU使用率を制限する為にcgroupを導入しました。
これを使うとCPUリソースやらメモリやらに制限をかけることができます。

$ apt-get -y install cgroup-bin

続いてcgroupのコンフィグを作成。
このファイルはうちの環境では存在しなかったので、新規作成しました。

$ vi /etc/cgconfig.conf

group limit {
    cpu {
        cpu.cfs_quota_us = 200000;
        cpu.cfs_period_us = 1000000;
    }
    cpuacct {
    }
}

1000000マイクロ秒(つまり1秒)あたり200000μ秒(0.2秒)単一のCPUにアクセス
出来るようになります。20%までこのプロセスにCPUを割いてくれるらしいです。

続いて何やらおまじない

$ cgconfigparser -l /etc/cgconfig.conf

これをやらないと

cgroup change of group failed

って出てきます。

そしてcgroupを使ってvpnserverを起動します。

$ cgexec -g cpu:limit /usr/local/vpnserver/vpnserver start

これで完了なんですが、そうです。
起動スクリプトも修正してやらないといけません。

最終的にこのような形になりました。

再起動後にスマホからVPNアクセス出来て、topも20%に収まりました。

とここでまた問題が発生しました。
スマホOpenVPN ConnectのConnection statsに表示される
Bytes inが異常に増えるという現象が発生しました。

みた感じ200kByte/sくらいのスピードでどんどん通信量が増えていきます。
あれこれ設定を見直しましたが、結局SoftEtherVPNのサーバのバージョンを変更すると状況が改善しました。
うちの環境ではBuild 9546でこの事象が発生しました。
以前試していたBuild 9529に戻して確認していますが今のところこの事象は発生していません。

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 6294 root       0 -20 1036472  21984   5032 S   0.7  1.1   0:50.98 vpnserver

クライアントがガンガンアクセスするような環境なら当然負荷は高いでしょうが、個人でたててるサーバだとこんなもんなでしょう。(core2duoでもね)

結局cgroupの設定なんて必要なかったですね・・・・
まあお勉強ということで。

Ubuntu 12.04 LTS (ubuntu15.04) にsoftether vpnをインストール(その7) 起動スクリプト

7.起動スクリプトと設定

数か月前にUbuntu 12.04 LTSにsoftether vpnをインストールという記事を
書きましたが、起動スクリプト回りを書いていなかったので書いてみます。
あの時はまだ12.04でしたが、15.04でもほぼ同じだと思います。

基本的にはsoftether.orgに書いてある通り進めます。
7.3.8 スタートアップスクリプトへの登録
https://ja.softether.org/4-docs/1-manual/7/7.3

ですが、今回はtapを使用しますので、起動スクリプトにそれを記載します。

8行目からがstart時の処理です。
11行目、12行目に処理を追加しました。
vpnserver起動後ちょっとsleepさせて、tapへネットワークの設定を行います。

この2行だけ追加すれば問題ないでしょう。
(必要であればrestartの部分にも同様に処理を追加してください。)

作成した/etc/init.d/vpnserverへ実行権限を付与します。

$ chmod 755 /etc/init.d/vpnserver

後はOS起動時にvpnserverを稼働させる設定をするだけです。

$ /sbin/chkconfig --add vpnserver 
/sbin/chkconfig: そのようなファイルやディレクトリはありません

あれれ、ubuntuにはchkconfigが無いんだっけ。
そこでsysv-rc-confを使用します。

$ apt-get install sysv-rc-conf
$ sysv-rc-conf vpnserver on
$ sysv-rc-conf --list vpnserver
vpnserver    2:on       3:on    4:on    5:on

動作確認の為に再起動してみましょう。
スマホなどからVPNサーバにアクセス出来れば大丈夫でしょう。

うちの環境だけだと思いますがちょっと問題が発生したので
その問題については別の記事に記載したいと思います。

toshtone.hatenablog.jp

PHPでActiveDirectory接続クラス

phpでActiveDirectoryに接続するクラスを書いてみます。

機能としては、認証処理とパスワード変更処理が出来るもの
とします。

プロパティ
・ActiveDirectoryのホスト(IPアドレス)
・ActiveDirectoryのAdministrator権限を持ったユーザ★
・ActiveDirectoryのAdministrator権限を持ったユーザのパスワード★
ドメイン
・ベースDistinguishName★

★つきのプロパティはパスワード変更をする際に必要となります。

色々と説明を省くために、クラス内で直接必要な変数の情報を記載しました。
コンフィグとして別ファイルから読み込むほうが一般的かと思います。適宜修正してください。

まずはコンストラクタ

function __construct(){
	$connInfo = array(
		'host'		  => 'ldaps://192.168.1.10',
		'admin_user'	=> 'admin',
		'admin_pass'	=> 'password',
		'domain_name'   => 'example.co.jp',
		'base_dn'	   => 'DC=example,DC=co,DC=jp'
	);

	$this->host = $connInfo['host'];
	$this->admin_user = $connInfo['admin_user'];
	$this->admin_pass = $connInfo['admin_pass'];
	$this->domain_name = $connInfo['domain_name'];
	$this->base_dn = $connInfo['base_dn'];

	if(!$this->ldapconn = ldap_connect($this->host)){
		file_put_contents( "/var/log/ldap_log.log", "ldap_connect failed" );
	}
}

必要なプロパティに値を入れます。
今回はhostにldapsを指定しています。
もし、bind認証しかしないのであればldapでも良いと思います。
ldapsを使うということはssl通信をするというわけで、証明書を入れる
必要があります。これについてはまた別の記事に記載します。

ldap_connectしActiveDirectoryサーバと接続します。

失敗するとFALSEが返ってきます。
もし失敗するようであれば、ActiveDirectoryのサーバと
通信できるか、サービスが起動しているか
このphpを動かしているサーバのネットワークに問題は
ないか等単純なところを疑いましょう。

file_put_contentsの行は適宜ログ出力クラス等に修正してください。

次にbind認証メソッドです。

function ad_bind($userName, $userPass){
	if($userPass === ""){
		return false;
	}

	$userId = $userName."@".$this->domain_name;

	ldap_set_option($this->ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
	if(ldap_bind($this->ldapconn, $userId, $userPass)){
		return true;
	}else{
		return false;
	}
}

パスワードを空としてbind認証を行うと、なぜかtrueが返ってくるので
コーディングで空かどうか判定しましょう。

ldap_set_optionでプロトコルバージョンを3とします。

ldap_bindでbind認証を行います。
認証出来ればtrue、そうでなければfalseととてもシンプルな戻り値です。


続いてパスワード変更メソッドです。

function ad_modify($userName, $userPass){
	$adminId = $this->admin_user."@".$this->domain_name;
	$userId = $userName."@".$this->domain_name;

	//DNを取得
	$filter = array("dn");
	$ls = ldap_search($this->ldapconn, $this->base_dn, "sAMAccountName=$userName", $filter);
	$userInfo = ldap_get_entries($this->ldapconn, $ls);

	$entry["unicodePwd"] = mb_convert_encoding("\"" . $userPass . "\"", "UTF-16LE");

	$rtn = ldap_mod_replace($this->ldapconn, $userInfo[0]['dn'], $entry);
	return $rtn;
}

以下が完成系です。

<?php
class Ad_Conn
{
	function __construct(){
		$connInfo = array(
			'host'		  => 'ldaps://192.168.1.10',
			'admin_user'	=> 'admin',
			'admin_pass'	=> 'password',
			'domain_name'   => 'example.co.jp',
			'base_dn'	   => 'DC=example,DC=co,DC=jp'
		);

		$this->host = $connInfo['host'];
		$this->admin_user = $connInfo['admin_user'];
		$this->admin_pass = $connInfo['admin_pass'];
		$this->domain_name = $connInfo['domain_name'];
		$this->base_dn = $connInfo['base_dn'];

		if(!$this->ldapconn = ldap_connect($this->host)){
			file_put_contents( "/var/log/ldap_log.log", "ldap_connect failed" );
		}
	}

	function __destruct() {
		ldap_close($this->ldapconn);
	}

	function ad_bind($userName, $userPass){
		if($userPass === ""){
			return false;
		}

		$userId = $userName."@".$this->domain_name;

		ldap_set_option($this->ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
		if(ldap_bind($this->ldapconn, $userId, $userPass)){
			return true;
		}else{
			return false;
		}
	}

	function ad_modify($userName, $userPass){
		$adminId = $this->admin_user."@".$this->domain_name;
		$userId = $userName."@".$this->domain_name;

		//DNを取得
		$filter = array("dn");
		$ls = ldap_search($this->ldapconn, $this->base_dn, "sAMAccountName=$userName", $filter);
		$userInfo = ldap_get_entries($this->ldapconn, $ls);

		$entry["unicodePwd"] = mb_convert_encoding("\"" . $userPass . "\"", "UTF-16LE");

		$rtn = ldap_mod_replace($this->ldapconn, $userInfo[0]['dn'], $entry);
		return $rtn;
	}
}
?>

Ubuntu 15.04 でGitHubの設定

GitHubのアカウント作成がまだのようなら作成します。
https://github.com/

下記の順番で設定します。
SSH KEYの作成
  ubuntu上で作成します。
SSH KEYの設置
  公開鍵をGitHub秘密鍵をローカルに設置します。
・ローカル(pushする側)の設定
  gitの設定を行います。

SSH KEYの作成

まずはssh keyを作成します。

今回はubuntussh keyを作成しました。
接続時にパスワードを問われたくなかったので空で設定しました。

$ ssh-keygen -t rsa -b 4096 -C "mailaddress@gmail.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):そのままenter
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):そのままenter
Enter same passphrase again:そのままenter
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX mailaddress@gmail.com
The key's randomart image is:
+---[RSA 4096]----+
|    ++==.        |
|   ..NYAN        |
|    +.*+         |
|   . A .C        |
|    * o S        |
|   o . . .       |
|                 |
|                 |
|                 |
+-----------------+

これで公開鍵を作成できました。

$ cat ~/.ssh/id_rsa.pub

ちなみにid_rsa秘密鍵になります。

このid_rsa.pubの中身をコピーしてGit Hubに追加します。

SSH KEYの設置

GitHubにサインインします。
右上のほうにあるsettingボタンをクリックします。
続いて左のほうにSSH keyがあるのでそれをクリック。
Add SSH Keyをクリックします。

Titleはなんでもいいです。私は"Personal Thinkpad"としました。
Keyに先ほどのid_rsa.pubの中身を張り付けて下さい。
GitHub側の設定はこれで終わりです。

ローカル(pushする側)の設定

さてubuntuに戻ります。
下記のようにsshgithub.comに接続します。
ユーザ名はgitとなっていて良いです。

ssh -T git@github.com
Hi XXXXXX! You've successfully authenticated, but GitHub does not provide shell access.

このようになれば設定に問題はありません。
うちではこのようなレスポンスが1秒くらいで返ってきました。

さてそれでは.gitが生成されているディレクトリに移動します。
もしgitの設定を終えていないようであれば、下記の記事を参照して
設定を行ってください。toshtone.hatenablog.jp

$ git remote add origin ssh://ユーザ名@github/home/ユーザ名/workspace/first_app

これでoriginにurlが設定できたようです。
万が一originに指定するurlを間違えてしまった場合は

$ git remote rm origin

としてoriginを一旦削除して正しいものを再度addしてください。

HTTPSで接続する場合は下記のようにoriginを設定してください。

$ git remote set-url origin https://ユーザー名:パスワード@github.com/ユーザー名/first_app.git

それではいよいよソースをpushします。

$ git push -u origin master

これでGitHubにソースが追加されました。

ブラウザからGitHubにアクセスして確認しましょう。
トップページのPopular repositoriesからアップロードした
プロジェクト名をクリックしてファイルを確認してください。

以上で設定は終わりです。

Ubuntu 15.04 のプロンプト表示が長い

Ubuntu15.04のプロンプト表示が長くてディレクトリの階層が深いところだと
こんな感じになる。

workUser@Server:/home/workUser/workspace/script#

カレントディレクトリさえ表示されていれば良いですよね。
まずUbuntu15.04のプロンプト表示を確認します。

$ echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$

なんだか分からないけどとても長いです。
このくらいにしようと思います。(centosがこうなっていました)

[workUser@Server script]#

bashrcにPS1へのexportを記載します。

$ sudo vi ~/.bashrc

最終行に追加したらよいでしょう

export PS1="[\u@\h \W]\$ "

wifiスポットで認証画面が出ない

マクドナルドや、スタバのwifiは便利ですよね。

ノートパソコンだけでなくスマホもキャリアの容量制限の呪縛から
逃れるべくwifiを使用するととても便利だと思います。
その際にIPは取得できるのに、ブラウザを開いても認証画面が出てこない
という経験をしたことはないでしょうか?


f:id:toshtone:20150606200317p:plain


原因の一つですが、
これはブラウザでhttpsのサイトを指定している場合に発生します。
httpsのサイトとセキュアな通信が行われる為に、横取りして認証画面
を出すということが出来ないのでしょう。

もし認証画面が出ないようなら、ブラウザで指定しているのがhttpsかどうか
確認してhttpsのサイトであればhttp://testとかサイト名はなんでも
いいのでhttpを指定してみてください。

これ意外とwifi接続時の注意事項として目立つ所に書かれてないんですよね。