Centos7 で ssh の接続を IP で制限する

なお、Amazon AWS の EC2 を使っている場合は セキュリティグループ を使用しましょう

● Centos7 で ssh の接続を IP で制限する

Centos7 からは firewalld を使用します。
( /etc/hosts.deny , /etc/hosts.allow は使用しません )

● 現在の firewalld 設定を確認する

firewall-cmd --list-all

(例)

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: http https imap imaps pop3 pop3s smtp smtps
  ports: 22000/tcp 587/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

● 1. まず既存の 「全てのIPを許可している sshポート」 を閉じます

・標準の sshポート(22番) を使用している場合

例: sshポート(22番)を削除します。

firewall-cmd --permanent --remove-service=ssh

・22番 以外の特定のポートを使用している場合

例: 22000番を削除します。

firewall-cmd --remove-port=22000/tcp --permanent 

● 2. IP許可する設定(rich-rule)を追加します

firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="接続を許可するIPアドレス" port protocol="tcp" port="22" accept"

設定例

IP : 123.123.123.123
ポート : 22000
を許可します。

firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="123.123.123.123" port protocol="tcp" port="22000" accept"

● 2. 全ての接続元に対してポートを開放する場合

ポート22000を開放します

firewall-cmd --add-port=22000/tcp --zone=public --permanent

● 3. 再度 firewalld を再起動して設定を確認する

firewall-cmd --reload
firewall-cmd --list-all

● 4. 追加した設定(rich-rule)を削除します

firewall-cmd --permanent --zone=public --remove-rich-rule='rule family="ipv4" source address="123.123.123.123" port protocol="tcp" port="22000" accept"'

● firewalld のログ取得設定を確認する

sudo firewall-cmd --get-log-denied

・Logging を有効化

firewall-cmd でログを有効にするには、以下のコマンドを実行します。

sudo firewall-cmd --set-log-denied=オプション

オプションの種類

  • off:ログ出力を無効化
  • all:すべての拒否されたパケットのログを出力
  • unicast:ユニキャスト通信の拒否のみログ出力
  • broadcast:ブロードキャスト通信の拒否のみログ出力
  • multicast:マルチキャスト通信の拒否のみログ出力

・Logging を無効化

sudo firewall-cmd --set-log-denied=off

・特定のポート(例:3306)だけのロギングを追加する

sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" port port="3306" protocol="tcp" log prefix="MYSQL_ACCESS" level="info"' --permanent
sudo firewall-cmd --reload

記録されたログの確認

sudo journalctl -f | grep 'IN='

以下のように表示されます

5月 08 08:18:28 サーバ名 kernel: MYSQL_ACCESSIN=eth0 OUT= MAC=02:02:76:1b:05:64:00:2a:10:77:b3:c0:08:00 SRC=接続元IP DST=118.27.5.100 LEN=60 TOS=0x00 PREC=0x00 TTL=56 ID=44610 DF PROTO=TCP SPT=40346 DPT=3306 WINDOW=32120 RES=0x00 SYN URGP=0 
No.1594
05/08 08:20

edit