Fedora 20 で SSH の待ち受けポートを変更する

環境設定 - Fedora

ConoHa VPS に Fedora 20 をインストールしたので、そこで使用する sshd の待ち受けポートを標準の 22 番から変更してみました。

Fedora 20 の sshd は SELinux と firewalld で保護されていて、特に firewalld を使うのは初めてでしたけど、以前に Linux 女子部で基本を聞かせてもらっていたおかげで順調にそれらしく設定できました。

Fedora 20 で SSH の待ち受けポートを変更する

Fedora 20 の SSH 待ち受けポートを、標準の 22/TCP から別のポート番号に変更してみます。

要所としては sshd の設定でポート番号を変更することに加え、SELinux での SSH を標準ポート以外で運用するための設定、そして firewalld での変更後の SSH ポート番号の許可を行います。

SSH の待ち受けポートだけを変更して SSH を再起動すると、ファイアーウォールに遮断されてリモート接続できなくなるので気をつけて下さい。

SELinux で SSH の標準ポート以外を許可する

SELinux では22 番以外のポートを使ったsshd の運用は、標準では禁止されています。

標準ポート以外でsshd を運用したい場合には、次のようにsemanage を実行します。このようにすることでssh のポート番号として 10022 も利用できるようになります。

semanage port -a -t ssh_port_t -p tcp 10022

なお、コマンドに渡している引数は次の意味になっています。

引数 意味
port 今回のコマンドでネットワークポートの定義に関する操作を行うことを指定しています。
-a 定義を追加することを意味します。
-t ssh_port_t 設定を行うオブジェクトとして 'ssh_port_t' を指定します。
-p tcp 10022 設定を行うオブジェクトの値として、TCP ポートの 10022 番を指定します。

現在設定されている SSH ポート番号はsemanage port -l | grep ssh で確認できます。

別のポート番号を設定したので、できれば既定の 22/tcp を削除したかったのですが semanage port -d -t ssh_port_t -p tcp 22 を実行しても ValueError: Port tcp/22 is defined in policy, cannot be deleted というエラーになって削除できませんでした。

SSH で標準ポート以外の使用を許可する方法としては、他にもSELinux でallow sshd_t unreserved_port_t:tcp_socket name_bind; を設定する方法もあるようでしたが、これだと予期しないポートが解放される可能性があるため、おすすめできなそうに思えました。

firewalld で SSH の標準ポート以外を通過させる

Fedora 20 ではfirewalld によって通信できるポートの管理が行われているので、それを使って新しい SSH ポートの通信許可を設定することになります。

今回はまだ SSH のルール設定をカスタマイズしていなかったので、システム用の SSH の基本設定を管理者用の設定としてコピーしてそれを編集します。そうすることで、システム用の設定ファイルをそのまま残し、管理者用の設定ファイルを優先的に適用できます。

なお、Fedora 20 のfirewalld 設定ファイルは、それぞれ次の場所に保存されています。

用途 パス
システム用 /usr/lib/firewalld/services/
管理者用 /etc/firewalld/services/

firewalld でのSSH の設定は、ssh.xml に保存されています。

これを次のようにして、システム用のパスからユーザー用のパスに複製します。

cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/

そうしたら、複製した/etc/firewalld/services/ssh.xml を編集して、その中のport タグに指定されているport の値を、既定の22 から、今回の新しい10022 に書き換えます。

<port protocol="tcp" port="10022"/>

これで設定ファイルの準備は完了です。


あとは、次のようにしてfirewalld に新しい設定内容を読み込ませると、この設定が有効化されます。

firewall-cmd --reload

最終的にはiptables を使った管理が行われますが、そのフィルタリングルールの設定はfirewalld によって賄われています。

SSH の待ち受けポートを変更する

SELinux とfirewalld の設定を正しく更新できたら、sshd の待ち受けポートを変更します。待ち受けポートの変更は/etc/ssh/sshd_config で行います。

この中でPort の値として、待ち受けで使いたいポート番号を指定します。たとえば 10022 を使用したい場合は、次のように記載します。

Port 10022

あとは次のようにしてsshd を再起動すれば、待ち受けポートが変更になります。

systemctl restart sshd