2016年1月27日水曜日

Capitalism Lab日本語化作業シートを公開しました

ええと、googleドライブで共有しないという前言を撤回します。

管理するパスワード数が増えるのが嫌でこれまでずっと逃げてきたのですが、以前もこのブログでファイルやら公開できたら便利だなと思うことがあったので、結局公開専用アカウントを作成することにしました・・・。

最初からやればいいのにとお叱りを受けそうです。
大変申し訳ございません。

シートはだれでも編集可能な状態で公開いたします。ログインする必要はありません。

現状では次のファイルを作業シート化してあります。
ファイル名に貼ってあるリンク先はシートから変換したテキストです。
上記ファイルもすべて編集可能な状態に設定しています。
変換は自動ではないので、ご自身で利用するために変換した際に、ついでに更新していただければ誰かの役に立つかもしれません。
現時点での和訳状況は、
  • t_game.txt
    そこそこ
  • Translate.txt
    追記漏れ多数
  • help.txtおよびgm_help.txt
    機械翻訳のみ
となっています。

なお、チュートリアルやシナリオなどは原本のファイルを直接変更しないと日本語化出来ないので現状では対象外としています。


問題は、この零細blogが検索に引っかかってくれるかどうか。
ともあれ、一つよろしくお願いします。

Capitalism Lab 日本語化(和訳)ファイル一式(現状ほぼ機械翻訳)

** 2016/1/29 追記 **
こちらでご紹介した翻訳済みファイルは相当不完全です。
現在ではここでご紹介したものより格段に完成度が上がっておりますので、こちらはもう使わないことをお勧めいたします。
完成品だけお求めになられてしまうことはやむを得ませんが、もっといい訳がありますので、ぜひ最新のものをお使いいただければ幸いです。
あまりにこの記事ばかり閲覧数が上がるので不安になりましたので、以上追記いたします。
** 追記ここまで **

あー。

本当に人気のないゲームで誰も和訳をしようとしないのに、Capitalism Lab 日本語化 のキーワードでこのblogを引っ掛けてしまうお方がごく稀においでのようなので、罪悪感を感じてしまいました。

そこで、ほぼすべて機械翻訳で大変恐縮ではありますが、翻訳済みファイルをご提供いたします。
こちらからダウンロードください。(2016/2/1削除)

なお、これでも英語がどっさり残ります
これは本体側の不備で、エンライトさんが定義した方式で翻訳しても本体のプログラムがそもそも翻訳済みテキストを見てやしねえ、いや丁寧に言うと反映してくれやがらないのであります。

それでも、Translate.txtという、ユーザ側で勝手に作る翻訳ファイルのほうはまだ見てくれることがありまして、訳されなかった英文をTranslate.txtに追記し、さらにその和訳を追記すれば和文として表示される場合があります。

和訳されずに残っている英文を見かけたらすかさずその文章をメモして、Translate.txtに追記し、和訳を考える。そういう作業が必要になります。
いまどきこんなのってあるかぁ?ってレベルですが、まあ、そういうもんだと思ってあきらめましょう。
当然、私もそんな手間はかけていないので、頓珍漢な邦訳をお楽しみいただけます。

ダウンロードしたファイルはtarで固めてbzip2で圧縮してあります。
解凍したファイルはいずれもtranslateディレクトリに放り込んでください。
translateディレクトリがないとかそういう質問はコメント欄に入れないようにしてくださいね
直接エンライトのユーザサポートに連絡してください。またはこちらをご覧ください。

なお、圧縮ファイル中に"Capitalism Lab 和訳作業シート.xlsx"というファイルがあります。
これが今回の翻訳テキスト作成の元ネタで、どれが機械翻訳でどれが人間翻訳かを確かめる際にご利用ください。くどいようですが、今回追加したほぼすべてが機械翻訳です。私自身が気にしてない文章は全部放置です。
拡張子がxlsxとなっておりますが、excelで作成したものではなく、googleスプレッドシートからexportしたものです。要するにgoogleスプレッドシートでの利用を前提としているっちゅうことです。

シートの内容から翻訳結果をゲームプログラムが解釈できるファイル形式に変換するスクリプトも作成してありますし、シートにはそのスクリプトへのリンクも記述されているので、ご自分のお好みで訳を適宜修正・追加・削除なされました際はそちらをご利用ください。

私のgoogleドライブ内にある元ネタファイルを公開すれば簡単ですが、そこまでご奉仕するつもりはない。ドメイン名やら本名やらメールアドレスやらハズカシイ
なお、デフォルトで付属してくるフォントは中国語用なのは以前触れた通りで、日本語フォントに変更する方法も以前触れたとおりですのでそちらをご参照ください。
なお(なおばっかりだね)ご参照頂いた記事からのフォントファイルへのリンクだと404になっていました。
どうぞこちらからダウンロードください。

これでCapitalism Labのユーザが少しでも増えてくれればうれしいです。

2016年1月24日日曜日

Capitalism Labをやってみた その4

最近ご無沙汰していましたが、久しぶりに起動してみました。
Windows10で起動したのは初めて。
問題なくWindows10でも動作しております。

起動してみると、バージョン2.6系列とは互換性がないけどアップデート山盛りな2.7系列がリリースされていました。
2.7.22以前のバージョンをお持ちの方は、以前のバージョンをアンインストールしたうえで再度インストールする必要があります。

こうやって頻繁な更新があるととても心強いですね!!
しかも、DLCのOpen Betaが始まっているではありませんか。
子会社のDLCらしいのですが、まずは2.7.24をチェック。

ななめ読みした限りだと、以下が目玉みたいです。

・チャレンジゲームが更新されました。
 →中国の台頭とかを扱ってるみたいです。

・シナリオが4つ追加されました。

・COOのポリシーに輸送コストを重視する・しないを設定できるようになりました。

・会社に自動で詳細説明がつくようになりました。
 →実際のところは会社番号がついてるだけなんですけど、これは地味に便利でした。

・ライバルAI企業が10増えて最大40まで設定できます。

・肖像画(プレイヤーやライバル企業の社長とかの顔ね)が増えました。
 →これまでと統一感がないところがちょっと面白い。

・農業と製造マネージャガイドが改良されました
 →そもそも読んでなかったから改良点が把握できませんでした。。。

・原材料が切れた時などに再割り当てするのが簡単になりました!
 →こいつは便利ですよ!変な水引のような紐みたいなボタンです。

・倉庫の画像が更新されました。
 →こいつぁいかにも倉庫っていう倉庫でok.

その他、ホットキー一覧のホームページに飛ぶボタンを設けたとかMODがらみでいろいろ変更が加わっているようです。
あとCtrl+SでセーブできるようになったとかAutoSaveができるようになったとか、かなり地味ではあるが便利になっちゃってます。

一つだけ気に入らないのは、2.7系列のインストーラではインストール先を指定できず、%appdata%\..\local\Capitalism Lab\を強制されてしまうこと。
Cドライブにゲームなんか入れたくないんだが。。。

ともあれ、なんだかDLCだのなんだので盛り上がっちゃってるようですので、かなり古くて申し訳ないんですが、昔ちょっぴりこちらでCapitalism Labのお話をした際に日本語化する方法について記述したときの和訳ファイルに若干修正したものを以下に掲載します。

どなたかgoogle driveでもなんでもいいんですが、捨てアカウントをお持ちの方は作業所を開設していただけませんでしょうか。。。

下記を%appdata%\..\local\Capitalism Lab\translate\translate.txt として保存して(translateディレクトリがない場合は手動で作成してください)起動すると、こんな感じに*ごく一部だけ*和訳されます。



なお、使用するフォントがデフォルトのままだと化けると思います。
フォントの変更などの詳細は過去の記事を参照してください。

--- ここから ---
Stock Price Graph|
株価グラフ|
~
Cash|
資金|
~
Annual Profit|
年間純益|
~
Annual Revenue|
年間収益|
~
Operation Profit|
業務利益|
~
Financial Overview|
財務概要|
~
Stock Overview|
株式概要|
~
CORPORATE COLOR|
企業 カラー
~
CORPORATE LOGO|
企業 ロゴ|
~
YOUR PORTRAIT|
自 画像|
~
NEW SINGLE-PLAYER GAME|
NEW SINGLE-PLAYER GAME|
~
Start|
開始|
~
Back|
戻る|
~
Goal Values|
目標|
~
No. of Years|
年数|
~
Goal Score Bonus|
目標スコア ボーナス|
~
Player's Wealth ($million)|
プレイヤーの資産 (百万ドル)|
~
Goals of the Player's Own Corporation ($million)|
プレイヤー企業の目標 (百万ドル)|
~
Annual Revenue|
年間収益|
~
Net Worth|
純資産|
~
Annual Operating Profit|
年間業務利益|
~
Market Cap|
市場価格|
~
Goals of Companies Controlled by the Player ($million)|
プレイヤーが所有する会社の目標 (百万ドル)|
~
Annual Revenue|
年間収益|
~
Net Worth|
純資産|
~
Annual Operating Profit|
年間業務利益|
~
Market Cap|
市場価格|
~
No. of Controlled Companies|
所有会社数|
~
Goals of the Player's Own Corporation|
プレイヤー企業の目標|
~
Total No. of Employees|
総従業員数|
~
Operating Profit Margin|
業務利益マージン|
~
Return on Equity|
資本還元率|
~
Stock Price|
株価|
~
Ownership|
所有権|
~
No. of Product Classes Being Produced|
生産されている製品クラスの数|
~
No. of Product Types Being Produced|
生産されている製品タイプの数|
~
Goal Industries - Goals of Industry Dominance|
目標の産業 - 市場占有を目指す産業|
~
Excluded Industries|
除外する産業|
~
Included Industries|
含める産業|
~
Goal Products - Goals of Product Market Dominance|
目標の製品 - 市場占有を目指す製品|
~
Excluded products|
除外する製品|
~
Included products|
含める製品|
~
Add|
追加|
~
Add All|
すべて追加|
~
Remove|
削除|
~
Remove All|
すべて削除|
~
 million|
100万|
~
 billion|
 10億|
~
Finance Department|
財務部門|
~
Human Resources Department|
人事部門|
~
Public Relations Department|
広報部門|
~
Investor Relations Department|
投資家部門|
~
Chief Executive Officer's Office|
最高責任者 CEO|
~
Chief Operating Officer's Office|
最高執行責任者 COO|
~
Chief Marketing Officer's Office|
最高マーケティング責任者|
~
Chief Technical Officer's Office|
最高技術責任者|
~
NONE|
なし|
~
OPTIONS (O)|
オプション (O)|
~
SAVE GAME (S)|
セーブ (S)|
~
LOAD GAME (L)|
ロード (L)|
~
RESTART GAME|
ゲームをリスタート|
~
RETIRE|
リタイア|
~
GAME SETTINGS (F9)|
ゲーム設定 (F9)|
~
QUIT TO MAIN MENU|
メインメニューに戻る|
~
QUIT TO WINDOWS|
ゲームを終了する|
~
CONTINUE GAME|
ゲームを続ける|
~
HOTKEY LIST (K)|
ホットキー一覧 (K)|
~
Revenue Graph|
収益グラフ|
~
Qty Sold Graph|
販売数量グラフ|
~
Please select your name from this list|
このリストから自分の名前を選択してください|
~
Business Relations|
業務取引|
~
Firm Overview|
企業概要|
~
YTD Trade|
年頭からの取引|
~
Last Year Trade|
過去一年間の取引|
~
Lifetime Trade|
現在までの取引|
~
P/E Ratio|
株価収益率|
~
Corporations|
企業概要レポート|
~
Corporate Details|
企業詳細レポート|
~
Product Details|
製品詳細レポート|
~
Persons|
人事レポート|
~

Financials|
財務レポート|
~
Goal|
目標|
~
Score|
スコア|
~
Billionaires 100|
総資本ランキング|
~
Manufacturer's Guide|
製造ガイド|
~
MANUFACTURER'S GUIDE|
製造ガイド|
~
Farmer's Guide|
農業ガイド|
~
Cities|
都市|
~
Manager's Guide|
マネージャガイド|
~
Inventory|
在庫|
~
Business Assets|
ビジネス資産|
~
Land and Natural Resources|
土地と資源|
~
Financial Actions|
財務|
~
Stock Exchange|
証券取引|
~
Stock|
株式|
~
Stocks|
株式|
~
Intangible Asset: Technology|
無形資産:技術|
~
TOTAL|
合計|
~
Bank Loans|
銀行ローン|
~
ASSETS|
資産|
~
LIABILITIES|
負債|
~
YTD Changes|
過去一年間の変動|
~
Last Year Changes|
去年の変動|
~
SHAREHOLDER EQUITY|
資本|
~
Common Stock|
普通株|
~
Total Earnings|
留保利益|
~
Total Dividend Paid|
配当|
~
Description|
説明|
~
Last Month|
先月|
~
Last Year|
過去一年間|
~
Year-to-date(YTD)|
年頭から|
~
Year-to-date|
年頭から|
~
Lifetime|
現在まで|
~
OPERATING REVENUE|
業務収益|
~
Cost of Sales|
販売費|
~
Salaries Expense|
人件費|
~
Operating Overhead|
業務オーバーヘッド|
~
Advertising & PR Expense|
広告宣伝費|
~
Training|
研修費|
~
R&D Expense|
研究費|
~
Donation to Public Facilities|
公共施設への寄付|
~
Write-offs|
償却|
~
OPERATING EXPENSES|
業務支出|
~
OPERATING PROFIT|
業務利益|
~
Stock Return|
株式投資還元額|
~
Received Dividends|
配当|
~
Increase in Asset Value|
資産価値の増加|
~
Loan Interest|
ローン金利|
~
OTHER PROFIT|
その他の利益|
~
NET PROFIT|
純益|
~
Corporate Balance Sheet|
企業のバランスシート|
~
Corporate Income Statement|
企業の損益計算書|
~
Balance Sheet|
バランスシート|
~
Income Statement|
損益計算書|
~
Technology|
技術|
~
Advertising|
宣伝|
~
Brand|
ブランド|
~
Dominance|
市場占有率|
~
Rankings|
ランキング|
~
History|
履歴|
~
Overview|
概要|
~
Firms|
会社|
~
Products|
製品|
~
Graphs 1|
グラフ 1|
~
Graphs 2|
グラフ 2|
~
Shareholders|
株主|
~
Owned Stocks|
保有株式|
~
Shareholder              Owned Qty    Owned%   Stock Value   Position|
株主                     所有数       所有率   株式総額      役職|
~
Owned Qty|
所有数|
~
Owned%|
所有率|
~
Owned %|
所有率|
~
Stock Value|
株式総額|
~
Position|
役職|
~
Corporation|
企業|
~
Price|
価格|
~
Subsidiary|
子会社|
~
Market Capitalization|
市場価格|
~
Annual Net Profit|
年間純益|
~
Total Assets|
総資産|
~
Total Loans|
ローン総額|
~
Stock Asset|
株式資産
~
Value|
価値|
~
Rank|
順位|
~
Leader|
大手|
~
No. of Years of Operation|
経営年数|
~
No. of Employees|
従業員数|
~
No. of Product Classes|
製品クラス数|
~
No. of Product Types|
製品タイプ数|
~
Financial Figures|
財務統計|
~
Operating Figures|
営業統計|
~
Performance Indices|
業績評価指標|
~
Return on Total Assets|
総資産還元率|
~
Dividend Yield|
配当利回り|
~
Stock Return to Investors|
投資家への株式投資還元率|
~
Net Profit Margin|
純益マージン|
~
Inventory Turnover|
在庫回転率|
~
Assets Turnover|
資産回転率|
~
Equity-to-Assets Ratio|
資本/資産率|
~
Shareholder|
株主|
~
Total Shares|
株式総数
~
Earnings Per Share|
一株当たりの収益|
~
Equity Per Share|
一株当たりの資本|
~
P/B Ratio|
株価収益率|
~
Annual Return|
年あたりの還元率|
~
Lifetime Return|
総合還元率|
~
Public Shareholders|
一般株主|
~
Player|
プレイヤー|
~
Tech|
技術|
~
Real Estate|
不動産|
~
Media|
報道媒体|
~
Investment|
投資|
~
CORPORATIONS|
企業概要レポート|

~
YOUR FINANCIAL REPORT|
財務レポート|
~
SCORE REPORT|
スコアレポート|
~
Personal Wealth|
個人資産|
~
Points|
ポイント|
~
Value of Companies Controlled by You|
プレイヤーが所有する会社の価値|
~
Dominated Industries|
優位を占める産業|
~
Dominated Products|
優位を占める製品|
~
inflation adjustment|
インフレ補正|
~
Profit|
利益|
~
100 Billionaires|
百人の富豪|
~
Local Billionaires|
地元の富豪|
~
Quality|
品質|
~
Product Class:|
製品クラス:|
~
Necessity Index:|
生活必需性:|
~
City Total|
都市での合計|
~
One Product|
1つの製品|
~
Production|
生産|
~
Retail|
小売販売|
~
Overall|
全体|
~
Producer|
生産者|
~
Retailer|
小売業者|
~
Product Quality|
製品の品質|
~
Production Quality|
生産の品質|
~
Raw Material Quality|
原材料の品質|
~
Owned Tech.|
生産技術|
~
Top Tech.|
トップの技術|
~
Brand Strategy|
ブランド戦略|
~
Unique Brand|
特定ブランド|
~
Brand Rating|
ブランド評価|
~
Brand Awareness|
ブランド知名度|
~
Brand Loyalty|
ブランド人気|
~
Advertising Expense|
宣伝費|
~
Revenue|
収益|
~
Quantity Sold|
販売数量|
~
Past 36 months|
過去36ヶ月|
~
30 Years|
過去30年|
~
Graph|
グラフ|
~
Previous|
前へ|
~
Next|
次へ|
~
Go|
表示|
~
Search Product (Tab)|
製品の検索 (Tab)|
~
Local|
地域|
~
Average|
平均|
~
Concern|
重要度|
~
Cost|
総費用|
~
New Price|
新価格|
~
Freight|
輸送|
~
Overall Rating|
総合評価|
~
City Overall|
都市の総合評価|
~
View Supplier|
供給者|
~
Confirm|
決定|
~
Market Share|
市場シェア|
~
Training|
研修|
~
Sales|
販売|
~
Purchase|
購入|
~
Advertise|
広告|
~
Mft|
製造|
~
Supply|
供給|
~
Demand|
需要|
~
Unit Level|
レベル|
~
---ここまで---

2016年1月10日日曜日

squirrelmailからrainloopへ乗り換えてみた

前置きです。

CentOS5ではimapクライアント用にsquirrelmailを利用させていただいてました。
かなり高機能で日本語対応も割合しっかりしていたし、カレンダープラグインもついていたので簡易グループウェア的な使い方も出来たので、かなり改造しまくって便利に利用させていただいていました。

しかし、悲しいかなphp4用なのでCentOS7では改修するかphp4をインストールしないと使えません。
ですが、php4を入れるのはまっぴらごめんですし、php5向けのバージョンもリリースされてはいるのですが、これがまたなんとしたことか、日本語のメールの文字化けがひどい。

これを改修して、さらに以前のsquirrelmailの改造を反映させるとなると、ちょっと導入をためらいます。

それに、実際には東日本大震災の時の計画停電のため、まともにMXレコードの宛先としては運用できなくなってしまい、それ以来MXだけは宛先をgoogleに委託してしまったので、グループウェアとしての機能も不要になっていました。

加えて、euc-jpであるというのもネックです。
utf8にしておけば今後どんなヘボいブラウザが主流になったとしても切り捨てられることはまずありませんでしょうが、日本国内ではインターネット上で日本語といえばこれだ!!っていう位置を占めていたはずのISO規格のISO-2022-JP(要するにJISコード)も過去にIEにばっさり切り捨てられた実績があります。
したがって、ISO-2022-JP以上にマイナーな文字コードは避けたい。

現在は取引結果などの残しておきたい古いメールやroot宛てのメールなどが確認できればいいので、これを機に長年お世話になったsquirrelmailさんから卒業させていただき、新しいWebメールシステムを探すことにしました(いつgoogleさんがGoogle Appsを放り出すかわかりませんから)。

すると、同じくphpのRainLoopというWebメールシステムを知りました。

スバラシイ。実にスバラシイ。

zipファイルをダウンロードして、展開して、展開したディレクトリをapacheなどで公開するだけでインストール終了。
設定は、初期管理者id/パスワードがadmin/12345と定義されていて、これを用いてブラウザ上から設定するので、管理者idとパスワードを変更するまではHTTPサーバの起動前にallow先をlocalhostに限定するなどしたほうがいいと思います。

そのうえ動作も軽快、デザインもきれい。日本語も化けない・・・規格内のメールなら(*今日の本題。後述します)。

面白いのは、オンラインデモが用意されていて、どういうものなのかインストールせずに実際に触って試せるところ。
あと、FacebookとGoogleとTwitterとDropboxと統合できるんですけど、ソーシャルとか大嫌いだからやらない。やらないけど、興味がある人のほうが多いはずだからこれも一大特徴といっていいと思います。

大いに気に入ったので採用です。
コミュニティエディションはAGPLv3ですが、別ライセンスも用意されていて、商用利用にも配慮されているようです。

さて本題です。

先ほど日本語も化けないと書きましたが、これはウソではありません。

が、あくまで規格に則ったメールが化けません。
これは規格に則った正しい動作です。文句のつけようがありません。

しかし、日本って割と古い時代からインターネットが普及した国の一つ、かつ、漢字というアルファベットじゃ表せない文字を初期から持ち込んだりしたので、混迷状態にありました。
EBCDIC系のCCSIDとかJUNETコード(のちのISO-2022-JPとかJISとか呼ばれるコードの元祖)とかEUC-JPとかSJISとか経路上で最上位ビットが落ちるとか落ちないとか。
技術者の工夫の歴史でもありますが、まあ、今となっては迷走と言われてもしゃあないかなあ。

折角規格ができても誰も実装しないとかザラで、挙句に自分の使っているOSの文字コードで直接メールを送受信してしまうという快挙暴挙にでるメールクライアントがごく普通に使われちゃったりしちゃったりして(最近でもまだ見かけます。問答無用でUTF8とかね)。

で、当時はインターネットといえばJISコードを使え、ということになっていて、そいつを直接MIMEエンコードせずにSubjectやFrom,To欄に使ったりしてるメールが多かったりします。
MIMEが普及し始めたのって記憶では90年代くらいで(なぜかってーとその頃その手のプログラムの改修を受注して書いた覚えがあるから)、その間も直接mailコマンドでドドーンとMIME?ナニソレ?なメールが行き交っていたり。

で、そういうメールでは当然お作法が守られていません。
ヘッダにJISコードが直打ちなのはともかく、そもそもContent-Typeが定義されてない、されててもcharsetが定義されてないとかザラです。それでも日本国内で主に使われているメールクライアントの場合はほぼ間違いなく正しく表示してくれますので顕在化しにくいですが、それはバッドノウハウの賜物です。

で、今回利用させていただくことにしたRainLoopさんでは、こういった不届きものはもれなく化けます。
仕様を守っていませんし、仕方ないですね。

・・・というわけにはまいりませんので、ちょこっと修正します。
現在のコミュニティエディション ver 1.9.3.365を例に修正例をご紹介します。

まずヘッダです。
rainloop/v/1.9.3.365/app/libraries/MailSo/Mime/HeaderCollection.php: 272行目(Parse関数内)に下記を追記します。

if( stripos( $sRawHeaders, "Content-Type" ) == false ){
        if( strpos( $sRawHeaders, 033 ) != 0 ){
                $sRawHeaders = "Content-Type: text/plain; charset=\"ISO-2022-JP\"\r\n" .
 $sRawHeaders;
        }
}

これはContent-Typeがないメールでヘッダ内にESCコードがある奴はISO-2022-JPと決めうちしてしまうものです。乱暴ですねぇ。mb_detect_encodingを使用しないのは、ある程度実験したところ、まるで使い物にならなかったからです。直撃したほうがまだマシな程度に使い物になりませんでした。
いろんな国がありいろんな言語がありますから、本当に大変なんだろうなぁ、としみじみ思いました。

お次にボディです(ボデーといまだに言ってしまうので格好つけてみました)

rainloop/v/1.9.3.365/app/libraries/MailSo/Mail/Messages.php: 783行目(InitByFetchResponse関数内)に下記を追加します。
if( $sTextCharset != "iso-2022-jp" && strchr( $sText, 033 ) !== false ){
   $sTextCharset="iso-2022-jp";
   $sText = mb_convert_encoding( $sText, "utf8", "iso-2022-jp" );
}

これは、iso-2022-jpなcharsetじゃないのになんで本文がエスケープされてんだよオイ、という時に無理やりJISからUTF8に変換してしまう、まことに乱暴なコードです。

これで、前世紀から今世紀初頭のメールもめでたく現代においても読めるようになりました。

こんな記事、誰が必要とするのかわかりませんが。

どうでもいいですが、このrainloopのソースはきれいで読みやすかったです。
phpで書かれたコードに対して私がこんなことを感じるのは、これは大した褒め言葉ですとも。

CentOS7でsambaの挙動が急に変わった

sambaを4.2.3-10.el7から4.2.3-11.el7_2に更新したら急にWindowsからアクセスできない共有ディレクトリが発生しました。

何事かと思ったけど、単純にシンボリックリンクが共有外に張られているとエラーとなって・・・

えええ??いまさら???

この機能そのものはsambaに実装されてから古いですよね。
わざとRHELの方針で殺してあるものとばかり思っていましたが・・・????
たまげたなあ。

ちゃんとした公開ポリシーに基づいた共有ディレクトリの設定が適切に行われていれば、当然こんなことは起きないのですが、開発環境はWindows上にあるけど実行環境は仮想マシン内のLinuxにあるというようなときには面倒なのでsambaでドーンと公開しちゃうようなズボラをやったりすると、こういう目にあいます。自業自得ですね。

今回は、たまたまサーバのOSにCentOS7を採用したこともあり、少しでも経験値を高めようと、とあるプログラムのデバッグ環境にもCentOS7を使用し、一通りのデバッグも済んだのでyum check-updateをかけてみるとkernelの更新が来ていたので、そいつでもテストしようと思って一括updateをかけたらその中にsambaの更新も含まれていたのでした。

対応方法は、まあ、CentOS以外では一般的な話なので流しますが、[global]で拡張を有効にするか連携を無効にし、かつ、共有ディレクトリ外にシンボリックリンクが張られている共有ディレクトリの定義(ここでは共有名shareとします)に、共有ディレクトリ外へたどれるように設定します。

具体的には以下を追記します。

[global]
unix extensions = no
または、unix extensionsをyesのままにしたいのであれば、下記を設定します。
allow insecure wide links = yes

[share]
follow symlinks = yes
wide links = yes

この設定で安易に実運用しちゃったりするととても寂しい思いをすることになる日が来るかもしれませんからご留意ください。

それにしても、なぜ今なんだろう。

方針転換かパッケージャのミスか・・・ま、当然公開を意図した場所以外へのシンボリックリンクがあること自体がダメというか管理上好ましくないので、改善には違いありません。

2016年1月8日金曜日

ブラザーの複合機DCP7010のスキャナがLinuxで動かない

表題の件ですが、プリンタのほうはCentOS7をインストール直後に正常に利用できることは確認しました。
スキャナも試したのですが、その時点でInvalid Argumentとか言われて正常に動かないことを認識したのですが、ほかにもやるべきことが山積していたので今まで原因の調査に着手できずにいました。

なお、現時点でも解決しておりませんので、解決策をお求めになられている方には大変恐縮ですがそのまま戻るボタンを押下してこのページのことは忘れてください。申し訳ございません。

さて、スキャナをsane-backendsで共有出来て大変便利なのですが、そのパッケージに付属するscanimageでスキャナを正しく認識できません。

具体的には、lsusbを行うと
Bus 001 Device 017: ID 04f9:0182 Brother Industries, Ltd DCP-7010

と、バス番号1、デバイス番号17で接続されているにもかかわらず、

$ scanimage -L
device `brother2:bus1;dev2' is a Brother DCP-7010 USB scanner

と、バス番号1、デバイス番号2で繋がってますとか勘違いされちゃってます。

とりあえずブラザーのホームページに行くと、新しいデバイスドライバがリリースされていたのでそちらを導入してみても、結果は変わらず。
USBの接続口をあちこち変えてみても、デバイス番号がインクリメントされていくにもかかわらずscanimageするとまるで違うバス番号とデバイス番号で認識するという結果は変わりませんでした。

ここでsane-find-scannerというコマンドがあったことを思い出して、試しに実行してみると
$ sane-find-scanner
found USB scanner (vendor=0x04f9, product=0x0182) at libusb:001:017

困ったことに、こちらは正しく判定できているじゃあありませんか。
同じsane-backendsのツールなのに結果が違う。

そこで、調べてみると、sane-backendsの最新版は1.0.25なのですが、CentOS7向けのパッケージは1.0.24。しかも、公式ホームページに掲載されている変更点に
Workaround for USB3 problems in Linux kernel.            
とあるじゃありませんか。
高鳴る期待を胸に早速取り寄せて、しかしもしダメだったときに消しやすいように1.0.24のsrpmを取り寄せて1.0.25用にしてrpm化してさっそくインストールしても、1.0.24の時と全く変わらず。

rpm化せずに直接make installしても、やっぱり同じでした。。。

そこで、もうこうなったら仕方がないので、scanimageをgdbで追いかけることにしました。

追いかけていくと、dll.cの1059行目で
     status = (*(op_get_devs_t)be->op[OP_GET_DEVS]) (&be_list, local_only);
という行でデバイスドライバ側の関数 sane_brother2_get_devices()をコールして、デバイスを取得していることが分かりました。
be_list[0]がそのリストなのですが、この構造体のメンバnameに、誤認されたバス番号とデバイス番号(この場合はbus1;dev2)が入っていたのでした。

つまり、デバイスドライバそのものが勘違いしていたというわけでした。。。

もうここでドライバはソースも公開されていないしどうにもならないのですが、もうちょっと調べてみると、SANE_DEBUG_BROTHER2環境変数を定義してあげると、デバイスドライバからデバッグメッセージが表示されるようだったので試してみると、dll.cの615行目の

  status = (*(op_init_t)be->op[OP_INIT]) (&version, auth_callback);

という行でsane_brother2_init()をコールした段階で
[brother2] brother init
[brother2] brother version: 1000001
[brother2] starting bus scan
[brother2] scanning bus 001
[brother2] found dev 046D/C043
[brother2] found dev 04F9/0182 ←これがDCP7010
(以下略)

というようにUSBにぶら下がっている機器のベンダIDと製品IDがずらずらと列挙されました。

USBポートを繋ぎ替えてつらつら観察してみると、どうもこの表示される順番が例の"bus1;dev2"という表現となっている様子。この場合は2行目だからdev2だぞと。

これじゃ連番にしかならないから17なんて数値が出てくるわけがありませんな。。。

初期化の段階で既に誤認していたわけです。

結局、sane-backendsは正常に動作しており、デバイスドライバ側の問題だったことまでは突き止められました。
ただ、プリンタ機能のほうは、brotherから提供されているデバイスドライバで問題なく印刷できるのですが、プリンタドライバはusbがらみのことは一切cupsにお任せしているのかな?

ちなみに、ダメもとで
ln -s /dev/bus/usb/001/017 /dev/bus/usb/001/002
とかかましてデバイスドライバを騙せないかやってみましたが、
$scanimage --type=tiff >tmp.tiff
scanimage: open of device brother2:bus1;dev2 failed: Invalid argument
と言われてやっぱり駄目でした。

再起動予定は当分先なので試せませんが、多分これ、BIOSでxHCIモードを無効にすればあっさり動くんじゃないかな、と思います。

盛大に回り道した挙句の大山鳴動ネズミ0匹。
恥の記録にふさわしいのでここに記録いたします。

*ご参考: sane-backends.specのdiff
39c39
< Version: 1.0.24
---
> Version: 1.0.25
81c81
< BuildRequires: %{_bindir}/latex
---
> #BuildRequires: %{_bindir}/latex
186,193c186,193
< %patch0 -p1 -b .udev
< %patch1 -p1 -b .epson-expression800
< %patch2 -p1 -b .soname
< %patch3 -p1 -b .sane-config-multilib
< %patch4 -p1 -b .hwdb
< %patch5 -p1 -b .pixma_bjnp-crash
< %patch6 -p1 -b .static-code-check
< %patch7 -p1 -b .scsi-permissions
---
> #%patch0 -p1 -b .udev
> #%patch1 -p1 -b .epson-expression800
> #%patch2 -p1 -b .soname
> #%patch3 -p1 -b .sane-config-multilib
> #%patch4 -p1 -b .hwdb
> #%patch5 -p1 -b .pixma_bjnp-crash
> #%patch6 -p1 -b .static-code-check
> #%patch7 -p1 -b .scsi-permissions
203c203
< %configure \
---
> %configure --disable-latex \
229a230,231
>
> rm -f %{buildroot}%{_bindir}/umax_pp

2016年1月7日木曜日

CentOS7でIPv4の優先度をあげる方法

まあ、CentOS7固有の話ではなくLinux全般で同じ話なんですけど。

前置きです。

現時点でIPv6に対応するメリットって皆無、という方も多いでしょうし、使わない機能は殺すのが原則なのでIPv6そのものを無効にしておられる方も多いでしょう。
(無効にするなら
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
を/etc/sysctl.confに追記してsysctl -p。)

むしろ、使わないならリスク管理や計算機資源管理の観点からも積極的に殺すべきです。

ですが、自分のサービスはIPv6に対応する気がさらさらなくても、IPv6しか喋れない相手のサービスを利用するという場合、殺すわけにはいきません。

IPv6が有効になると、何も設定しなければ問答無用でIPv6が優先されます。

通常はそれで問題がない・・・わけがなくて、NGN網の人なんかはそれでご苦労なさってる様子。
それも今回の話と関係があるのですが、今後もNTTを利用することはまずないと思うので措いといて、本題です。

IPv6を常用するわけではない場合、単なる時間の無駄なのでIPv4を優先して利用する設定をしたいと思います。

IPv4を優先する設定ファイルがCentOSではデフォルトでは省かれているので、まずそれを用意します。

設定ファイルはgai.confなので
find /usr/share -print | grep gai.conf
で探すと、CentOS7の場合は
/usr/share/doc/glibc-common-2.17/gai.conf
にありました。
実はこのファイルはすべてコメントアウトされているので何も記述されていない空文と等しいので新規に作ったほうが早いのですが、今回は敢えてこれを雛形とします。

それを/etcにコピーして precedence で検索すると、
# precedence  <mask>   <value>
#    Add another rule to the RFC 3484 precedence table.  See section 2.1
#    and 10.3 in RFC 3484.  The default is:
#
#precedence  ::1/128       50
#precedence  ::/0          40
#precedence  2002::/16     30
#precedence ::/96          20
#precedence ::ffff:0:0/96  10
という定義が引っかかります。
そのすぐ下に
#    For sites which prefer IPv4 connections change the last line to
#
#precedence ::ffff:0:0/96  100
と書かれているとおり、IPv4射影アドレスの優先度をあげる=数値を大きくするだけです。
(勿論コメントも外してください)
::/96のほうは互換アドレスですがほっぽっといていいです。

これで新たに起動したプロセスからはこの設定が反映されます。
getaddrinfo()が呼ばれたときに毎回このファイルが更新されていれば反映させるというオプションもこの定義体の前半にあるのですが、
# reload  <yes|no>
#    If set to yes, each getaddrinfo(3) call will check whether this file
#    changed and if necessary reload.  This option should not really be
#    used.  There are possible runtime problems.  The default is no.
と書かれています。

一つ謎なのは、ip addrlabel で優先度が操作できないかと思ったのですが
$ ip addrlabel show
prefix ::1/128 label 0
prefix ::/96 label 3
prefix ::ffff:0.0.0.0/96 label 4
prefix 2001::/32 label 6
prefix 2001:10::/28 label 7
prefix 2002::/16 label 2
prefix fc00::/7 label 5
prefix ::/0 label 1
操作以前に優先度は表示もされない。
$ ip addrlabel help
Usage: ip addrlabel [ list | add | del | flush ] prefix PREFIX [ dev DEV ] [ label LABEL ]
ヘルプを見てもラベルそのものの操作しかできない。

Windowsだと
C:\Users\ayumi>netsh interface ipv6 show prefixpolicies
アクティブ状態を照会しています...
優先順位   ラベル  プレフィックス
----------  -----  --------------------------------
        50      0  ::1/128
        40      1  ::/0
        35      4  ::ffff:0:0/96
        30      2  2002::/16
         5      5  2001::/32
         1      3  ::/96
のようにどっちも見えて便利なんですけどねえ。
ま、addrlabelっていうくらいだから当然かな?
その割にはipコマンドには優先度をいじるようなコマンドが用意されていませんが・・・

他にも新しいコマンドでも追加されたのかなあ?

誰のお役に立つかはわかりません。
大抵の通信を伴うプロセスの場合はプロトコルをハナから指定できるし。
WEBアプリを使いたいけどIPv6アドレスがREMOTE_ADDRやREMOTE_HOSTにセットされるのが困るとき・・・くらい・・・?

そんな場合ってあるのかなあ。

2016年1月6日水曜日

auひかりの回線トラブル対応が良かった

チラシの裏です。

大みそかからCentOS5からCentOS7への移行を開始しているのですが、12月下旬からどうも光回線が一日に何度も切断されるという事象が発生していました。

切断されている時間は短くて数秒、長くても30分程度で、それ以外は速度低下も見られず、我慢ができないわけではないのですが、ちょっとした作業中に切れると結構鬱陶しい。

うちは能動的にauひかりを選択したわけではなく、東電がTEPCOひかりを放り出してしまったせいでやむなく使っていました。

やむなく、というのは、NTTはISDNやADSL時代に散々迷惑をかけられたので他に選択肢が存在する以上はフレッツ光なんぞ問題外、という個人的な頑迷さのためです。

その後さらにauによるTEPCOひかりサービスが廃止されてしまい、au-oneを経てauひかりとなったのですが、同じ会社のサービスなのに光回線の交換、自前のルータ使用の禁止などなど、ものすごい理不尽を感じながらもNTTよりマシだ、と思って使ってきました。

もっとも、回線の安定性や速度には全く満足できるものでしたので、己の頑迷さを呪いながら使い続けるという状況に陥らなかったことは幸運でした。

ですが、その肝心の安定性が年末からどうも怪しくなってきてしまいました。
12月の段階で一度KDDIに電話してみたのですが、受付時間外だったらしくアウト。

まあ、ルータや光終端は正しく動いているようにしか見えなかったので、これは年末年始の一時的な現象かもしれないな、と思ってしばらく放置していました。

その後、OSの入れ替え作業を始めたのですが、調べ物や外部との疎通確認などの最中に切られてしまうことが度重なり、年明け3日だしダメかな、と思いつつ再度KDDIに連絡してみました。

連絡したのが午後5時ごろだったのですが、受付ではなく現場の営業時間は22時までだそうで、とりあえず当日中に調査して連絡します、という頼もしいお返事が。

しばらくすると原因がわからないので明日一番で機器を見させてほしいとの連絡がきました。
NTTの時はいつ来るかもぐずぐずしてはっきりさせず、おまけに約束の日時に来ないどころか約束そのものが忘れられていたりしたので、この対応にはびっくりしました。

翌日、実際に一番でやってきて、さっそく機器を見てもらいましたが、デシベル値も良好で特に異常がありません。
仕方ないので、もう契約してから長いので念のため光ケーブルと終端だけ交換して様子を見ようということで引き上げてもらうことにしました。

が、業者の方が引き上げて10分くらい経った時、またまた回線の切断が発生してしまいました。
業者の方に異常発生時の終端装置のインジケータランプの点灯の具合を習っていたので早速ランプを確認すると、確かに異常が発生していることが分かりました。

まだ遠くまで行ってないだろうと踏んで先ほどの工事業者の方に電話で事象が再現したことを伝えたのですが、なかなか取り合えってもらえません。
まあ、これは今なおしたばかりなので、という思い込みや二度手間を嫌う人間の心理ですから私にもよくわかります。なかなか頭が受け付けないんですよね。

こんな時は根気強く説明すると、次第にわかってくれるようになりますので、先ほど学習した切断されたときのインジケータの状態などを説明していくうちに、ようやく状況を受け入れてくれたようで、局内から再度調査してみますとのお返事をいただきました。

ほっとしたものの、これは時間がかかりそうだなあ、と思いながら自分の作業を進めていると、小一時間ばかりしたのち調査のために数回回線が切れますとの連絡が来て、確かに切ったりつないだりされていました。現在起きているトラブルとはONUのインジケータの点灯具合が違うのですぐわかりました。

調査を続けてくれているので不便ながらも頼もしく思いながら自分の作業を続けていると、急に先ほどの業者さんが再訪してきて、もう一度測定させてくださいとのことで、なにかを行った様子。

こちらも業者さんを呼び返してしまった格好なので、次の予定もあるでしょうからあまり手間を取らせるわけにもいかないので深く聞きませんでしたが、接続を繋ぎ替えたとおっしゃってたので、局内か局外のスプリッタへの接続位置を物理的に変えてみたということのようでした。

再測定の結果、デシベル値が上がったことはわかりましたが当然「時々切れる」という現象のため、その場では結果が分かりませんので、これで様子を見ることとして2日経過しましたが、現時点で事象の再現は観察されていませんので、一安心です。

今回は再発を告げるとすぐに再度対応してくれた業者さんの人柄もありますし、KDDIや関電工をはじめ年始にもかかわらず素早い対応をとる体制が構築されていることも大変好印象でした。

そのため、こうしてチラシの裏に感謝の念とともに記録する次第です。

2016年1月2日土曜日

systemdでの起動処理時にネットワークに接続される前に何かをしたい

あけましておめでとうございます。

このエントリの続きでございます。

さて、先ほど作ったスクリプトをsystemdが採用されているCentOS7で/etc/rc.d/init.d/に放り込まないで起動時に処理させたいと思います。
そのスクリプトとは、ネットワークに接続する前に前処理をしたい、というスクリプトです。

CentOS7の場合(以下同様)、/etc/rc.d/init.d/networkが存在していて、そのファイルには
# chkconfig: 2345 10 90
と記述されています。

起動優先度に10が指定されているので9でも与えればいいのかなあ、と思いますが、折角ですからsystemdの起動スクリプト作法に従ってみたいと思います。

なお、これまで通りchkconfigでいけるのか!!とおもって10を指定するとこれまでは(スクリプトファイル名の関係で)NICが有効になる前に先に処理されていたのですが、CentOS7では/etc/rc.d/init.d/に置かれたスクリプトのはるか以前にNICがupされていました。/etc/rc.d/init.d/に置かれているスクリプトの処理順位はかなり低いのかもしれません。

で、これまで実行していたスクリプトをsystemd様のご指定の方法で起動の依存関係を設定してあげなければなりません。

とはいっても、systemd様が要求なさっていることは特に難しいことはありません。
単純にこれまで/etc/rc.d/init.d/配下で起動してたプロセスをsystemd様向けの定義体に書き直すだけのことです。

で、起動時一回だけネットワーク接続前にやりゃあいいわ、という単刀直入な要件の場合、まずは/etc/systemd/system/に以下の内容のようなファイルをおいてあげます。
ここではのちの説明のために、ファイル名をfoo.serviceとしておきます。
[Unit]
Description=このスクリプトのご説明。
Wants=default.target
Before=network.target
Before=network.service
Before=NetworkManager.service
Before=NetworkManager-dispatcher.service
Before=NetworkManager-wait-online.service
Before=network-online.target
[Service]
Type=oneshot
ExecStart=あなたが作ったスクリプト。ここには /etc/rc.d/init.d/xxxx start とした時と同じ処理を記述します。
RemainAfterExit=yes ←こいつはsystemctl status xxxx でかっこよく見せるかどうかです。
[Install]
WantedBy=default.target
Beforeがやたらと並んでいますが、CentOS7の場合ならではという事情もあると思います。
anacondaのしもべNetworkManagerが悪さ(?)をするからです。
サーバ機にいるのかこれ?という機能満載でCentOSは今日も絶好調なのでもしもyum updateしたときのために再有効化されてしまった時の用心のため指定しています。(サーバ機にtunedとかほんとにいるんかいなあ?redhatはデスクトップとサーバとどっちのほう向いているのかさっぱりわかりません)

ここは面倒なところで、各ディストリビューション毎にターゲット名やサービス名は変わってくると思います。
誤解を恐れずに言うならターゲットちゅうのはサービスの寄せ集め、サービスってのは個々のデーモンやら今回の起動時一回やればいいというような具体的な処理のことです。
従って、どういう処理をやるか、というのはサービスごとにまちまちに命名されますし、そのサービスを寄せ集めて命名したら、やっぱりまちまちの名前になりますから、ディストリビューションごとに方言ができてくる可能性は大です。したがって、ここはCentOS7の説明ですよ、としてご紹介するのが関の山です。

ちょいと脱線しましたが、要点をいうと、自分の処理が終わる前に起動しちゃダメヨ、という指定にBeforeを用いるだけです。
で、なにがダメなのか、という判断は各スクリプトによって変わるわけですが、今回はネットワークにつながる前にやりたいことがあるのよ、ということで、ネットワークがらみのtargetやserviceを軒並み指定します。実際にはここでBeforeに指定した各サービスやターゲットにもそれぞれ依存関係が定義されていますのでBeforeには1つ指定すればいいのですが、今後どう変わるかわかりませんので、保険として列挙しています。

Wants=は本来だったらNICのドライバのinsmodが終わったら的ななんかになると思いますが、はっきり言って今回はどうでもいいです。iptablesの操作先はNICドライバではないので。

さて、ファイルを書き終えたら、以前のコマンドでいうとchkconfig --add してあげなくてはいけません。
そのためのsystemdのコマンドは以下です。foo.serviceというのは先ほど便宜的に付けたファイル名です。実際にはfooだけでいいです。
systemctl enable foo.service
もし/etc/systemd/system/foo.serviceを編集しちゃったら、以下のコマンドでsystemdに変更したことを教えてあげてください:
systemctl reenable foo.service
これで次回起動時に実行されるようになります。

お疲れ様でした。

2016年1月1日金曜日

たくさんiptablesに直接登録するよりipsetを使うと早いよ

あけましておめでとうございます。
どうか今年も皆様がお健やかに過ごせますように。

さて、いきなりですが前置きです。

最近、本当に久方ぶりでwindows上の開発環境を10日くらい使い続けてつくづく思ったのは、履歴管理にgitが便利だと思ったことです。

自宅では、(それこそ本当に)膨大な数のソースがCVSで管理されています。
CVSで管理するようになってからでこれですから、しかもCVSで管理する必要がない程度にすぐできちゃうものは登録されていませんから、よくこれだけ書き散らしたものだと感心します。
ですが、EclipseはCVSクライアントとして大変優秀でとても使いやすいのですが、VisualStudioからとなると、こりゃあちと考え物です。MSVSはVSSより最近はgit押しラシイ。

確かに使ってみてgitの素晴らしいところと感じたことは、サーバとつながらない環境でも手元でコミットでき、コミット記録を残せるところがスバラシイ。
移動先で編集しコミットした結果を丸ごとサーバにつながる環境に帰ったらサーバに反映させることができる点は、さすがにCVSではまねのできない芸当です。

おまけに、GitBucketというスバラシイソフトがあることを知り、まるでGitHub的な環境がCentOS5でもあっさり構築できました。Tomcatのwebappsに放り込むだけでおしまい。

・・・ですが、ここからが私の馬鹿なところで、「今回はCentOS5でもやっぱりなんとかなったけど、今後どんどん面倒になってくよなぁ・・・」とか小人閑居してCentOS7への移行作業を昨日はじめてしましました。

しんどいです。

何もかもが、みな新しい。

言語のバージョンが変わっているとかプリンタやスキャナのドライバが入らないとかの問題を現在一つ一つクリアしている最中です。

そんな問題の中の一つにsystemdがあります。
個人的には別に起動処理なんか並列処理なんぞしなくていいし、そもそも再起動なんかしないんだからほっとけよ、とは思いますが、そこはそれを採用しているディストリビューションを採用した自己責任ですから対応しなければなりません。

問題は、自作のネットワークに接続する前にうちに過去に攻撃した者のIPアドレスをiptablesに登録するというスクリプトでした。
簡単にというと、syslogでauthpriv.*;auth.*をfifoにも流しておいて、loginに失敗したやつを速攻でiptablesでdropさせるというものです。もちろん、http(s)やimap4とかも記録します。

すると、10年以上も経過するとこれが数万という数になります。
加えて、ARINやAPNICから得たリストから、やばそうな国からのパケットもdropしているのでえらい数です。

起動してからも攻撃はどんどん来るので、その都度iptablesに追加されていきます。

こいつらを起動時にiptablesに再登録しなければなりません。
もしもこれを

iptables -A INPUT -s 10.20.30.40 -j DROP

とかいう感じで一つ一つ丹精を込めた職人のスクリプトでもって登録しようとするとどうなるかというと、数十分かかります。

今まではこれでやってきました。

工夫しろ、というご意見はごもっともで、当然何とかすべきだったのですが、まずめったに再起動しないので放置していたうちに年月が流れ、ついにここまでになってしまったのと、いままで放置していたという時点で既に恥の記録なので、どうかこのブログの趣旨たる「恥を記録してゆく」という観点から、どうかご容赦いただければ幸甚です。

そこで、いくつか考えられることは、
  • 起動時はifupしないでおいて、登録処理が終わった段階でifupする
     → 本質的に何も変わってない。OSにログインできる時間が早まるだけが取り柄。
  • そもそも登録しない
     → ノーガード戦法は自分に強大な報復能力があるときのみ意味がある
  • 登録処理を早める
といったところだとおもいます。
といったわけで、大量のiptablesのエントリをipsetでもって事前にテーブル化しておいて使ってみようというお話です。

使い方は簡単です。
テーブルを作り、そこにアドレスを登録し、そのテーブルをiptablesに渡す。これが基本です。
テーブルの作成にipsetを使います。

CentOS7の場合ですと、
yum install ipset
でインストールできます。

まず、テーブルの作成ですが、ネットマスク付きのIPアドレス(192.168.0.0/24のような書式です)の場合は、
ipset create IGNORE_WITH_NETMASK hash:net
というように、 hash:netを指定します。
ipアドレス(192.168.1.100というような書式です)だけでいいなら、
ipset create IGNORE_IPADDRESS hash:ip
というように指定します。
ネットマスク付きはARINなどから取得したデータを登録するテーブル、IPアドレスのみのテーブルはうちに攻撃をかけてきたIPアドレスを登録すればいいので、この2種あれば今回の要件には十分です。

テーブルを作ったら、そのテーブルにそれぞれのデータを追加してゆきます。
それぞれ、
ipset add IGNORE_WITH_NETMASK 192.168.0.0/24
ipset add IGNORE_IPADDRESS  192.168.0.100
といった具合です。ループで回すと、うちの環境だと、およそ数十秒かかります。

そうして完成したリストを、今度はdropしてもらうためにiptables に渡してあげます。
一つ一つアドレスをiptablesに教えてあげる形式だと数十分かかる代物が、もう数十秒で完成されていますから、あとはもう一瞬です。
iptables -I INPUT -m set --match-set IGNORE_WITH_NETMASK src -j DROP
iptables -I INPUT -m set --match-set IGNORE_IPADDRESS  src -j DROP
こんな書式になります。
まず、-m set ですが、ipsetがsetというiptable-extensions名なのでこれは決めうちです。要は拡張パックの固有名です。
--match-set がipsetの固有のパラメータになり、第一パラメータにテーブル名、第二パラメータにそのテーブルをどういう風に使うか、ということを指定します。
今回は、サンプルだとIGNORE_WITH_NETMASK に登録されたIPアドレスをソースとして利用するのでsrcとなっています。

これで数十分から数十秒へと飛躍的な性能向上が図られたというわけです。

随分長くなってしまいましたので、これをsystemdを採用するCentOS7でどうやってネットワークにつなげる前にテーブルを登録するのか、というのは次のエントリで扱いたいと思います。

なお、作成したテーブルの削除は下記の手法で削除できます。
 ipset destroy IGNORE_WITH_NETMASK
 ipset destroy IGNORE_IPADDRESS
どうか皆さまにおかれましては良き年になりますように。