外部ネットワークからプライベートLANマシンにアクセス

(bsdusersに書いたのと大体同じ)

グローバルIPアドレスが一個のプロバイダ接続のときに、家庭内LANの全マシン にSSHログインしたい話。

そういうことをしたい人は、セキュリティ確保に十分な設定はできて いるものと仮定してここではパケットフィルタリングについては触れない

【ありがちな絵】

 おそと---ep0[serv.example.net]  ←サーバマシン
    〜ADSL〜      |fxp0
                [HUB]
		  |
		  +- venus	(10.1.0.2)
		  +- mercury	(10.1.0.3)
		  +- saturn	(10.1.0.4)
		  |
		  :

こいつの適当なポートを、IP Filter のリダイレクションを使って、内部 のマシンのSSHポートに適当に投げる。

これは NetBSD:/usr/share/examples/ipf/mediaone にサンプルがあるとおり、

# Redirect ports for incoming ssh connections.
# This requires having multiple keys for the gateway host in your known_hosts
# file: one for it and one for each of the machines behind it.
# You can use host entries in .ssh/config to create convenient shorthands for
# the internal hosts.
rdr ep0 0/0 port 2201 -> 10.1.0.2 port 22 tcp
rdr ep0 0/0 port 2202 -> 10.1.0.3 port 22 tcp
rdr ep0 0/0 port 2203 -> 10.1.0.4 port 22 tcp
rdr ep0 0/0 port 2204 -> 10.1.0.5 port 22 tcp

というのを列挙すれば良い(ep0は外部へのインタフェース)。さらに、中の 10.1.0.* のホストがNAT越しで外に出て行けるように、

map ep0 from 10.1.0.0/24 to any -> 0/32 portmap tcp/udp auto
map ep0 from 10.1.0.0/24 to any -> 0/32

なんてのも足しておく。LAN内の各マシンの default router はサーバマシンに むけておくのが前提。

こいつを /etc/ipnat.rules にセーブして

# ipnat -CF -f /etc/ipnat.rules

で、準備OK。

では、外からSSHで入る。

% telnet serv.example.net 2201

して、内部の 10.1.0.2 に繋がるか確認。何も返って来なかったときに考えられ る原因はこんなところ。

Connected to serv.example.net
Escape character is '^]'.
SSH-1.99-OpenSSH_3.1p1

みたいに反応が返ったらリダイレクションはうまく行っているので、 実際にSSHでログイン。

では、外部のホストでsshしてみよう。

ext% ssh -4 -p 2201 serv.example.net
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!

うほほほ。serv.example.net のホストキーと、内部のマシンのホストキーが違 うから怒られるのだ。これを回避するには、~/.ssh/config が有用。

外部のマシン、ext で、つぎのようにしちゃう。

ext% vi ~/.ssh/config
(以下を追加)

-----------------[ここから]-------------------------------
Host venus
 HostName               serv.example.net
 HostKeyAlias           venus
 Port                   2201
 UserKnownHostsFile     ~/.ssh/venus_key
-----------------[ここまで]-------------------------------

するってーと、外部のマシンからは

ext% ssh -4 venus

だけでログインできる(hostsに足す必要などはない)。

あー大変。こんなんで悩むよりIPv6ダ!


Generated with mkdiary.rb
yuuji@example.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]