KITA Eng.

北海道でサーバー技術者として歩み出したひとが綴るblog。

数千件のIPアドレスを逆引きしまくるミッション用スクリプト完成!?

転職したての頃にこんな記事を書いていました。

kitaeng.hateblo.jp

この記事の中で、

本当はしたかったこと
実は逆引き対象のIPアドレスのリストには、かなりの数のダブりがあったりしたので、 重複している分は一回だけ、digして、すでにdigで結果を得ている部分は、 もう一度DNSに問い合わせをしないで、問い合わせ済みのデータを使う とかできたら、少しはネットワークリソースを使わずに済んだのな。 あと、処理も少しは早くなったろうに…
きっと条件分岐とかうまく使えばできるんだろうけど。 今後の課題です。

ということをぼやいていました。

ここ数日いろいろとシェルスクリプトを書き始めて、条件分岐とかループとかの扱いがなんとなく見えてきたので、3カ月ほど前の自分がしたかったことを実装してみました。

IPアドレスのリストを与えると、逆引きしまくってくれるスクリプト

一行ごとにIPアドレスが一つだけ列挙されている状態のファイルを引数として与えてあげることで、ひたすら逆引きをして、与えたIPアドレスFQDNのペアをカンマ区切りで出力してくれます。 一行に1一つのIPアドレスを想定して作りましたが、「for ~ in ~」で読み込んでいるので、スペース区切りやタブ区切りが混じっていても問題ないような気がします。

リダイレクトしてファイルに書き出せばcsvファイルとしてExcelとかで読み込めるはずです。

一度逆引きをしたIPアドレスFQDNについては、tmpファイルに記憶しておいて、そっちから引っ張ってくる(grep)ようにしています。ネットワークトラフィックをこれで減少させられるはずです。

これからしたいこと

IPアドレスの逆引きをするときって、メールログの解析のときとかだったりするので、その辺のログを読み込ませるだけでいいようになればよいなと。ついでにもうちょいいろいろ集計できたらなと。

IPアドレスの国別割り当ては公開リストがあるようなので、その辺の判別結果も出るようにしたり…。

いつ使うのやらですが、いつか使いそうなので、ちょこちょこバージョンあげましょう…。

/etc/resolv.conf についての取り扱いUbuntu12.04以降から

Ubuntuにおいては、12.04LTSから/etc/resolv.confのしくみが変わったようです。 確かに、12.04LTSのリリースノートにもさりげなく書かれています。

"PrecisePangolin/ReleaseNotes/UbuntuServer - Ubuntu Wiki"

Common Infrastructure
resolvconf is now used to manage /etc/resolv.conf on all Ubuntu systems. You can learn more here

resolvconfってのが/etc/resolv.confを管理するようになったそうです。詳しいことはリンク先を読めよっていうので、クリックしてみると...

リンク先の"DNS in Ubuntu 12.04 | Stéphane Graber's website"には、次のようにあります。

resolvconf is a set of script and hooks managing DNS resolution. The most notable difference for the user is that any change manually done to /etc/resolv.conf will be lost as it gets overwritten next time something triggers resolvconf. Instead, resolvconf uses DHCP client hooks, a Network Manager plugin and /etc/network/interfaces to generate a list of nameservers and domain to put in /etc/resolv.conf.

resolvconfっていうので、/etc/resolv.confは管理するようになったから、/etc/resolv.confに手動で変更を加えても、resolvconfが何らかによって動かされたときにすべて上書きされてしまうということだそうです。

詳しいことは、man resolvconfmanページに書かれているのですが、要点については、リンク先でも言及されていて、以下の通りです。

I use static IP configuration, where should I put my DNS configuration?
The DNS configuration for a static interface should go as “dns-nameservers”, “dns-search” and “dns-domain” entries added to the interface in /etc/network/interfaces
How can I override resolvconf’s configuration or append some entries to it?
Resolvconf has a /etc/resolvconf/resolv.conf.d/ directory that can contain “base”, “head”, “original” and “tail” files. All in resolv.conf format.
base: Used when no other data can be found
head: Used for the header of resolv.conf, can be used to ensure a DNS server is always the first one in the list
original: Just a backup of your resolv.conf at the time of resolvconf installation
tail: Any entry in tail is appended at the end of the resulting resolv.conf. In some cases, upgrading from a previous Ubuntu release, will make tail a symlink to original (when we think you manually modified resolv.conf in the past)
I really don’t want resolvconf, how can I disable it?
I certainly wouldn’t recommend disabling resolvconf but you can do it by making /etc/resolv.conf a regular file instead of a symlink.
Though please note that you may then be getting inconsistent /etc/resolv.conf when multiple software are fighting to change it.

巷では、baseに書いてあげればOKみたいなことが書かれているものもありますが、この説明を読む限り、/etc/resolvconf/resolv.conf.d/baseDNS解決について、他に参照すべきものがなかった時に使われるファイルのようです。baseに書いてsudo resolvconf -uしたけど駄目だったみたいなことが起こるのは、baseを読むまでもなく、他にDNS解決について参照すべきものがあったから読み込まれなかったということなのでしょう。自分の最初はbaseに書いても反映されないじゃん現象で悩みました。

headは、とにかくresolv.confの先頭に挿入されるものを記述するファイルのようです。/etc/resolv.confの先頭にあるコメントの部分もここから拾われているようです。

/etc/resolvconf/resolv.conf.d/head

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN

最初何も知らずにheadを見たときには、ここに書いたやつは更新されて消えてしまうんだって本気で思いましたが、そういうことではなかったようです。なんと紛らわしい...
どうしても上のほうに入れたいDNSサーバーとかがあれば/etc/resolvconf/resolv.conf.d/headに書けばよさそうです。

originalは途中からresolvconfがインストールされたのでなければ関係なさそう。resolvconfがインストールされたときにあった、/etc/resolv.confを保持するファイルっぽい。うちのUbuntu 14.04 LTSにはoriginのファイルはなかった。

tailは、とにかく/etc/resolv.confの最後尾につけられる部分とのことです。他のDNSの設定がうまくないときの最終奥義的なものでしょうか。一般的な環境ならGoogleのパブリックDNSとかのIPを入れといたらいんじゃないかと個人的には思ったりします。というか、先日のVPN Clientを起動させてVPNをつなぐと名前解決がうまくいかない問題は、これで解決しました。

/etc/resolv.confにかかわる設定ファイル群はまだあるようですが、今日はここまでです。

SoftEther VPN ClientをUbuntu 14.04LTSで使うときにちょっとはまったこと

ネットワークのお勉強がてらになるかどうかは怪しいですが、SoftEther VPNを使ってVPNの環境をつくってみました。

サーバーの方は、どこのポートを空けるだかとかっていう情報集めでの苦労はありましたが、公式ページの指示通りに進めばソースからコンパイルして起動まで、概ね問題なく進みました。

まぁ、SSLの証明書とか、iPhoneからなぜかつながらなかったりとか、ちょっと詰まったところもありましたが、その辺とかも含めてサーバー側の話はまた追々にします。

7.3 Linux へのインストールと初期設定 - SoftEther VPN プロジェクト

そんな事より1日半ばかり苦戦を強いられたのは、Virtual Boxで起動しているUbuntu 14.04LTSをクライアントとして、VPNに参加させるのが全然うまくいきませんでした。

いろいろ探して行き着いた先

11.1.27 LinuxVPN Client で仮想 LAN カード側をデフォルトゲートウェイに指定した場合に VPN 通信が切断される場合
Linux 版の VPN Client は、ルーティングテーブルの自動書き換え (調整) 機能に対応していません。したがって、Linux 版の VPN Client をリモートコンピュータ上の VPN Server に対して VPN 接続し、仮想 LAN カード (tap デバイス) 側のネットワークの先のルータをデフォルトゲートウェイとして使用した場合は、VPN Server に対する TCP/IP 通信も、そのデフォルトゲートウェイを通過しようとしてしまうため、事前に route コマンドで VPN Server に対するスタティックルートを追加しておく必要があります。これらの TCP/IP やルーティングに関する知識をお持ちの場合のみ、LinuxVPN Client を使用してください。
11.1 トラブルシューティング - SoftEther VPN プロジェクト

ということで、どうやらLinux版のクライアントは、ルーティングテーブルをうまいこと調整してくれないそうです。単純にデフォルトルートを足せばいいって話ではないようで、

  1. 既存のデフォルトルート経由でのVPNサーバーへのスタティックルートを確保
  2. 既存のデフォルトルートをVPN側のgwに設定
  3. VPN側のネットワークでも使用できるDNSサーバーを指定しておく

というのが必要なことのようです。

3.については、Ubuntu 14.04 LTSだと/etc/resolvconf/resolv.conf.d/tailというファイルを用意して、

nameserver 8.8.8.8
nameserver 8.8.4.4

みたいに、VPNのネットワーク上から利用できるDNSを設定してあげとけば良いようです。GoogleのパブリックDNSをしておけば、VPNにつながっていようが、つながっていまいが、使えるだろうので便利かなということで、この設定にしています。本当は、VPNの接続中かどうかで、動的にDNSを切り替えた方がいいんだろうか?

とちょっと疑問は残りますが、3については恒久的な対処法ができましたが、1.、2.については、SoftEther VPN ClientのLinux版では対応していないということなので、手動で毎度やるのか…、となりましたが、決まりきったことなので自動化できてばとググっていると、

softether vpn client for ubuntu /etc/init.d/vpnclient · GitHub

先人がいらっしゃいました。 他の起動スクリプトのソースとかも見ながらちょっと改造して作りましたのが、以下の自動起動スクリプトです。(どの環境でもOKというような動作保証はできませんのであしからず)

自動起動スクリプト

DAEMON="/usr/local/vpnclient/vpnclient"
VPNNAME="vpn_vpn2"
DEFROUTE="192.0.2.1"
NEWDEFROUTE="198.51.100.254"
SERVER="203.0.113.55"

については、各自の環境に合わせて変更していただければと思います。

  • DAEMON: VPN Clientのコマンドパス
  • VPNNAME: VPNで作られる仮想NICの名前(vpn_~という名前のはず)
  • DEFROUTE: VPN接続していないときに使っているネットワークのGWアドレス
  • NEWDEFROUTE: VPN上のネットワークのGWアドレス
  • SERVER: VPNサーバーのグローバルIPアドレス

/etc/init.d/においておけば、sudo service vpnclient startとかってすればVPN接続始まります。ちなみに、単純にvpnclientを起動して、ルーティングの設定を調整するだけなので、vpnclientが起動したときに自動的に接続されるVPNvpncmdとかで設定済みである必要があります。

なんだか、もうちょっと素敵になる気がするのですが、今の自分にはこんなところかな…。とりあえず自分の環境ではうまく動いてくれているので、これでしばらく使ってみます。(お気づきのことがあればコメントください!)

バッシュワンライナーを目指して--The road to Bash One-Liners!

魔法の呪文を唱えるのに少しずつ慣れてきた今日この頃。まさに幼児が言葉を覚えていくときのように少しずつ長い呪文を唱えられるようになってきました。


photo by Xtream_i

最近の個人的な流行は、

while true; do [定期実行したいコマンド]; sleep [実行間隔の秒数]; done

という、無限ループ構文。 終わりたければ、Ctrl + cで抜ければいいだけだからお手軽。

なかなか便利に使えたなと思ったのは、RAIDのリビルドの進捗状況の確認兼記録のとき。

while true; do date; tw_cli /c0 show; sleep 30; done

ってな具合に唱えてあげることで、日付とRAIDの状況の表示が出続けてくれました。ターミナルをどっか端っこに置いとけば終わったタイミングもわかるのでなかなかよかったです。

となってくると、目指すは、「ワンライナー」なんでしょう。と斉藤は勝手に思っています。

ワンライナー」って何ですかって最初は思いましたので、Google先生に聞いてみましたら、

ejje.weblio.jp

確かに、職場がピリピリしすぎると、無駄な緊張状態によって能力を発揮しきれなくなってしまうから、ウィットに富んだ一言でもかませれば、それは素晴らしい人だ!

ということではないのは、自明であって、

d.hatena.ne.jp

ってことなんだそうです。

ということで、わたくしの最初のワンライナーが本日産声を挙げましたのでご紹介。

netstat -nt | grep -e 'tcp ' | sed 's/[[:space:]]\{1,\}/:/g' | cut -d ':' -f 6 | sort | uniq -c | sort -r | head -n5

やりたかったこと

ただそれだけです。 不届き者がコネクションを作りまくって悪だくみしていないかの確認をするときとか、実際にコネクションが大量に発生していると、普通にnetstatで表示しても、どれが多いんだかよくわからない事態にしばしば陥っていたので、なんとかなったらいいなぁという切なる願いです。

$ netstat -tn
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0    352 203.0.113.244:22       198.51.100.10:61020     ESTABLISHED
tcp        0    352 203.0.113.244:22       198.51.100.11:61021     ESTABLISHED
tcp        0    352 203.0.113.244:22       198.51.100.12:61022     ESTABLISHED
tcp        0    352 203.0.113.244:22       198.51.100.13:61023     ESTABLISHED

なんかこんなのが出ますよね。 このぐらいの量なら、大したことないんですけど、大量にあると悲しくなってくるので…。

$ netstat -nt | grep -e 'tcp ' | sed 's/[[:space:]]\{1,\}/:/g' | cut -d ':' -f 6 | sort | uniq -c | sort -r | head -n5
  20 198.51.100.10
  12 198.51.100.15
  11 198.51.100.22
  10 198.51.100.101
   9 198.51.100.13

ってな具合で出力されます。IPアドレスの先頭には、重複数が出ているので、これとIPアドレスwhois情報をもとに悪そうなやつをブロックしてやりましょうという算段です。

なんか、もうちょっとスマートにならないかなと思います。アイディア募集です。ちなみに、簡易的な動作確認は、ubuntu14.04 LTSでのみの実施済みです。なんかsedの仕様が2つばかしあるようなので、正規表現がうまくどの環境でも効くか…。

"r-base-core.postinst: mktexlsr: not found"ってオコラレタ。

いつものごとくパッケージのアップデートをしようとしたら、以下のように怒られました。

Preparing to unpack .../r-base-core_3.2.3-3trusty0_amd64.deb ...
Unpacking r-base-core (3.2.3-3trusty0) over (3.2.3-1trusty0) ...
Preparing to unpack .../r-base_3.2.3-3trusty0_all.deb ...
Unpacking r-base (3.2.3-3trusty0) over (3.2.3-1trusty0) ...
Preparing to unpack .../r-recommended_3.2.3-3trusty0_all.deb ...
Unpacking r-recommended (3.2.3-3trusty0) over (3.2.3-1trusty0) ...
Preparing to unpack .../r-base-dev_3.2.3-3trusty0_all.deb ...
Unpacking r-base-dev (3.2.3-3trusty0) over (3.2.3-1trusty0) ...
Preparing to unpack .../r-doc-html_3.2.3-3trusty0_all.deb ...
Unpacking r-doc-html (3.2.3-3trusty0) over (3.2.3-1trusty0) ...
Preparing to unpack .../r-base-html_3.2.3-3trusty0_all.deb ...
Unpacking r-base-html (3.2.3-3trusty0) over (3.2.3-1trusty0) ...
Setting up r-base-core (3.2.3-3trusty0) ...
/var/lib/dpkg/info/r-base-core.postinst: 57:
/var/lib/dpkg/info/r-base-core.postinst: mktexlsr: not found
dpkg: error processing package r-base-core (--configure):
 subprocess installed post-installation script returned error exit status 127
dpkg: dependency problems prevent configuration of r-recommended:
 r-recommended depends on r-base-core (>= 3.2.3-3trusty0); however:
  Package r-base-core is not configured yet.

dpkg: error processing package r-recommended (--configure):
 dependency problems - leaving unconfigured
 dpkg: dependency problems prevent configuration of r-base:
 r-base depends on r-base-core (>= 3.2.3-3trusty0); however:
  Package r-base-core is not configured yet.
 r-base depends on r-recommended (= 3.2.3-3trusty0); however:
  Package r-recommended is not configured yet.

dpkg: error processing package r-base (--configure):
 dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of r-base-dev:
 r-base-dev depends on r-base-core (>= 3.2.3-3trusty0); however:
  Package r-base-core is not configured yet.

dpkg: error processing package r-base-dev (--configure):
 dependency problems - leaving unconfigured
Setting up r-doc-html (3.2.3-3trusty0) ...
dpkg: dependency problems prevent configuration of r-base-html:
 r-base-html depends on r-base-core; however:
  Package r-base-core is not configured yet.

dpkg: error processing package r-base-html (--configure):
 dependency problems - leaving unconfigured
Errors were encountered while processing:
 r-base-core
 r-recommended
 r-base
 r-base-dev
 r-base-html
E: Sub-process /usr/bin/dpkg returned an error code (1)
続きを読む