AWSのITコストを削減 Simpline

選ばれ続けること

 

エンジニアブログ

ホーム - エンジニアブログ - 2015年4月

1 / 212

Windows7でVPN(PPTP)を接続する同時にインターネットへのアクセス

2015.04.28

Windows7VPN(PPTP)接続を確立するとインターネット接続が切れて、web閲覧やメールが使えなくなり、不便です。

原因はルーティングにある


まず、nszwさんの記事によってVyOSでPPTP接続環境を構築する。

PPTPを接続するとコマンドプロンプトに[ipconfig]コマンドで下記I情報Pを取りました。

WS000115

 

コマンドプロンプトに[route print]コマンドでルーティングがPPTPのネットワークインターフェイスに奪われることを明白しました。

つまり、外へのネットワーク通信はPPTP側のゲートウェーイを経由になりました。

WS000116

メトリクス値をいじったが不安定であることに変わりは無くて問題を解消出来なかった。

解決策


この問題を解決する為にまず下記手順でPPTPのルーティングを無効にする。

この手順に従ってPPTP接続を作成する。

②作成されたPPTPの接続に右クリックして、[プロパティ]をクリックする。

WS000117

③ネットワークタブを選択し、[インターネットプロトコルバージョン 4(TCP/IPv4)]を選択し、[プロパティ]をクリックして、[詳細設定]をクリックする。

WS000118

④[リモートネットワークでデフォルトゲートウェイを使う]を外して、[OK]をクリックする。

WS000120

⑤順番に各設定ウィンドウに[OK]をクリックして変更を有効にする。

これでVPNを接続してインターネットへ接続出来ましたが、リモートネットワークのゲートウェイを無効になった為リモートネットワークに入らなくなります。

コマンドプロンプトに[ipconfig]コマンドで下記I情報Pを取りました。

WS000115

 

管理員としてコマンドプロンプトを開いて下記コマンドで静的なルーティングを設定すれば一時的にリモートネットワークへアクセスできます。
route add 192.168.0.0(リモートネットワークの(CIDR) MASK 255.255.0.0 172.16.0.1

次回PPTPへ接続時のIPアドレス変わる可能性がありますので、毎回設定しなおしなければならないです。

一回で設定する為にVyOS側に下記コマンドでゲートウェイを作成する。
$ configure
# set system gateway-address 172.16.0.254
# commit
# save

で、Windows7側コマンドプロンプトに下記コマンドで固定ルーティングを追加する
route add -p 192.168.0.0(リモートネットワークの(CIDR) MASK 255.255.0.0 172.16.0.254

と、問題が解決できました。

AWS環境のVyOSでPPTP

2015.04.24

情報は各所に転がっていて事例も十分にありそう。vyattaは有償になったのですよね、だから、VyOSを使えばタダで使えるのですよね、というのは、下調べの段階。リモートアクセスVPNの機能をVPCに持たせる為にPPTPでVPNできる環境を作ろうかと思ったら、しょうもないバグに当たったので。

VyOSにPPTPできない


使ったAMIはMarketplaceにあるv1.1.0。手順は非常にわかりやすかったのが、サーバワークスさんのブログ。ここまで手順があるなら、簡単じゃないか、と後輩に検証を頼んだのですが、わかりません、できません、の一点張り。真面目にやれよ!と怒りつつ、自分でもやってみた。基本的には最低限の設定のみ。
configure
set vpn pptp remote-access authentication mode local
set vpn pptp remote-access authentication local-users username vpnuser password password
set vpn pptp remote-access client-ip-pool start 172.16.0.1
set vpn pptp remote-access client-ip-pool stop 172.16.0.100
commit
save

これだけやればひとまず接続だけはできそうなのに。確かにできない。ログを見ても何だかわからず、Wiresharkもtcpdumpも駆使したのだけど、原因特定に至らない。ネットワークのトラブルはこれだから嫌だ(だけど何故だかいつも巻き込まれる)。

VyattaならPPTPできる


切り分けの為にはお金も惜しまず検証してみようかと。有償版のVyattaを使って同じように設定してみる。同じ手順で何ともあっさりできた。バージョン差異なんかもあるだろうけど、裏で普通にpptpdが動いているだけのようなので、設定ファイルを比べてやろう。

options.pptpdが変


/etc/ppp/配下のファイルを比べてみたら、VyOSのoptions.pptpdが何だか変。
$ cat /etc/ppp/options.pptpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
### Vyatta PPTP VPN End ###

本来設定をすると書き込まれるはずの「~Begin ###」が書いていないし、中途半端な記載になっていることに気付く。この時点でほぼ半日を要した。

手動でoptions.pptpdを修正してみる


試しにバックアップして、Vyattaの設定に合わせてoptions.pptpdを書き換えて、pptpdサービスを再起動したら、上手く行った!なんだこれ。完全にバグじゃねえか。

バグ情報発見


ここに全部書いてありました。v1.1.1ではFixされているらしいけど、こんなの残ってるAMIを配布されても、ちょっと困るな。オープンソースってそんなものなのか?

まとめ(問題と回避策)


VyOSのpptpの設定をする場合、required authentication protocolの指定をしないと、設定ファイルが不完全な状態で生成されてしまう為、pptpdが正常に動作しない。required authentication protocolを明示的に指定すれば、設定ファイルに本来の形式で書き込まれる。ということで、下記を設定して解決。
set vpn pptp remote-access authentication require mschap-v2

 

解決はしたけど全然納得行かないです。他のバグ情報も全部読まないとダメなのですかね。

SSH経由での手作りな運用管理環境構築

2015.04.21

sshで鍵認証できるようにして、sudo権限もつけてもらえば大抵のことはできるだろうと思ったときに、もう少し配慮が必要だったというLinux管理の話。

初めてのsshでknown_hostsにホスト鍵を自動登録


台数が増えてくると、初期設定をいちいちするのが手間になるので、鍵認証できる接続アカウントだけ準備できれば、後は設定変更したくない。やり方はいろいろありそうだけど、結局SSHホスト鍵のknown_hostsへの保存だけ自動(サイレント)にしたいので、スクリプト直書きで対処した。~/.ssh/configに書いた方が良かったかなとも考えたけど、いちいち書いてあった方が運用担当に意識されるので良いかと思い。
ssh -o StrictHostKeyChecking=no bastion "uname -n"

ssh経由でsudoできない


NOPASSWD: ALLで設定してあるアカウントでssh経由でコマンドを発行してもsudoさせてもらえなかった。
ssh bastion "sudo uname -n"
sudo: sudo を実行するには tty がなければいけません。すみません

接続先のsudoers設定のrequirettyを書き換える方法もあるみたいだけど、今回はいちいち初期設定が要らないことが目標なので、sshクライアント側で対処。
ssh -t bastion "sudo uname -n"

cronからsshでsudoする


これで十分だろうと安心していたら、sshでsudoするスクリプトをcron経由で実行したら失敗した。いよいよ接続先の設定を変更することを覚悟しながら、sshのmanをよく読んでみると。
 -t Force pseudo-tty allocation. This can be used to execute
arbitrary screen-based programs on a remote machine, which
can be very useful, e.g., when implementing menu services.
Multiple -t options force tty allocation, even if ssh has
no local tty.

-tの複数指定でforce ttyできると書いてあるので、こんな感じで書いたコマンドをcronから実行したら上手く行ったのでした。
ssh -tt bastion "sudo uname -n"

 

無事にクライアント側だけの変更だけで済ませることができた。セキュリティ面を考えるともう少し色々なことを考えなければいけないと思うけど。

JMESPathでソートや部分一致も

2015.04.21

AWS CLIにはかなり強くなってきたという感じはするけど、json文字列の操作に慣れてきただけのような気もする。ほぼ覚書。

SnapshotsをStartTimeで逆順ソート


ひとまずNameタグで凌いできたけど、過去分のスナップショットを作成日時順に逆順ソート、なんてのをCLIから自動化したいなんて要件は他にもあると思うので。
aws ec2 describe-snapshots --owner-ids self \
--query 'reverse(sort_by(Snapshots,&StartTime))[].[SnapshotId,StartTime]'

terminatedステータスのインスタンスは除外


これも試行錯誤しているうちに上手く行ったので載せておく。
aws ec2 describe-instances \
--query 'Reservations[].Instances[?State.Name!=`terminated`].[InstanceId,State.Name]'

 Alarm名を部分一致で検索


はじめEC2を部分一致で検索したかったのだけど、上手く行かなかったので、まずはシンプルな構造のjsonで動作を確認。
KEYWORD=test
aws cloudwatch describe-alarms \
--query "MetricAlarms[?contains(AlarmName,\`${KEYWORD}\`)].[AlarmName]"

EC2のNameタグで部分一致


試行錯誤して辿り着いた方法がこちら。もちろんfiltersオプションの方が簡単なことはわかっているのだけど、filtersが使えないコマンドも多いので、理解して使えるようになることを目標にやってみた。でもやっぱりよくわからなかった。
KEYWORD=test
aws ec2 describe-instances \
--query "Reservations[].Instances[?contains(Tags[?Key==\`Name\`].Value|[0],\`${KEYWORD}\`)].[Tags[?Key==\`Name\`].Value][]"

おそらく階層が深いので、"|[0]"とか最後の"[]"なんかがいるのだと思うのだけど、理由はよく理解できていない。こちらを参考にさせていただきました。

未だに原因がわからないまま突然上手く行ったりするのは、ちょっとした書式ミスが原因と思われるのだけど、なかなか解決できないことも多い。やっぱりjqの方が使いやすいのかも。grepとかawkとかで文字列処理してしまいたくなる衝動を抑えつつ。

PowerShellからSSHしたい

2015.04.20

AWSの運用管理をWindows端末からしたいという要件は多いはず。PowerShellはまだ覚えなければいけないことが山積みだけど、対象にLinux混在も避け難い。色々検討した結果(実はそんなにしてないけど)、下記のモジュールを使ってSSHクライアントしてみることにした。今のところ問題なく動いている。

SSH from PowerShell using the SSH.NET library


他にも公開されているモジュールはあったのだけど、オープンソースで信頼性が高そうに見えたので、こちらを採用した。

PowerShellへのモジュール追加


まずはPowerShellのお勉強から。追加したいモジュールを配置するパスが決まっているらしい。
PS C:\> $env:PSModulePath
C:\Users\myuser\Documents\WindowsPowerShell\Modules;C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\;C:\P
rogram Files (x86)\AWS Tools\PowerShell\

ひとまずSSHクライアントを使いたいユーザにだけ適用できれば良いので、ユーザプロファイルの下にフォルダを掘ってファイルを配置することにした。

モジュールのダウンロード


モジュールも同ページ内のこちらから。PowerShell v2用とv3、v4用に分かれているようだ。PowerShellのバージョン確認は毎度忘れるので下記の覚えやすいもので確認(他にも方法はある模様)。
PS C:\> $Host.Version

Major Minor Build Revision
----- ----- ----- --------
4 0 -1 -1

今回はPowerShellのバージョンが4.0なので、.NET 4.0 / PowerShell v3- and v4-compatible.をダウンロードする。後で怒られるので、ダウンロードしたzipファイルは解凍前にプロパティからブロックの解除をしておく。

モジュールの配置


zipファイルを解凍して、下記のように$env:PSModulePathに書いてあったパスに配置する。フォルダすら無かったのでまずはPowerShellっぽくフォルダを作成して。
PS C:\> New-Item $env:USERPROFILE\Documents\WindowsPowerShell\Modules -ItemType directory

ディレクトリ: C:\Users\myuser\Documents\WindowsPowerShell

Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2015/04/20 21:15 Modules

配置した結果が以下。
PS C:\> Get-ChildItem -Recurse $env:USERPROFILE\Documents\WindowsPowerShell\Modules

ディレクトリ: C:\Users\myuser\Documents\WindowsPowerShell\Modules

Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2015/04/20 21:18 SSH-Sessions

ディレクトリ: C:\Users\myuser\Documents\WindowsPowerShell\Modules\SSH-Sessions

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2015/04/20 21:18 439808 Renci.SshNet.dll
-a--- 2015/04/20 21:18 5042 SSH-Sessions.psd1
-a--- 2015/04/20 21:18 35486 SSH-Sessions.psm1

モジュールのインポート


これでインポートの準備が整ったはずなので。インポートしてみる。
PS C:\> Get-Module -ListAvailable

ディレクトリ: C:\Users\myuser\Documents\WindowsPowerShell\Modules

ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Script 1.0.0.4 SSH-Sessions {ConvertFrom-SecureToPlain, New-SshSession, Invoke-SshCommand, Enter-SshSession...}
:::
PS C:\> Import-Module SSH-Sessions
PS C:\> Get-Module

ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Manifest 3.1.0.0 Microsoft.PowerShell.Management {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Content...}
Manifest 3.1.0.0 Microsoft.PowerShell.Utility {Add-Member, Add-Type, Clear-Variable, Compare-Object...}
Script 1.0.0.4 SSH-Sessions {ConvertFrom-SecureToPlain, Enter-SshSession, Get-SshSession, Invoke-SshCommand...}

無事インポートされた。もちろん実際にはそんなにスムーズに進んだわけではない。

SSH接続


こんなコマンドが使えるらしい。PSsessionと似た感じで使えるようだ。
PS C:\> Get-Command | Select-String "ssh"

Enter-SshSession
Get-SshSession
Invoke-SshCommand
New-SshSession
Remove-SshSession

Enter-SshSessionだと鍵認証が使えなかったので、New-SshSessionを使う。
PS C:\> New-SshSession -ComputerName bastion -Username ec2-user -KeyFile C:\Users\myuser\keys\ssh_key.pem -Port 22222
Key file specified. Will override password. Trying to read key file...
Successfully connected to bastion

PS C:\> Get-SshSession

ComputerName Connected
------------ ---------
bastion True

どうやら上手く行った。

SshSessionからコマンド実行


それではコマンド実行してみる。
PS C:\> Invoke-SshCommand -ComputerName bastion -Command "uname -n"
bastion: ip-172-16-0-208
ip-172-16-0-208

なかなか良さそう、と思いきや。実行したいスクリプトの実行に失敗した。何かと思ったら。
PS C:\> Invoke-SshCommand -ComputerName bastion -Command "echo `$PATH"
bastion: /usr/local/bin:/bin:/usr/bin:/opt/aws/bin:/home/ec2-user/.rvm/bin
/usr/local/bin:/bin:/usr/bin:/opt/aws/bin:/home/ec2-user/.rvm/bin

どうもユーザ環境設定ファイルが読み込まれていないということに気付いた。そういうことか。
PS C:\> Invoke-SshCommand -ComputerName bastion -Command "source .profile;echo `$PATH"
bastion: /usr/local/bin:/bin:/usr/bin:/opt/aws/bin:/home/ec2-user/.rvm/bin:/home/ec2-user/.rvm/bin
/usr/local/bin:/bin:/usr/bin:/opt/aws/bin:/home/ec2-user/.rvm/bin:/home/ec2-user/.rvm/bin

正しい回避方法かはわからないけど、ひとまず手動で.profileを読み込むことで問題解決した。

PowerShellの勉強そのものがまだまだ足りないけど、これでWindows、Linux問わず、一元管理できそうだ。
1 / 212