OpenSSHのリモートポートフォワーディングは、-R オプションを使うモード。
何がはまったかというと、SSHのポートフォワードを使った場合はbind(Listen)、させるインターフェースは、原則loopbackに限定される。
SSHを使う特性上、セキュアであるという前提があり、外部と接続されたInterfaceを有効にすると、リモートアクセスが可能となることから、そのようになっているのであろう。
しかし、VPN的な考えで、サイト間を繋ぎたいとき、LAN側インターフェースのみにbindさせたいということがあるだろう。その場合、ローカルポートフォワーディングの場合は、
-L [bind_address:]port:host:hostport
とmanにかいてある。これは、そのままで素直に動く。しかし、リモートということは、接続先のsshd_configの設定に委ねられる(原則として、(ローカル/リモートポートフォワーディング共に)sshdの設定でTCP Forwardingを許可されている必要はありますが)。
同様にして、リモートポートフォワーディングにも、書きのように記載がある。
-R [bind_address:]port:host:hostport --- By default, the listening socket on the server will be bound to the loopback interface only. This may be overridden by specifying a bind_address. An empty bind_address, or the address ‘*’, indicates that the remote socket should listen on all interfaces. Specifying a remote bind_address will only succeed if the server's GatewayPorts option is enabled (see sshd_config(5)).
すなわち、ループバックのbindを上書きして変更するには、sshd_config で、GatewayPortsを有効にしろよ、とある。空で設定しなければ、 * でbindしますよ。と読み取る。
しかし、いくら、 bind_address を指定しても、すべてのinterface でbind されてしまうので困って調べた。
man sshd ではそのことの記載がないので、調べていくと、こういうオプションがあるようで。。
GatewayPorts clientspecified
詳細は、
OpenSSH4.0リリースノートに記載されていました。
この件を日本語で書いてあったのは、この記事。
ほとんど日本語では検索に引っかかりませんでした。
たどり着くまで少し時間がかかってしまったので記録に書いておきますね。