外部からファイアウォール内のLinuxにsshでログインする方法

ファイアウォール内にある友人のLinuxをリモートからサポートしてあげる場合には、以下の方法でOK。

ファイアウォール内にあるLinux上から以下のコマンドを入力する。

# ssh -N -R 20022:localhost:22 root@自分のサーバーのIPアドレス

これで、自分のサーバーのポート20022に、ファイアウォール内のLinuxのポート22番が現れる。(トンネリング)

次に自分のサーバーから、以下のコマンドにてlocalhost:20022(=ファイアウォール内のLinuxのポート22番)にsshでログインできる。

# ssh -p 20022 root@localhost

この方法を使えば、ポート22に限らず内部のWEBサーバーでも何でも見せることができる。VNCでもリモートデスクトップでも何でもOK。

How to install CentOS5

友人のためにCentOS5のインストール入門を書いてみる。

  • インストールメディアを準備

http://www.centos.org/ からisoイメージをダウンロードして焼いておく。
32ビット版と64ビット版があるのでマシンに合わせて選ぶ。

  • インストール

一番面倒くさいのがパーティションの切り方。(本当はLVMを使ったほうが良いけど入門なので)

/boot --- 100MB --- ext3
swap  --- 2GB   --- swap
/     --- 10GB --- ext3
/tmp  --- 1GB --- ext3
/var  --- 残り全部 --- ext3

日本語は入れないこと。

キーボードのタイプは間違えないこと。

タイムゾーンはAsia/Tokyo

インストールタイプは、「Server」を選択。X-Windowは入れたら駄目。

インストール時のネットワークはDHCPでOK。

ファイアウォール(iptables)と SE Linux は無効化。

# system-config-securitylevel
Security Level: ( ) Enabled (*) Disabled  

SELinux: Enforcing
         Permissive
        *Disabled
  • ネットワークの設定

以下のコマンドで楽々設定

# system-config-network

こんな感じで、自宅の環境に合わせて。(Default gateway IPは、ブロードバンドルータIPアドレス

│ Name               eth0________________ │
│ Device             eth0________________ │
│ Use DHCP           [ ]                  │
│ Static IP          192.168.0.100_______ │
│ Netmask            255.255.255.0_______ │
│ Default gateway IP 192.168.0.1_________ │

設定を反映させるためにネットワークをリスタート

# service network restart

DNSを設定しましょう。

# vi /etc/resolv.conf

以下のような感じで。

nameserver 192.168.0.1   <-たいていはブロードバンドルータがDNSになってくれる。
nameserver 12.34.56.78   <-YahooBBなどの自分のプロバイダが提供しているDNSでももちろんOK。
  • RPMパッケージのインストール

よく使うソフトをインストールする。

yum コマンドおさらい

検索

# yum search <ソフトウェア名>
例
# yum search httpd

# yum provides <パッケージに含まれるファイル名>
例
# yum provides php.ini

インストール (-y を付けると勝手にインストールします。)

# yum install パッケージ名
例
# yum install httpd

# yum groupinstall パッケージグループ名
例
# yum groupinstall "Development Tools"


というわけでLAMP環境なら以下でOK。

# yum -y groupinstall "Development Tools"
# yum -y groupinstall "Web Server"
# yum -y groupinstall "MySQL Database"
# yum -y install php php-devel php-pear php-mysql php-gd php-mbstring subversion

あと、以下は良く使うので入れておく。

# yum install sysstat postfix ntp wget curl
  • 時間の設定

以下の設定をしておくとサーバーの時間がずれない。(毎日 4:56 に時刻が修正される)

# vi /etc/cron.d/ntpdate
56 4 * * * root /usr/sbin/ntpdate -s jp.pool.ntp.org
57 4 * * * root /sbin/hwclock --set --date=' `date`'
  • メールサーバーの設定

デフォルトでSendmail になっているので、Postfixに変更する。

# alternatives --config mta
There are 2 programs which provide 'mta'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/sbin/sendmail.sendmail
   2           /usr/sbin/sendmail.postfix

Enter to keep the current selection[+], or type selection number: 2

Postfixの設定ファイルを書き換える

# vi /etc/postfix/main.cf

relayhost を書き換える。

...
relayhost = [プロバイダから指定されたSMTPサーバーのIPアドレス]
...

これでこのLinuxサーバーからのメールはプロバイダがちゃんと管理しているメールサーバー経由で外に出て行く。

  • 各種デーモン(サービス)の設定

サービスの一覧

# chkconfig --list

サービスの削除

# chkconfig --del サービス名

サービスの追加
(/etc/init.d/ の下を見ると名前を確認できる)

# chkconfig --add サービス名

サービスのOn/Off

# chkconfig サービス名 on
# chkconfig サービス名 off

LAMP環境なら以下でとりあえずOK。「chkconfig --del サービス名」 を使って不要なデーモンをひたすら削除する。ランレベルは「3」のところだけ気にすればOK。

# chkconfig --list
httpd          	0:off	1:off	2:off	3:on	4:on	5:on	6:off
postfix        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
crond          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
sshd           	0:off	1:off	2:on	3:on	4:on	5:on	6:off
syslog         	0:off	1:off	2:on	3:on	4:on	5:on	6:off
network        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
mysqld         	0:off	1:off	2:off	3:on	4:on	5:on	6:off


サービスの起動、停止、再起動

# service サービス名 start
# service サービス名 stop
# service サービス名 restart
  • manコマンド

わからないことが出てきたら以下のおまじないを唱える

# man わからない言葉
例
# man man
# man chkconfig
# man yum
  • Windowsから簡単にアクセスしたい時

samba を入れて、エクスプローラーから、

\\LINUXのIPアドレス\

でアクセスできる。

sambaインストール

# yum install samba

設定ファイル

# vi /etc/samba/smb.conf
[root]
    path = /
    writable = yes
    valid users = root

sambaにユーザ追加

# smbpasswd -a root

sambaリスタート

# service smb restart

mod_rewrite まとめ

  • 準備
SSLProxyEngine On       #httpsのURLに転送ではなくてリバースプロキシーする場合には、Onにしておく
RewriteEngine On        #必ずOnにしておく
RewriteLog "logs/rewrite_log"    #デバッグに非常に便利 (/var/log/httpd/rewrite_log)
RewriteLogLevel 9                #9が最高。ログが多すぎるときは1に。デバッグが終わったらコメントアウトしておく
  • 条件文

GETリクエストで、/foo または /bar へのアクセスで、クエリーの中にABCが入っていたら。(NCは大文字・小文字区別しない。ORはOR条件)

RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{REQUEST_URI} ^/foo$ [OR]
RewriteCond %{REQUEST_URI} ^/bar$
RewriteCond %{QUERY_STRING} ABC [NC]
RewriteRule . http://www.example.com/ [R,L]
  • 否定

「!」を先頭に付けることで、「〜で無いなら」 という 否定 になる。

RewriteCond %{REQUEST_URI} !^/abc$
  • パターンマッチングと後方参照

RewriteCond の「()」内でマッチした文字列を参照するには、「%番号」(例「%1」) を使う。
RewriteRule の「()」内でマッチした文字列を参照するには、「$番号」(例「$1」) を使う。

RewriteCond %{QUERY_STRING} DOMAIN=([^=&]+)
RewriteRule . http://%1/ [QSA,P,L]

RewriteRule ^/(.*)/$ http://example.com/$1 [QSA,P,L]

環境変数の設定は、RewriteRule で行う。%{変数名}で参照する。

RewriteRule ^/(.*)/$ -  [E=MYHOST,C]
RewriteRule ^/(.*)/$ http://%{MYHOST}/ [R,L]
  • プログラムを使った条件や書き換え
RewriteMap my_script prg:/etc/httpd/bin/my_script.pl

RewriteCond ${my_script:%{REQUEST_URI}} ABC [OR]
RewriteCond ${my_script:%{REQUEST_URI}} xyz [OR]
RewriteCond ${my_script:%{REQUEST_URI}} 123

my_script.pl

#!/usr/bin/perl

$| = 1;

while (<>) {
    chomp;
    my $mod = time % 3;
    if($mod == 0) { print "ABC\n"; }
    elsif($mod == 1) { print "xyz\n"; }
    else { print "123\n"; }
}

Static Route (スタティック ルート) の追加

以下のコマンドでroute を追加する。(-p はパーマネント。リブートしても設定が残る)

route add -p ネットワークアドレス mask ネットマスク ルータのIP
route add -p ネットワークアドレス mask ネットマスク ルータのIP if インタフェース番号

以下のコマンドでroute を削除する。

route delete ネットワークアドレス mask ネットマスク ルータのIP

route add -p 123.234.43.0 mask 255.255.255.0 192.168.0.10

確認

route print

man コマンドなどで日本語の方を見たいとき

rootの言語は英語にしているが、その場だけ日本語にしたい場合は、環境変数「LANG」に「ja_JP.UTF-8」にセットしてから実行すればよい。

# LANG=ja_JP.UTF8  コマンド
そのままだとエラーメッセージも英語
# ls -ltr /foo/bar
ls: /foo/bar: No such file or directory

こうするとエラーメッセージが日本語
# LANG=ja_JP.UTF8  ls -ltr /foo/bar
ls: /foo/bar: そのようなファイルやディレクトリはありません

デフォルトが日本語になっていて文字化けなどの理由で英語の方がいい場合は、「LANG」には「C」を設定する。

# LANG=C  コマンド

MTAをSendmailからPostfixに変更する方法

今までCentOS上で、MTAをSendmailからPostfixに変更する場合は、

# system-switch-mail

というRedhat固有のコマンドを使っていたが、デフォルトでは入らないので、

# yum install system-switch-mail

していたが、同僚からalternatives(これもRedhat固有)というコマンドを教えてもらった。感謝。

使い方は以下のとおり。

# alternatives --config mta

There are 2 programs which provide 'mta'.

  Selection    Command
-----------------------------------------------
*  1           /usr/sbin/sendmail.sendmail
 + 2           /usr/sbin/sendmail.postfix

Enter to keep the current selection[+], or type selection number: 2

こっちのほうが、デフォルトでインストールされているし、ターミナルから実行する場合の画面のくずれの心配も無いので断然おすすめ。