自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。

July 11, 2002

[OpenBlockSS] NATルータ化

今度はNATルータ化だ〜。テスト環境はこんな感じ。

会社サーバ(A) ---- (B)OBSS(C) ---- (D)テストPC(クロスケーブルで直つなぎ)
  • (A)はグローバルアドレス。うちの会社は贅沢なことに社内のNetworkにグローバルIPを使っているんだよね。
  • (B)はOBSSの(A)側のインタフェイス(eth0)。IPアドレス等はDHCPで(A)側にあるDHCPサーバから取得する。
  • (C),(D)はプライベートアドレスを使ったセグメント(192.168.1.0/24)。
  • (C)はOBSSのテスト環境側のインタフェイス(eth1)。IPアドレスは192.168.1.1。
  • (D)はテストPCのインタフェイス(eth0)。192.168.1.2でデフォルトゲートウェイは192.168.1.1。

目標としては、(D)から(A)へ向けた通信ができ、かつ、(D)からのパケットが(B)のところで全て(B)のIPアドレスに変換されて(A)に届き、(A)から戻ってきた際にまた(D)のIPアドレスに変換される(IPマスカレード)ようにすることだ。ちなみに逆方向は考えない。

では、まずはNetworkの設定から。/etc/network/interfacesを設定する。

auto lo
iface lo inet loopback
 
auto eth0
iface eth0 inet dhcp
 
auto eth1
iface eth1 inet static
  address 192.168.1.1
  netmask 255.255.255.0

これだけだとeth1が有効にならない(eth1のドライバが自動的にロードされないため)。
/etc/modules.confにeth1のドライバのaliasを追記すれば良いのだけど、Debianの場合は/etc/modules.confを直接編集せずに/etc/modutils/をいじるみたい。
そんなわけで、/etc/modutils/aliasに以下を追記。

alias eth1 8139too

続いて以下のコマンドを実行すると/etc/modules.confが自動的に書き換わる。

# update-modules

これでインタフェイスの初期化の準備は整ったはずなので/etc/init.d/networkingを再起動してifconfigで設定内容を確認。

# /etc/init.d/networking stop
# /etc/init.d/networking start
# ifconfig

※ここは、/etc/init.d/networking restartでも良いかもしれないけど、うちの環境だとうまくいかなかった。

一応、動作確認してみる。OBSSから(A),(D)にpingする。

# ping xxx.xxx.xxx.xxx  (A)のIPアドレス
# ping 192.168.1.2      (B)のIPアドレス

ここまででネットワークインタフェイスの設定は完了。

続いて、NAT HOWTOを参考にしながら作業を進める。

ちなみに、カーネルの再コンパイルが必要になる場合があるんだけど、前回コンパイルしたときに適当に指定しておいたヤツがそのまま動いたからヨシとしよう。つーか、何設定したのか忘れちゃった。ネットワーク周りのオプションをいろいろと指定する必要があるんだよね。こちらが参考になるかも。というわけで、ここではカーネルのコンパイルの後からの話ね。

まず、OBSSがルータとして動作するようにIPフォワードの指定をONにする。

# echo 1 > /proc/sys/net/ipv4/ip_forward

次にNAT(IPマスカレード)の指定。eth0がポイント。

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

ちなみに、設定した内容を見るには以下のようにする。

# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
 
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  anywhere    anywhere
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

これでOK。(D)から(A)にpingしてみる。この際、tcpdumpでOBSSのインタフェイス毎に確認するとIPアドレスがきちんと変換されているのがわかるのでおもしろい。

ただ、実はこれだけだとFTPは使えないので、FTPを使う場合は以下のモジュールをロードしておく必要がある。

# modprobe ip_conntrack_ftp
# modprobe ip_nat_ftp

オレは特に必要なかったが、IRCを使う場合も同様にモジュールをロードする必要があるみたい。

# modprobe ip_conntrack_irc
# modprobe ip_nat_irc

んでもって(D)から(A)のサーバに対してFTPの確認。これもOK。

ところで、これだけだとリブートしたら設定した情報が消えてしまうので設定ファイルに保存する必要がある。

Debianの場合は/etc/default/iptablesのコメントを参考にして以下のコマンドを実行する。

余談だけど、ここんところは微妙に他のディストリビューションと違うのね。見つけるのにすげー時間かかっちった(^^;)。

# /etc/init.d/iptables save active
# /etc/init.d/iptables save inactive   #こっちは不要かも

それから、ip_forwardは/etc/network/options ファイルを直接編集する。実は最初からこちらだけしておけば良いんだよね。

ip_forward=yes       #-> これ
spoofprotect=yes    #-> IP Spoof(IPアドレス偽装)対策(defaultのまま)
syncookies=yes      #-> ついでにSYN flood対策

あと、FTP通信のためのモジュールをブート時にロードする指定を/etc/modulesに書く。

modprobe ip_conntrack_ftp
modprobe ip_nat_ftp

これでリブートしても大丈夫。すばらしい。

[Misc] そういえばSNAT/DNATって

Source NATとDestination NATなのね。Static NATとDynamic NATの略かと思ってた。ダメすぎ(^^;)。


July 11, 2005

[Ruby-GNOME2] graif

Ruby-GNOME2を使った家計簿ソフト、だそうです。

一見したところ、使いやすいGUIになってそうな感じです。


July 11, 2006

[tDiary] リファラエディタプラグイン-2.0.0

tDiary-2.1.4では動作しなくなっているとのことでパッチをいただきましたのでリリースしました。小川さんありがとうございました。

2.1.3以前版と両方動くようにしても良かったのですが、ちょっとめんどくさかったのでrefedit2.rbとしてリリースすることにしました。

2.1.4以降を使う場合は、現行のrefedit.rbをいったん削除してからrefedit2.rbを使ってください。

#環境を作ってテストする時間がありませんでした。動かなかったらごめんなさい。


July 11, 2007

[Ruby] Amrita2のビューをGetTextでL10n化

by essaさん。普通にViewで文章を書いていけば(特に意識せずに)ローカライズができる、というもの。テンプレートエンジン自体がL10nをまともにサポートするって実はあまり知らないんだけど、これはすごいね。

例えば、英語のアプリがAmrita2で書かれていたとすると、開発者本人は意図していなかったとしても外部の人が勝手に(本体に手を入れることなく)日本語化できてしまう(文章のローカライズだけだしerb使ってるところは_("")しないといけないとか多少の制限はあるけど)。

こういうのを見てしまうと、erbで(ローカライズのためだけに)<%= _('foo') %>と書くのはちょっと美しくないよなぁ、と思ってしまう。

(1)最初は一つの言語でガリガリ書いてしまって(2)後で一つずつ文字列を_("")で囲んでいく、っていう流れで開発していた面倒くさがりやさんにとっては、Amrita2では(2)の作業がいらなくなる分、楽できるよね。

というわけでAmrita2の今後の展開に期待!

蛇足だけど、Ruby-GetTextでは文字列抽出時、標準のパーサ(ruby, erb, activerecord, glade2)の他に自分でパーサを定義できる

おそらくAmrita2ではこの機能を使っていただいていると思われるんだけど(まだソースが未公開なのかな。RubyForgeのAnonymous CVSからは取得できなかったのでまだ未確認)、我ながらこの機能の拡張性はすばらしいと思う。本家(GNU Gettext)のxgettextよりも使い勝手が良いかもしれない(自画自賛(苦笑))。

#ここまで言っておいて違ったりして。その時はスルーの方向で(苦笑)。