博多南ウェブサービスのblog

博多南ウェブサービスのサービス紹介

Ubuntu 22.04 (Oracle Cloud Infrastructure) の Play Framework に http (port: 80) でアクセスしたい

Play Framework を始めたばかりの方向けに、サンプルを進めるうえで困ったところを共有する目的で書いています。

Oracle Cloud Infrastructure の Ubuntu 22.04 (以下、ubuntu) 内で Play Framework 2.8.x (以下、play) を実行し、http (port: 80) で "Welcome to Play!" ページにアクセスしたときのメモです。

以下、目次

やりたいこと

ubuntu で play を実行し、http://グローバル IP にアクセスする (port: 80 でアクセスする) と、"Welcome to Play!" ページが表示される(ただし、play の待ち受けポートは 9000 の default まま)。

方針

ブラウザから ubuntu 内の play まで、http でアクセスする際、許可を与える必要があるのは以下の設定であった。

ので、以下の設定を一つずつ許可にしていく。

  • Oracle Cloud Infrastructure の ネットワーク・セキュリティ・グループ 内セキュリティイングレスルール」として、『ポート80 の許可』
  • ubuntuiptables ルール」として、『ポート80 からポート9000 へリダイレクト』、『ポート9000 のリダイレクトのリクエストのみ許可』
  • 「play 内 の AllowedHostsFilter 設定」として、『グローバルIP でのhttp リクエスト許可』

詳細

Oracle Cloud Infrastructure の ネットワーク・セキュリティ・グループ 内セキュリティイングレスルール」として、『ポート80 の許可』

default ままだと、「ネットワーク・セキュリティ・グループ」または「(設定があれば)サブネットのセキュリティリスト」には、

  • ポート22 でのSSH Remote Login イングレスルール
  • タイプ3, 4 の ICMP イングレスルール
  • すべてのプロトコル、およびすべてのポートのエグレスルール

あたりが許可されていた。

ので、「ネットワーク・セキュリティ・グループ」に『ポート80 でのTCP トラフィック イングレスルール』を追加した(参考: OracleCloudよりポート許可の追加)。

ubuntuiptables ルール」として、『ポート80 からポート9000 へリダイレクト』、『ポート9000 のリダイレクトのリクエストのみ許可』

# ポート80 からポート9000 へリダイレクト
sudo iptables -t nat -A PREROUTING -m comment --comment "for http port forward" -p tcp --dport 80 -j REDIRECT --to-port 9000
# 設定行は、ssh 用設定行の次にしとこう
INDEX_INSERT=$(sudo iptables -L --line-numbers | grep 'state NEW tcp dpt:ssh' | awk '{print $1 + 1;}')
# ポート9000 のリダイレクトのリクエストのみ許可
sudo iptables -t filter -I INPUT "$INDEX_INSERT" -p tcp --dport 9000 -m conntrack --ctstate DNAT -j ACCEPT
# iptables の設定保存
sudo netfilter-persistent save

なお、sudo netfilter-persistent reload あるいは、iptables-save を呼ぶと、iptables の filter rules が重複して登録された。 これのせい?iptables-save duplicates libvirt and ufw rules on iptables-restore with iptables-persistent

よくわからないし、対処方法も調べていないので、上では明示的にsudo netfilter-persistent reload していない。

sudo reboot 時には、保存した内容のみ登録されたので、回避方法はsudo netfilter-persistent reload しない。

「play 内 の AllowedHostsFilter 設定」として、『グローバルIP でのhttp リクエスト許可』

play.filters.hosts {
  # Allow requests to example.com, its subdomains, and localhost:9000.
  # and add Global IP (ex.: 203.0.113.0)
  allowed = [".example.com", "localhost:9000", "203.0.113.0"]

補足

  • play の待ち受けポートは 9000 の default ままとしたのは、80 を割り当てようとするとroot 権限が必要らしいので
  • 「セキュリティ・リスト」と「ネットワーク・セキュリティ・グループ」は、同じ設定を登録でき、役割も重なっている部分がある。「ネットワーク・セキュリティ・グループ」でできることは、「ネットワーク・セキュリティ・グループ」を使用することを推奨するらしい。セキュリティ・リストとネットワーク・セキュリティ・グループの比較

参考にしたところ

以上でした。