Masteries

技術的なことや仕事に関することを書いていきます.

EdgeRouter XでVPN接続した時にコマンドを実行する

EdgeRouter Xを使って自宅のネットワークにVPNで接続出来るようにすると, どうしても「自分以外がVPNを利用して, 不正に自宅ネットワークに入り込んでいないか?」という所が気になってきます.

いろいろと解決策はありますが, ここでは「VPN接続が行われた時に通知をする」ということで, 不正利用に気付きやすくする(自分がVPNに接続していない時にVPN接続の通知が行われる = 不正利用が行われた, と判断できる)仕組みを作ってみましょう.

そのためには, EdgeRouter XにVPN接続した際, 任意のコマンドを実行できるようにすればよさそうです. そのコマンドの中で, いい感じにメールを送信するなり, SlackやLINEなどのAPIを利用してメッセージを送信するなどすれば良いでしょう.

なお, 今回は以下のページなどを参考にして, L2TP/IPsecで構築したVPNを対象とします.

yabe.jp

方法

結論から言えば, /etc/ppp/ip-up.d/l2tpdというファイルを作って, そこにパーミッション755を与えれば, VPN接続する度にそのファイルを実行してくれます.

例えば, このファイルに,

#!/bin/sh

echo "connected!" >> /tmp/vpn.log

というコードを書いておけば, VPNに接続する度にこのファイルが実行され, /tmp/vpn.logconnected!という文字列が書き込まれる訳です.

逆に, /etc/ppp/ip-down.d/l2tpdを設置してあげれば, VPN接続を切断したタイミングでそのファイルが実行されるので, 切断の通知なども出来ます.

なお, これらのファイルは, rootユーザーでなければ書き込むことはできないので,

$ sudo su -

などでrootユーザーになってから設置/変更などする必要があります. 気をつけましょう.

EdgeRouter XでVPN接続した時にEdgeRouter Xのdnsmasqで名前解決する

tl;dr

community.ubnt.com


EdgeRouter Xは, 次のサイトで紹介されているようにVPN接続にも対応しています:

yabe.jp

自宅の外からVPN接続をした時, EdgeRouter Xで動いているdnsmasqを使った名前解決をしたいのであれば, 次のような設定をしなければなりません:

$ configure
# set service dns forwarding options "listen-address=xxx.xxx.xxx.xxx"
# commit
# save

なお, xxx.xxx.xxx.xxxについては, VPNで接続した時に見えるルーターのIPを指定してあげましょう.

スペシャルサンクス

EdgeRouter Xに, 自宅の外からpingする

今住んでいるマンションは無料でインターネット回線が提供されているのですが, 時間帯によっては余りにも遅くなる(夜23時頃になると, 下りが1Mbpsとかになる)ことがあり, 余りにも人権がなく限界を感じたので, 別に敷設されている有料のケーブルテレビによるインターネット回線(既に敷設されているので, 割引などが効いて初期費用無料/月額3000円くらいで使える)を契約しました.

そのオプションとして, 無料でグローバルIPを1つもらえたので, そろそろEdgeRouter Xを整備するか... となり, 最近EdgeRouter Xをいろいろ触っていたのでした.

自宅の外からpingする

...で, 結論から言えば, EdgeRouter Xは, デフォルトでは外から来る通信は全て弾いています. その為, 初期状態では自宅の外のネットワークからは, グローバルIP経由でEdgeRouter Xに対してpingすら打つことができません.

最初, 何をやってもEdgeRouter Xと疎通が出来ず, 「一体何が...?」と混乱しまくっていました(流石にpingくらいは通るでしょ, と思い込んでいました...).

自宅の外からのpingできるようにする

ブラウザでEdgeRouter Xの管理画面に行き, 「Firewall/NAT」から「Filewall Policies」を選び, 「WAN_LOCAL」の「Actions」から, 「Edit Ruleset」を選びます.

f:id:papix:20171021112009p:plain

すると, このような画面になります(このスクリーンショットは, 既にいろいろ設定した後のものです. 最初は, 「Allow established/related」と, 「Drop invalid state」のみ設定されています).

f:id:papix:20171021112734p:plain

「Add New Rules」を選び, 「Action」は「Accept」に, 「Protocol」は「Choose a protocol by name」から「icmp」を選びます.

f:id:papix:20171021112356p:plain

「Save」を押して保存し, この作られたルールをドラッグして, 最初からあった「Allow established/related」と「Drop invalid state」の間に移動して, 最後に「Save Rule Order」をクリックすればOK.

これでめでたく自宅の外からEdgeRouter Xに対してpingを打つことができます.

10月31日に「はてなエンジニアが贈るはじめてのMackerel」という発表をすることになりました

supporterzcolab.com

代表取締役の自宅が, 自宅から徒歩1分圏内にあることが最近発覚したサポーターズさんに, いろいろな縁があってお声がけ頂いて, 「はてなエンジニアが贈るはじめてのMackerel」というイベントをやることになりました. 10月31日です.

「参加者が増えねェ...!」と嘆いていたところ, なんとMackerelのブログでもご紹介頂きました. ブログの公開後, 参加者が(少なくとも)3人増えていて, 本当にありがたい気持ちでいっぱいでした.

mackerel.io

どんな話をするの?

前にMackerel Drink Up #6で話したような, はてなブログチームでのMackerel活用術なども織り交ぜながら, Mackerelの基礎から応用までを, さっくり紹介してみる... という内容を予定しています.

papix.hatenablog.com

Mackerelに興味がある方, 或いははてな社内でのMackerel活用術に興味がある方は, 是非参加してみてください. お待ちしています.

あと, あれですね. これから, 資料作りも, 頑張ります...*1

*1: 資料については, きっとMackerelチームが誇るCREの id:a-know さんや id:Soudai さんの熱いレビューが入ると思うので, 良いものが出来上がると信じています! 頑張ります!!!

Perlで雑なスクリプトを書く時の個人的な三種の神器

日常の中で複雑な作業をしたい時, Perlで雑なスクリプトを書いて実現することがあります. そういった時によく使うCPANモジュール達を紹介しようと思います.

Path::Tiny

metacpan.org

ファイルの読み書きはもちろん, ファイルやディレクトリの存在確認, ディレクトリからのファイルの走査, 一時的なファイル/ディレクトリを用意... などなど, ファイルやディレクトリ操作に関するあらゆることがこのモジュール1つで実現できて便利です.

Data::Printer (DDP)

metacpan.org

便利で見やすいData::Dumper. 雑なスクリプトを作る時は, とにかくData::Printerで途中結果を表示しながら試行錯誤しています.

papix.hatenablog.com

過去にこういう紹介記事を書いていました.

papix.hatenablog.com

或いはこういう活用事例も書いていましたね.

Capture::Tiny

metacpan.org

systemで適当なコマンドを実行して, その標準出力や標準出力を元にして更に処理をする... という時に便利なコマンドです.

use strict;
use warnings;

use Capture::Tiny qw/ capture /;

my ($stdout, $stderr) = capture {
    system('ls');
};

print $stdout;

こういう感じにしてあげれば, captureで囲った部分のコード(この場合, systemlsを実行している)の標準出力が$stdoutに, 標準エラー出力が$stderrに格納されます.

まとめ

何かしらの作業をまとめてスクリプトにするとき, だいたいシェルスクリプトで書こうとするものの, 途中で分岐が増えてきて「アバーッ!!!」となり, Perlで書き直す... という事が多いです. というわけで, 今回はそういう時によく使うモジュール達を紹介しました.

「自分はこれ使うことが多い」, 「これも便利!」といった情報, お待ちしております.