はじめに
LAN(プライベートアドレス、リンクローカルアドレス)からのみSSH接続を行うufwの設定を行います。
ufw cidr
でググると、1つ目に以下がヒットしますがバッドノウハウではないかと思い記事を書くこととしました。
https://qiita.com/Shiro-neko-kamen/items/7e8411c95b0bedf8312f
LANを示すアドレス
IPv4の場合、192.168.0.0〜192.168.255.255
がプライベートアドレスである。
CIDR表記すると192.168.0.0/16
。
IPv6の場合、fe80::/64
リンクローカルアドレスが該当する。
ufw への設定
ufw は既に動作中のものとする。
sudo ufw allow from 192.168.0.0/16 to any port 22
sudo ufw allow from fe80::/64 to any port 22
または、
sudo ufw allow from 192.168.0.0/16 to any app OpenSSH
sudo ufw allow from fe80::/64 to any app OpenSSH
など。
アドレスを指定せず同ポートが許可されていたら削除しておく
sudo ufw status numbered
sudo ufw delete <num>
ssh接続し確認する
ホスト側でIPアドレスを取得し、クライアントから各種IPアドレスでssh接続を試みます
ip a
ssh <username>@192.168.X.X
ssh <username>@fe80::<XXXX:XXXX:XXXX:XXXX>
ssh <username>@2400:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX
無事にIPv6グローバルアドレスのみ接続できないことが確認できました。
ホスト名での接続
windows10 からホスト名でのssh接続を試みる
ssh <username>@<hostname>.local
接続は出来ましたが、それなりの時間がかかった。
w -i
とすると、IPv4プライベートアドレスでログインしていた。
ping <hostname>
クライアントから ping を叩くと、IPv6グローバルアドレスから応答があった。
IPv6グローバルアドレス -> IPv4プライベートアドレス と、たらい回しにされている模様。
いくつかの回避策は浮かびますが、デファクトはどれなのか分からず、windows側の問題だと思うのでここでは言及しません。
良い方法をご存じの方は教えていただけますと嬉しいです!
スクリプトでCIDRを展開して ufw に追記する方法ですが、個別にコンペアを取ると思われパフォーマンスが落ちそうです(ベンチは取ってない)。
なにより
sudo ufw status
した際の可読性が低いと思われます。
2番目にヒットした以下では、2015年にはCIDRで ufw へ設定を入れています。
https://askubuntu.com/questions/646424/ufw-allow-range-of-ip-addresees