IPマスカレードを動かす!

NICの二枚挿しも無事終了したことですしNIC二つのIPセグメント間をマスカレード出来るようにIPマスカレードの登録を行います。

IPマスカレードの設定について書いてあるサイトを参考にしました。

IPマスカレードルータの構築

vi /etc/init.d/ip-masq

スクリプトの登録をします。

----------------------

#!/bin/sh
#
# iptables を用いてルーティングを行う
# シェルスクリプト
#

# IP フォワーディングを有効にする
echo 1 > /proc/sys/net/ipv4/ip_forward

# テーブルの初期化
iptables -t filter -F FORWARD
iptables -t nat -F POSTROUTING
iptables -t nat -F PREROUTING

# POSTROUTING, PREROUTING ともにアドレス変換を許可
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT

# フィルタの設定: 通過許可
iptables -t filter -P FORWARD ACCEPT

# 内部から外部への IP マスカレードを許可
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# ftp 通信用のモジュールのロード
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_conntrack_ftp

----------------------

起動時にスクリプトを実行する為に/etc/init.d/ip-masqをrc.localに登録した。

これで追加したNICデバイスのIPからLS-GL搭載のNICデバイスのIPへマスカレードが出来るはずである。
(設定上逆は出来ないはず)
クライアントのgatewayに追加したNICのIPアドレスを設定すればWAN側にもアクセス可能です。
(eth0がWANに繋がっていれば)
但しDNSの取得が追加したIPからは行えないのでDNSはプロバイダ提供のDNSのIPを指定する必要がります。
※今後LS-GLにDNSサーバー&DHCPサーバーの設置を考えています。この二つを動かせば完全ルータ化が完了します。
※DNSサーバーのアプリの選定などを行っていますのでそちらはもう少しお待ちください。

debianでは基本的にiptables関連の初期化は/etc/network/interfaces内に
if-upやpre-up、upなどを使ってネットワークデバイスの起動と連動させるのが一般的なようです。
(以前の記事のIPフィルターも同様にするのが望ましいようです)
ただ今回はNIC二枚でサーバーを運用しているのでどちらと連動させるかや
二重に連動したりしないかなど不安要素も多かったので起動時に1回だけ実行するようにしています。

この辺りの動きが今後完全に掴めたらinterfaces内に移行するかもしれません。
本来はデバイスの起動と連動しないとデバイス起動とスクリプト適用のその僅かな時間に
セキュリティが弱い時間帯が存在するので理解されている方はデバイス連動にすると思いますしすべきだと思います。

NIC二枚挿しにする。

LS-GLをルータ化するに当たってNICを二枚挿しにします。
(NIC1枚でも仮想的にIPを二つに出来ますが速度低下を招くのでやりません)

現在の自宅のLAN環境はRegza(テレビ)とWAN以外は全てGigaイーサで統一してるので
LS-GLに増設出来るUSBタイプのGigaNICを探しました。
必要条件はLinuxで使用できる事!

色々と探してみるとアイ・オーデータからETG-US2が出ていました。

早速近所のショップで購入してきてセットアップと行きたいところですが
USBタイプのNICはドライバがAsixで提供されているようでKernekをAsixが使えるようにコンパイルする必要があります。
ただ残念な事に2.6.16.16なKernelには標準では含まれていません。
それでもAsixモジュールを使えるようにKernelの再コンパイルは必用です。

ではAsixを有効にしてkernelソースのコンパイルと行きましょう。
まずはmake cleanでお掃除を。
次にmeke menuconfigでドライバを組み込みます。
Device Drivers>USB Suport>USB Network Adapters>Multi-purpose USB Networking Framework>ASIX AX88xxx Based USB 2.0 Ethernet Adapters

Multi-purpose USB Networking FrameworkとBased USB 2.0 Ethernet AdaptersをModuleで組み込みます。
Multi-purpose USB Networking Framework
  Based USB 2.0 Ethernet Adapters

組み込んだら保存してコンパイルします。
make uImage
コンパイルが終わったら新しいKernelを/boot/uImage.buffaloとして置き換えてください。
これでAsixを読み込む準備が出来ました。
しかし前にも書いている通りETG-US2が使用するAsixの88178というドライバは2.6.16.16では標準で搭載されていません。

ということで対応しているAsixのソースをDLしてきてコンパイルすることにします。
まずはドライバソースをDLします。
AX88178_772_LINUX2.6.14_REV102.tar.gz

適当な場所に解凍します。
次にソースファイル「asix.c」の最後の方に対応デバイスの一覧が書いてありますのでETG-US2を追加します。
ETG-US2のVenderIDとDeviceIDを追加で登録します。

}, {
// I-O DATA ETG-US2
USB_DEVICE (0x04bb, 0x0930),
.driver_info = (unsigned long) &ax88178_info,
}, {

保存したらmakeでコンパイルします。
(基本的に設定は変えなくてもそのままコンパイル出来るはずです)
エラーが無ければmake installでドライバmoduleをインストールします。

インストールが終了したら電源OFF>ETG-US2をUSBに挿す>電源ONで
次回の起動時に自動的に認識されると思います。

/etc/network/interfaces にeth1の項目を追加します。
既にgatewayやdnsはeth0で登録しているのでeth1にはgateway、dns等は登録しないで下さい。
(登録するとLS-GLが外に繋がらなくなります)

ifdown、ifupもしくは再起動すると割り当てたIPでLS-GLにアクセス出来るようになっているはずです。
ifconfigで正しく認識、動作している確認すればETG-US2の登録は終了です。

アタックの多い国からのIPを弾く!

iptablesも無事インストールが終了したのでIPのフィルターを行ってみます。

アタックの多い国のIPと設定をまとめたサイトがあるので参考にさせてもらいました。

韓国 IP アドレスからのパケットを遮断する
※既にリンク先のサイトはなくなっているようです

この設定を行えばフィルタリング出来るのですが再起動するとfilterはクリアされてしまいます。
そこでスクリプトを作成してrc.localでスクリプトを動かすようにしました。

スクリプト用のディレクトリーの作成。
mkdir /etc/krfilter

filterスクリプトをDLして
/etc/krfilterの下にALL2.shとして保存しました。
※既にリンク先のサイトはなくなっているようです
次にフィルター作成と反映のスクリプトを作成します。
vi krfilter.shで新規作成

--------------

# krfilter init script for iptables

echo “initialize start krfilter.”

# make krfilter
iptables -N KRFILTER
iptables -N KRFILTERED

# add filter
sh /etc/krfilter/ALL2.sh

# set accept
iptables -A KRFILTER -j ACCEPT

# set reject
# comment output log
#iptables -A KRFILTERED -j LOG –log-prefix “Rej-TCP “
iptables -A KRFILTERED -j DROP

# initialize
iptables -A INPUT -p tcp -m state –state NEW -j KRFILTER

echo “krfilter initialized.”

--------------

スクリプトを保存して/etc/rc.localにこのスクリプトの実行を登録します。

vi /etc/rc.local

exit 0 よりも前に

sh /etc/krfilter/krfilter.sh

の一行を追加します。

これで起動時にフィルターが適用されるようになります。
(rc.localに書くと他のデーモン起動後に適用されますのでデーモンより前にフィルターしたい場合はそれなりの場所で起動させて下さい)

これでフィルターの設置は完了です。
再起動して実際に適用されたか確認してみましょう。

iptables -L

ズラズラと設定内容が出てきますのでCTRL+Cで適当なところで止めてもOKです。

EABI環境でiptablesコンパイル

いよいよ問題のiptablesコンパイルです。
まずはiptablesのソースをwebから取得します。
Iptables-1.3.8
ソースを適当な場所に解凍します。
そのままコンパイルすれば普通にビルドされます。
しかしエラーが出て動きません!(apt-getでのinstallと同じエラーが出ます)

これを解決するのに調べに調べてあるサイトに辿り着きました。(マジで情報少なくて苦労しました・・・)
ARM gcc バッドノウハウ集
このサイトの「8. EABI と legacy ABI」にgccコンパイル時のオプション指定方法が載っているじゃないですか!
(このサイトには本当に感謝しています)

コンパイル時にgccのコマンドオプションにEABIな事を伝えれば良いようです。
gcc -mabi=aapcs-linux
ではMakefileにこの設定を反映させる方法はと・・・
先頭行にこの一行を追加してください。

CC = gcc -mabi=aapcs-linux

こうすることでmakeした時に自動的に $(CC) を gcc -mabi=aapcs-linux に置き換えてくれます。
早速コンパイル開始です!
何のエラーも無く無事コンパイルが終了しました。
ではmake install してインストールしましょう。
depmod -a & 再起動後にiptablesが動くか確認してみます。

iptables -L

上のコマンドでエラーが出なければ無事コンパイル&インストールは完了です!

ここまで来るのに一週間くらいは考え込んじゃいました(笑)

EABI環境でkernelの再構築

まずARMなLinkstationではKernelがEABIという形式でコンパイルされていることを理解しましょう。
興味がある人は「debian EABI」で検索すれば少ないですが情報は取得出来ると思います。

LinkstationのkernelはこのEABIでコンパイルされているので
通常のapt-get install iptablesでiptablesをインストールしてもエラーが出て動きません。

サイトを検索するとkernelコンパイル時にEABIをOFFにしてOABIでコンパイルしている方が殆どのようです。
しかしこれは初心者には大変危険な方法なのです。
xfsでフォーマットしているファイルシステムは壊れてしまうことがあるのです!
(これもサイトを検索すれば色々と出てきます)
実際に一度OABIでコンパイルして動かしてみたら見事にファイルシステムが壊れました・・・
(おかげでこのサイトも数日止まってしまいました)

ではウンチクはこの辺で終わりにして実際にkernelのコンパイルを行います。
iptables有効なkernelのコンパイル方法を掲載したサイトはは沢山あるので要点だけ書きます。
まずはLS-GLのGPLなソースをバッファローからDLします。
GPL/LGPL Resource -BUFFALO INC.-
(DLするファイルはlinux-2.6.16_lsp.1.7.8.tar.gzです)
DLしたら適当な場所に解凍してmake menuconfigします。

設定画面が出たらrouting関連を全てチェックしnetfiter関連を全てのモジュールにしてから保存します。
(network filterはEnterキーで詳細項目の設定に移行します)
準備が出来たらmakeコマンドでコンパイルの開始です!
(事前にapt-get update と apt-get upgrade でGCCのバージョンを最新にしておいてください)
次にmake modulesコマンドでmodulesもコンパイルします。

コンパイルがうまく出来たらuImageとmodulesを組み込みます。
uImageはソースファイルの下の/arch/arm/bootの中にuImageで出来上がっています。
これを/bootにuImage.buffaloとしてコピーします。
modulesは INSTALL_MOD_PATH=/ make modules_installでinstallします。
終わったらdepmod -aでmodulesを反映させときます。

これでkernelのコンパイルとインストールは終了です。
再起動して動くか確認してみましょう。

FreeLinkのカーネルバージョンを簡単に上げよう!

※この方法はLS-GL(国外ではLSPro)にFreeLinkを導入している方が対象です。

LS-GLにFreeLink1.0rev2を導入するとKernelのバージョンが2.6.12.6で導入されます。
メーカー標準のファームでは2008年1月現在2.6.16.16が入ります。

そこでFreeLinkのKernelを2.6.16.16に上げようというのが今回の企画です。

まず最初にやったのがソースを拾ってきてコンパイルでした。
コンパイルに必用なパッケージを入れたりconfigファイルを設定したり割と面倒です。
コンパイルに要する時間も非常に長いです。

誰かビルドしている人はいないのか?と調べたところFreeLinkがあるサイトのDLディレクトリにあるではありませんか!
これを使わない手は無いです(笑)

さてこれより超簡単なKernel入れ換えに入ります。

1./bootディレクトリに移動します。
コマンド:cd /boot

2.wgetでコンパイル済みファイルをDLします。
コマンド:wget http://downloads.nas-central.org/Users/mindbender/arm9/KERNEL/2.6.16.16-arm1-mb_v1/uImage_2.6.16.16-arm1-mb_v1

3.現在のKernelファイルに_oldを付けてリネームします。
コマンド:mv uImage.buffalo uImage.buffalo_old

4.wgetしたファイルをuImage.buffaloとして動くようにシンボリックリンクを張ります。
コマンド:ln -s uImage_2.6.16.16-arm1-mb_v1 uImage.buffalo
(以前のKernelに戻すにはrm uImage.buffaloでシンボリックリンクを削除しln -s uImage.buffalo_old uImage.buffaloで以前のKernelにシンボリックリンクを張ればOKです)

Kernelの入れ換えはこれだけです!(僅か4ステップ)
※しかしここで再起動してはいけません!
新Kernelのモジュールが入っていませんので動きません。

新Kernel用のモジュールも導入します。

1.作業ディレクトリに移動します。(ここでは/tmpとしてます)
コマンド:cd /tmp

2.wgetでモジュールファイルを取得する。
コマンド:wget http://downloads.nas-central.org/Users/mindbender/arm9/KERNEL/2.6.16.16-arm1-mb_v1/modules_2.6.16.16-arm1-mb_v1.tar.gz

3.取得したファイルを解凍する。
コマンド:tar -C / -xzvf modules_2.6.16.16-arm1-mb_v1.tar.gz

4.解凍したモジュールを登録する。
コマンド:cd /lib/modules/2.6.16.16-arm1-mb_v1
コマンド:depmod -a

これでモジュールの導入も完了です!(僅か4ステップ)

さて再起動してみましょう・・・

順調に起動しているように見えたが最後の方でcat /proc/driver/kernevntが無いというエラーが連発して
TeraTermの画面を埋め尽くしていきます(^^;
このエラー表示はシリアルコンソールの画面でしか確認できません。
telnetで接続しても普通に動いているようにしか見えません。
この状態では電源ボタンを長押ししてもシャットダウンしない状態になっています。
またtopコマンドでプロセスの使用状況を見るとkernelmonというプロセスが表示されます。
シリアルコンソールで接続していない場合はこれで確認できます。

色々調べてみると今回のKernelと以前のKernelでkernevntを吐き出している場所が違うようです・・・
そこでkernelmonスクリプトの書き換えを行います。

ここからはシリアルコンソール経由からはログが流れて操作出来ない状態になっているのでtelnetで接続して作業を行います。

コマンド:vi /usr/local/sbin/kernelmon

“cat /proc/driver/kernevnt”と書いてある部分がすぐに見つかると思います。
ここを”cat /proc/buffalo/kernevnt”に書き換えて保存します。

これでエラーの対処も終わりましたのでrebootします。
再起動後にエラーが出ない状態になればファームの更新作業は無事終了です。
電源ボタンの長押しで再起動するようになっているはずです。
超簡単Kernelバージョンアップはこれにて終了です!

今後も標準ファームで新Kernelが登場したら簡単入れ換え可能であればやってみようと思います(笑)

主にPC、車・バイク、トイガンなどについて書いてます