やっぱりWSLでCentOSが使いたい(挫折編)

Bash On Windows、WSL(Windows Subsystem for Linux)で提供されているディストリビューションは ubuntu ですが、ubuntuの環境が動くんなら、他のディストリビューションも動くでしょ? というのが普通の感情(^^

ちょちょっとググってみると、やっぱりあります。
WSL Distribution Switcher ( https://github.com/RoliSoft/WSL-Distribution-Switcher )

Python3で書かれている一連のスクリプトツールのようですが、これを使うといろんなディストリビューションをインストールして切り替えて使えるようです! やったー!
ってなわけで、単純なオイラはすぐに Python の Windowsバイナリをインストールして、早速試してみました。

要するにこのツールは、LinuxディストリビューションのDockerイメージを取得・展開・切り替えの一連の手順をスクリプト化したもののようです。間違ってたらすみません。

で、結果的には、CentOSで運用できるところまではいかなかった・・・。いえ、一応CentOSをインストールできてbashは起動できたんですが・・・このエントリは、その時の備忘録です。

※ Pythonで書かれているので、Windows版のPython3バイナリをインストールしておく必要があります。cygwin環境のpythonだと dockerイメージの解凍に失敗してしまいました。この辺よく分かりません(m´・ω・`)m ゴメン…

上記サイトに行き、git 使っている方は、clone、使ってない方はzip書庫をダウンロードして適当なフォルダに展開してください。私は デスクトップに展開して作業しました。
ちなみに、Windows10のバージョンは Anniversary Update ( Windows10 v1607/Build14393 ) です。

まずは、README.mdに書かれている手順を行う前に、hook_postinstall_all.sample.sh というファイルをリネームして、hook_postinstall_all.sh にしときます。単に sample を消すだけです。
普通にインストールすると root のパスワードが設定されないので、困ることになるので、hook_postinstall_all.shを編集します。具体的には 下記の行をスクリプト上部のコメントが終わった直後ぐらいに追記しときます。

#rootのパスワード設定
ROOTPASSWD="0000" 

前準備完了。

1、get-source.py で Docker Hub 内の オフィシャルイメージを取得します。

僕の目的は CentOSの最新版なので、単に centos と指定。 たぶん動かないと思うけど CentOS6系なら ‘centos:6’ というような感じで指定するみたいです。指定の仕方は docker のまんまですね・・・。詳しくは上記サイトのREADME.md 参照。

C:\Users\xxx\Desktop\WSL>> python get-source.py centos

これで tarボールがダウンロードできました。

2、install.py で tarボールの解凍および切り替え

ダウンロードしたtarボールを指定するか、イメージ名を引数にして install.py を実行。

C:\Users\xxx\Desktop\WSL>> python install.py centos

これで、%localappdata%\lxss ディレクトリにある既存のubuntuが入った rootfs がリネームされ、新しい rootfs に先ほどのイメージが格納されます。
その後、hook_postinstall_all.sh が実行されます。

これで一応インストール完了。試しに bash を立ち上げて、/etc/redhat-release を見ると

$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

3、switch.py で切り替える

元の ubuntu に戻すときは、

C:\Users\xxx\Desktop\WSL>> python install.py ubuntu:trusty

引数なしで実行すると、インストールされているディストリビューションの一覧が表示されます。

C:\Users\xxx\Desktop\WSL>> python install.py
usage: ./switch.py image[:tag]

The following distributions are currently installed:

  - centos:latest*
  - ubuntu:trusty

To switch back to the default distribution, specify ubuntu:trusty as the argument.

4、sudo とかその他諸々がエラーで使えない!!!

さて、実はこれからです(笑)
CentOSがインストールされてやったー!と思って、以下のコマンドを叩くと・・・

$ sudo vi /etc/hosts
sudo: unable to create sockets: Socket type not supported

どうやら sudo コマンドが使えないみたい・・・。
README.mdには、その対策として、 alias sudo=”sudo -S” で回避するように、とのことですが、僕の環境だと同じエラーが出ます・・・。
仕方ないので、su でrootになって作業するしかありません・・・めんどくさーーーーーー!
他にも、localectl とか timedatectl とか なんちゃらctl が動かない。どーなっとんじゃー!?

ってな感じです。CentOS7自体まだ触ったことないんで・・・。ちなみに CentOS6はbash自体起動できず。まぁ、カーネルバージョンが違うので当たり前? これもよくわかんないです。

ってなわけで? おとなしく ubuntu に戻しました・・・。今後のWSLのアップデートに期待です・・・。次のWindows10のバージョンアップ( Creators Update でしたっけ?)でネットワーク関係のシステムコールがまともに使えるようになるんでしょうか・・・・???? 現状ネットワークドライブにアクセスできないので、まともに使えない・・・Apacheとかsambaとかフツーに使えるようにしてyo!!!

(m´・ω・`)m オネガイシマス。

WiFiが使えない!?そうだ!ルーター化しよう。

と、いつもの素人発想の(今更CentOS6?)思いつき「やってみた」私的備忘録です(m_m)

関係ないですが・・・Windows10のAnniversary Updateして、WSL(BASH)入れたらいつのまにか、サービスにSSHサーバーが・・・。netstat -a | findstr LISTEN したら、22番ポートが立ち上がってるやんけ!しかも全解放状態で(笑) ググったらWindows10を開発者モードにするとSSHdがインストール?されるみたい・・・とほほ。とりあえずサービス無効にした。でも、こういうのちゃんと通知してくれないと・・・ある意味公式のバックドアやん・・・。まぁ、開発者モードだから文句は言えないか・・・。

本題です。

社内で割り当てられたIPアドレスは3つで、

  • 社内業務用PC(グループウェアとかメールとか専用・ガチガチにセキュリティ高め&監視対象)のWindows7
  • 開発用のメインPC(Windows10) Windows Defenderのみ
  • 検証用のサーバー(CentOS6.7)

Surface3でOneNoteをメモ帳代わりに常時使っているので、ちょっと前までは、メインPCのWindowsに、APモードで利用できるUSBドングルタイプの無線LAN子機をつけて通信させていました。内緒だけど(^^;

で、8/3のAnniversary Updateで、このUSBドングルの無線LAN子機のドライバがサポート外になったのか、APモードにすると設定画面が消えてしまい正常に繋げなくなりました。ドライバのバージョンアップを待っているのですが、どうも対応しなそうな感じ・・・。環境依存で何かエラーになってるのかなー?と思いつつ原因が分からず。とりあえず、ドライバのバージョンアップを気長に待ってみたい。

で、やっぱり社内LANに接続できないと、不便・・・ってことで、検証用のサーバーにクロスケーブルで接続させてCentOSをルーター代わりにしてNATすりゃいいや、と思い、以下の構成でとりあえずやってみる。

network

検証用サーバーにもSurface3にも余っているLAN口がないので・・・バッファローのUSB-NICを二つ買ってきてクロスケーブルで繋ぐ。思ったんだけど、わざわざクロスケーブル買う必要なかったかもしれない・・・最近のNICってケーブルの種類を自動認識するし。

Surface3に接続させたUSB3-NICは自動認識ですぐにリンクアップ完了。IPアドレスを10.0.0.2と指定。準備完了。
CentOS側は・・・USB2-NICは自動認識するも、やっぱり手動設定させなければ・・・めんどっちーな・・・。

まずはMACアドレス確認。(下記MACアドレスは実際の値ではありません。ご了承のほど)

# dmesg | tail
Slow work thread pool: Ready
usb 2-2: new high speed USB device number 2 using ehci_hcd
usb 2-2: New USB device found, idVendor=0b95, idProduct=7720
usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 2-2: Product: AX88772 
usb 2-2: Manufacturer: ASIX Elec. Corp.
usb 2-2: SerialNumber: 228729
usb 2-2: configuration #1 chosen from 1 choice
asix 2-2:1.0: eth1: register 'asix' at usb-0000:00:1d.7-2, ASIX AX88772 USB 2.0 Ethernet, aa:bb:cc:dd:ee:ff
usbcore: registered new interface driver asix

フムフム、ちゃんとeth1として認識してますな。ドライバは既に入ってんすね。ラクショー・ラクショー。MACアドレス(aa:bb:cc:dd:ee:ff)をコピーして、
設定ファイルをコピーして適当に修正後、リンクアップして確認・・・。

# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth1
# vi /etc/sysconfig/network-scripts/ifcfg-eth1
(ここでMACとかGATEWAYとかIPとかUUIDとか修正)
(UUIDは /usr/bin/uuidgen で。)

(リンクアップして確認する)
# ifup eth1
Determining if ip address 10.0.0.1 is already in use for device eth1...

# ifconfig
eth0      Link encap:Ethernet  HWaddr 11:22:33:44:55:66  
          inet addr:192.168.1.101  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:178189 errors:0 dropped:0 overruns:0 frame:0
          TX packets:144306 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:128726184 (122.7 MiB)  TX bytes:49793405 (47.4 MiB)
          Interrupt:16 

eth1      Link encap:Ethernet  HWaddr aa:bb:cc:dd:ee:ff
          inet addr:10.0.0.1  Bcast:10.0.0.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:76 errors:0 dropped:0 overruns:0 frame:0
          TX packets:76 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:8996 (8.7 KiB)  TX bytes:8996 (8.7 KiB)

ここで一旦クロスケーブルで接続して、Surface3側からpingしてみると、ちゃんと開通。
とりあえず、CentOS(eth1:10.0.0.1)とSurface3(10.0.0.2)の接続完了。

このままだと、社内LAN(192.168.1.0/24)にはパケットが飛ばないので、ここからNATの設定を試みる。
とりあえず、教科書どおりにやってみる。

# vi /etc/sysctl.conf
(net.ipv4.ip_forward = 1 に修正:異なるNIC間の転送を許可する。)

(設定を有効化)
# sysctl -p

(10.0.0.0/24のパケットを社内LANに繋がっているNICにNATして流す.用語の使い方間違ってます(m_m)
# iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/24 -j MASQUERADE

(surface3からのパケットを社内LANへそのまま転送許可する。
# iptables -I FORWARD 1 -i eth1 -o eth0 -s 10.0.0.0/24 -j ACCEPT
# iptables -I FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT

ここでsurface3側から開発者用PC(192.168.1.102)にpingを打ってみると、ちゃんとパケットが到達。
この状態で、surface3の通知エリアにあるネットワークアイコンを見ると、ビックリマークが消え、インターネットアクセスに変わってます。一応surface3のEdgeで会社のホームページを見てみる。\(^O^)/

オールOK。設定を保存。

# service iptables save
iptables: ファイアウォールのルールを /etc/sysconfig/iptables に保存中: [  OK  ]

(ここでiptablesを再起動)
# service iptables restart
iptables: チェインをポリシー ACCEPT へ設定中nat filter [  OK  ]
iptables: ファイアウォールルールを消去中: [  OK  ]
iptables: モジュールを取り外し中:[  OK  ]
iptables: ファイアウォールルールを適用中: [  OK  ]
iptables: 追加のモジュールを読み込み中:nf_conntrack_ftp nf_conntrack_netbios_ns [  OK  ]

ってなわけで、CentOSの簡易ルーター化完了。

本当は、このUSB2-NICがCentOSマシンに接続された時だけ、上記手順をスクリプト化したファイルを実行させたり、USB2-NICが取り外された時に元の状態に戻すスクリプトを実行させたりしたいのですが、USB2-NICの接続状態を監視したりする方法とか、そういうのはどうやるんだろう・・・?

また暇になったら調べてみようっと。

CentOS6でシステムのHDDを入れ替える手順

(*)その後を書き足し。(2016/5/2)
(*)若干書き足し。(2016/3/2)

例によって、記録(備忘録)記事です。前置きがかなり長いです(m_m)

社内で使用しているテストサーバーは、Webアプリケーションの開発及び稼働チェック、社内マシンへのDNSサービス、ダミーのMTA、ソース管理(Subversion)サーバー、Sambaによるファイルサーバー等、僕が仕事する上で必要な機能がたった1つのマシンに集約されてます。というか、一台しか使わせて貰えない(^_^;;;

さらに、このマシンは10年前に買ってもらったCore2 Duo搭載のWindowsXPマシンだったものを社内のOSをXPからWindows7に一斉に変更するタイミングでWindows7へのアップグレードの対象外にされたもの。これを半ば強引に奪い取り(笑)、Linux(CentOS)を入れて今まで特に問題もなく、使用してきましたが、なんせ10年もHDD交換せずに稼働してきたので、そろそろHDDも寿命が尽きる頃。っていうか、もう十分寿命過ぎてる感があるのですが・・・。

HDDだけ新品に交換すれば十分ということで、内蔵HDDを経費として認めてもらえそうなので、仕事が一段落したらシステム移行することにした。

Windowsなら、ドライブごとコピー・・・とかすればいいんでしょうけど、Linuxではやったことないし、2つのHDDをLVMパーティションで作成して/,swap,/usr,/homeという風に分けて使っているのでそう単純にいかないことに気付く。かといって、クリーンインストールはできるだけ避けたい(やってる暇が無い・・・)

ってことで、前置きが長くなりましたが、実作業前に手順を記録して、VMWareで仮想マシンを一度作成しCentOSをインストール後、新しい仮想HDDを追加してHDD移行をシミュレートしてみました。

結果的に上手くいったので実作業前に移行手順を記録しておくことにした。でも正直これでいいのかどうか分からない。参考程度に見て頂くといいかもしれない。

一応分からないことはドキュメントを読んだり、ググったりしたけど、rsyncとかddとかfdiskとか、LVM関係とかの基本的なコマンドは普段殆ど使わないからオプションの指定の仕方とか合ってるかどうかわからん。

素人なりに考えた方法なので、たぶんもっとスマートな方法があるんだと思う。。。

※ パーティションの作成とかブートフラグをつける、等のfdiskやpartedコマンドの操作は省いています。それもできない、分からない、という人は大人しくクリーンインストールした方がいいと思う(逃げ)

(1)環境のチェック

現在のHDD構成 。使用率は20%ぐらい。1TBあるけどほとんど活用されていない。CentOSインストールするときRAID1構成にしようと思ったけど、はじめて仕事で使うサーバーだったので、知識ないのと、なんかあったら怖い、という理由でRAID1構成を諦めた経緯がある(ーー;

  • /dev/sda (500GB)
  • /dev/sdb (500GB)

新しいHDDは、500GB。このHDDに現在のHDDをシュリンクする。

  • /dev/sdc (500GB)

moving

現在のパーティション構成 (*bootable flag)
-------------------------------------------
/dev/sda1(*) Linux        => /boot

/dev/sda2    Linux LVM -+
                        | =>  /,/home,/usr,swap
/dev/sdb1    Linux LVM -+

現在のPV
-------------------------------------------
/dev/sda2  VolGroup lvm2 465.27G
/dev/sdb1  VolGroup lvm2 465.76G

現在のVG
-------------------------------------------
name: VolGroup

現在のLV
-------------------------------------------
lv_home VolGroup ext4 465.76G
lv_root VolGroup ext4  50.00G
lv_swap VolGroup swap   8.00G
lv_usr  VolGroup ext4 407.27G

(2)新しいHDDを現在のHDDと同じ構成にする。

 /dev/sdc1 => /boot 用
 /dev/sdc2 => LVMパーティション(/,/usr,/home,swap用)

作成した/boot用パーティション(/dev/sdc1)へ現在の/bootパーティション(/dev/sda1)をコピー。

 >> dd if=/dev/sda1 of=/dev/sdc1 bs=64MB

LVMパーティション/dev/sdc2にボリュームグループを作成する。
この際VolumeGroup名を現在のものとは別名(VolGroup01など)にする。
(現在のHDDを取り外した後、現在の名前にリネームするので)

 >> vgcreate VolGroup01 /dev/sdc2

この新しいVolumeGroup01から論理ボリューム(LV)を切り出していく(サイズは適当)

 >> lvcreate VolGroup01 -n lv_root -L 22GB 
 >> lvcreate VolGroup01 -n lv_swap -L 8GB 
 >> lvcreate VolGroup01 -n lv_usr -L 70GB 
 >> lvcreate VolGroup01 -n lv_home -l 100%Free
 各論理ボリューム上にファイルシステムを作成
 >> mkfs.ext4 /dev/VolumeGroup01/lv_xxxx (xxxxはroot,usr,home)

 スワップ用には
 >> mkswap /dev/VolumeGroup01/lv_swap

ここまでで、一旦シャットダウンする。

(3)インストールメディアから起動し、レスキューモードで立ち上げる。

(VolumeGroupがinactiveの場合はアクティベートする)
>> vgchange -a y 

(マウントポイント作成)
>> mkdir /mnt/src
>> mkdir /mnt/src/root
>> mkdir /mnt/src/home
>> mkdir /mnt/src/usr
>> mkdir /mnt/dest
>> mkdir /mnt/dest/root
>> mkdir /mnt/dest/home
>> mkdir /mnt/dest/usr

(論理ボリュームをマウントする)
>> mount /dev/VolGroup/lv_root /mnt/src/root
>> mount /dev/VolGroup/lv_home /mnt/src/home
>> mount /dev/VolGroup/lv_usr /mnt/src/usr
>> mount /dev/VolGroup01/lv_root /mnt/dest/root
>> mount /dev/VolGroup01/lv_home /mnt/dest/home
>> mount /dev/VolGroup01/lv_usr /mnt/dest/usr

(パーティションごとコピーする)
rsync -aHxv /mnt/src/root/ /mnt/dest/root
rsync -aHxv /mnt/src/home/ /mnt/dest/home
rsync -aHxv /mnt/src/usr/ /mnt/dest/usr

(コピーが終わったらマウントを解除して、後片付け)
>> umount /mnt/src/root
>> umount /mnt/src/home
>> umount /mnt/src/usr
>> rm -fr /mnt/src
>> umount /mnt/dest/root
>> umount /mnt/dest/home
>> umount /mnt/dest/usr
>> rm -fr /mnt/dest

(fdisk or parted コマンドで/dev/sdc1 にブートフラグを付ける)

ここで、poweroff (shutdown -h now)する。

(4) 一旦電源断して古いHDDを取り外し、再度レスキューモードで起動する

レスキューモードで起動する際の最終段階で、既存のLinuxインストールの探索をスキップしないように。スキップしてしまうと、せっかく上でコピーしたパーティションが/mnt/sysimageにマウントされないので)

ここまで来たらあとは、ボリュームグループのリネームとMBRのインストールするだけ。現在のHDDを取り外した後は、新しいHDDが /dev/sda と認識されるはずなので、ボリュームグループ名を元に戻す。.autorelabelファイルの作成は別にしなくてもいいかも。たぶんリブートしたら強制的にリラベルされるはず(僕が試したときはそうだった)

(ボリュームグループ名を旧HDDにあったものと同じにする)
>> vgrename VolGroup01 VolGroup

(grubインストール: MBRの復旧?)
>> chroot /mnt/sysimage
>> grub-install /dev/sda

(selinux relabel)
>> touch /.autorelabel

(5) インストールメディアを取り外し、リブートして起動を確認する。

ここで、起動に失敗したら、なんかおかしい事になってるので、もう一度HDDを古いものに接続しなおしてやりなおし(^^;;;;
とにかく一度仮想環境で手順を実際にやっておく方がいいと思う。
僕はWindows上のVMWareでHDD容量を1/20サイズでシミュレーションをしたらどうにか上手くいってシステム移行ができた。

(6)でも、ホントにこれで移行できるかどうか分からん

実機で、しかもLinuxで、のシステム環境移行ってやったことないので、デーモンがいろいろ動いていて実稼働しているシステムが本当に移行後上手く動いてくれるのかすんげぇ心配。

また、実際に実機でやってみて結果を追記する予定。でも・・・まだHDD買えてないんですけどね(^_^;;そもそも移行前にHDDが限界で壊れたらどうしよう・・・オロオロ (・_・ )( ・_・) オロオロ

(7) その後 2016年5月2日 追記

飛び石連休の最中、1日だけ出ても仕事は中途半端になるので、システム移行を決行。
HDDは、東芝製のバルクHDD(DT01ACA050)の500GBを買ってきて、PCに接続・・・ブートしない・・・orz
いろいろ試行錯誤した結果、元からあるHDDと新しく買ってきたHDD全部SATAポートに繋ぐと、ブートしないと判明。BIOS画面では一瞬認識するけど、すぐフリーズする。元からあるHDDとマザーボードはかなり古い機種なので混在するとダメなのかもしれないが、原因は不明。

仕方ないので、S-ATA ⇔ USB3 の変換コネクタを使用して新しいHDDをUSBストレージとして認識させた。コピーが遅くなるけど、仕方ない。

移行そのものは、スムーズに進行・・・と思いきや、(3)のrsyncでコピーする際、スラッシュを付け忘れているのに気付かず、(4)のレスキューモードで再起動した際、既存のLinuxシステムの検索に失敗したorz 。結局mvコマンドで1つ上のディレクトリに移動(^^;;;

最終的には上手くいきました。手順と理屈がある程度分かると、ツールを使ったHDD丸ごとコピーよりマニュアルでやる方が早いかも(^^)

mod_apreq2 のインストール

テストサーバー(NP11 w/ CentOS5)にmod_apreq2 をインストールしたので、そのメモ(備忘録)です。

mod_perl2で、Apacheの処理フェーズにフックするモジュールを書いて、いろいろ遊んでます。

結構以前からmod_perl2的なものは勉強がてら書いていたんですが、CGI的な使い方だと、かなり制約が多くて、ハッキリ言って苦労に見合うだけのものが得られません(笑) そういう用途はmod_fcgid とか遙かに良い、ということに最近になって気付いて(遅そ!)、リクエスト処理に介入してゴニョゴニョしたり、入力された(POSTされた)データをいじったり、監視したり、というような、どちらかというとApacheの動作をカスタマイズするようなコードを Perl で書くのが面白く、勉強と遊びの半々になってます(^^)

・・・で、でも、やっぱりCGI的に使う用途(PerlResponseHandlerのような)では、パースされた入力が欲しい(^^;; つまり、Apache2::Request が使いたい。。。 というわけで、mod_apreq2をインストールしました。

最初は、yum install mod_apreq とかで簡単にできるだろう、と勝手に思ってましたが、not available でした(^^;;;

しょうがないので?、ソースからビルド。僕の環境では、ソース取ってきてmake だけでは、エラーでした。事前にインストールするものがあって試行錯誤。READMEとかINSTALLに書いておいて欲しいな・・・。

CPANからExtUtils::XSBuilderモジュールと、yumでmod_perl-devel をインストールしておかないとmakeでエラーでました。はじめから入れとかんかい!と怒られそうですが…

> cpan ExtUtils::XSBuilder
> yum install mod_perl-devel

ソースを取得して適当なディレクトリに展開。

> wget –nd http://ftp.kddilabs.jp/infosystems/apache//httpd/libapreq/libapreq2-2.13.tar.gz
> tar xvzf  libapreq2-2.13.tar.gz

関連するperl モジュールもインストールしたいので・・・ ./configure じゃなく・・・

> perl Makefile.PL --with-apache2-apxs=/usr/sbin/apxs
> make
> make install

あとは、Apacheの設定ファイルに、mod_apreq2.so を食わせて、インストール終了。
 
 
 
ん~、最近、Linux(CentOS)やめて、FreeBSDにもどろうかな・・・とも思いはじめまして、でも僕がFreeBSD触ってたのって10年以上も前だし・・・、しかも FreeBSD(98)の時代だし(^^;;; と思って、調べたら・・・まだ、リリースされ続けていたんですね・・・。
どーしょっかなー。

22番ホームへ、いらっしゃい。

変なタイトルですみません・・・。(ちと間違いがあったので大幅に修正しました。9/2)
「ポートフォワーディング」を検索すると概念的な説明とか詳しい設定方法がいっぱいあるのでそちらを参照するほうが良いです。あくまで自分用の備忘録です。あしからず。

Webサイト構築などでサーバーの設定を自分でいじれるようになると、いろいろ触りたくなるものです。通常ホームページのデータはFTPでアップロードしてたわけですが、セキュリティーだの個人情報だの、騒がれると、このFTP経由でのアップロード手段も問題となります。FTPの何が駄目なのか、「生のデータを垂れ流す」この一点につきると思います。パスワードでさえプレーンテキストで送っちゃうんですから・・・。

というわけで、SFTPだの、SSLを利用したFTPSだのといったものが出てくるわけですが、使い慣れたFTPクライアントを変えたくない・・・というのは誰しも思うのではないでしょうか。

そこで、これらセキュリティーの問題を克服しつつ、使い慣れたFTPクライアントを使い続けたい・・・この二つの要望を叶えてくれるのが、TCP 22番ポートを利用した、ポートフォワーディングというわけです。

つい最近知りました(笑)

もともとは、DreamWeaverCS4で、秘密鍵を利用したsFTPができないことが、不満で、いろいろ検索して調べた結果、このポートフォワーディングという仕組みを知ったというわけです。なお、DreamWeaverCS4はSFTPのパスワード認証ログインのみ対応しているようです。CS5は持ってないので分かりません。

で・・・ポートフォワーディングを利用する準備です。TeraTerm(ver4.65)を使用します。

  1. サーバー側のsshd の設定を確認。
    /etc/ssh/sshd_config ファイルで、AllowTcpForwarding yes に。
  2. FTPサーバー(vsftpd) の設定ファイル(/etc/vsftpd/vsftpd.conf)に次を追記。
    pasv_promiscuous=YES
    (注)YES に設定した場合、 PASV セキュリティーチェックを無効にし、 制御用の接続と異なる IP アドレスからのデータ接続を許可する。 何をしているかを理解している場合にのみ有効にすること。 唯一の道理にかなった利用法は、安全なトンネルの中で使うか、 そうでなければ、おそらくは FXP(訳注: リモートホスト間転送) を容易にするためのものである。

    pasv_min_port=50000
    pasv_max_port=50002
    も追加します。PASVモードでデータ受信のためにランダムなポートで接続しますので、これらポートもポートフォワーディングしないといけません。ポート番号の最小値・最大値を指定してそれらのポートすべてについてポートフォワーディングする必要があります。 ※これら上記の値(50000とか)は適当につけてます。

  3. TeraTermの「設定」メニューの【ssh転送】を設定。 
      SSHポート転送2 
    「ローカルのポート」は、FTPクライアントと同じマシン(つまりlocalhost)の適当なポート。21番じゃなくてもいい。なんでも好きなの。 「リモート側ホスト」には、sshdが動作しているサーバーから見たFTPホスト。たいていsshdとvsftpdは同じマシンで動作していることが多いし、実際僕の場合もそうなので、今回はサーバーから見たFTPホストということで127.0.0.1を入力。
    また、これと同様に上記で
    pasv_min_port=50000
    pasv_max_port=50002
    と設定しているので、50000~50002までのポートも同様に転送設定を行います。
    SSHポート転送3 

    最終的には、下記のような感じになります。
    SSHポート転送 

    これらの設定で、クライアント側のマシンで21番と,50000~50002番ポートがLISTEN状態になっているはずです。コマンドプロンプトを立ち上げ、netstat –a –p TCP と入力することで確認できます。

  4. 準備完了で、次はFTPクライアントの設定変更です。
  5. FTPクライアントの設定。
    普通はFTPサーバーの接続先は、Webサーバーのアドレスを指定していると思いますが、これをlocalhost、つまり自分のマシンのループバックアドレス(127.0.0.1)を指定します。使用するポートは、上記で指定した「ローカルポート」を使うように設定します。上記の例ですと21番を指定しているので、FTPクライアントのポート番号を変更する必要はないですが。
    あと、PASVモードを有効にする必要です。
  6. これで設定終了。
    つまり、FTPクライアントは、自分のマシンの21番ポートにアクセスすると、ポートフォワーディングによって、その接続(コネクション)がリモートホスト側に転送されるってわけで。自分のマシンからリモートホストまでは当然、ssh接続なのですべてのデータが暗号化されている・・・ってわけで、これで安心・・・というわけです。。。
  7. ちなみに・・・
    FTPサーバーの設定で、ローカルアドレス(127.0.0.1)からのみ接続可のように設定しておけば、ポートフォワーディングしていない、普通の?FTP接続は拒否できると思います。たとえば、僕は /etc/xinetd.d/vsftpd に、only_from = 127.0.0.1 とかしています・・・。

FTP接続するたびに、TeraTermを立ち上げなければなりませんが、まぁ、最小化していれば問題ないしね。。。

 

で、このポートフォワーディングを利用することで、なにかとアクセス制限が多くなるファイアーウォールを超えて自由に通信が可能になります。家のブロードバンドルータの22番ポートさえ開けておけば、適切にアドレス変換などの設定を行うことで、インターネット上の経路を流れるデータを暗号化しつつ、どんなポートでも転送してくれるので非常に便利です。

あ、sshdデーモンの設定を変えれば別に22番ポートじゃなくてもいいかなと。 実際、秘密にするときは、22番ポートなんて使わないでしょうし。。。

いやぁ、Linuxのサーバー一個家に入れとくだけで、たいていのことなら全部解決してしまいますねぇ~。便利ですねぇ。