ポートフォワーディング

LinuxBeginner
オンラインで実践に進む

はじめに

この実験では、ポートフォワーディングについて学びます。

郵便物が届く住所に住んでいるとします。しかし新しい部屋へ引っ越し、以前の部屋番号(Room 80)宛ての郵便物を、新しい部屋番号(Room 8080)へ自動的に届けたいとします。全員に住所録を更新してもらうのではなく、建物の管理人に転送を任せるイメージです。

ポートフォワーディングは、NAT(Network Address Translation:ネットワークアドレス変換)の一部です。受信トラフィックを書き換え、あるポートに届いたリクエストを別の宛先へ転送します。

つまり、ファイアウォールは単にトラフィックを許可または拒否するだけではありません。パケットの宛先情報を実際に変換し、外部から見えるサービスの入口を別の内部宛先へつなげます。

シナリオ:

ポート 8080 で Web サーバーが動作しています。一方、標準的な Web ブラウザーは、Web サイトを ポート 80 で探します。Web サーバーを変更する代わりに、ファイアウォールへ「ポート 80 に接続してきたら、直接ポート 8080 へ送る」と設定します。

この実験では、次の操作を行います。

  1. トラフィックを処理できるようファイアウォールを準備します(マスカレード)。
  2. ポート 80 から 8080 へ転送するルールを作成します。
  3. ポートリダイレクトの動作をテストし、仕組みを理解します。

マスカレードを有効にする

このステップでは、firewalld がポートを転送するために、ネットワークパケットを変更する権限が必要です。この機能を マスカレード(Masquerading) と呼びます。

マスカレードは、アドレス変換の一種です。実際の環境では、ファイアウォールやゲートウェイが通信の中間に入り、トラフィックの送信元を、開始時とは異なるアドレスの文脈に見せるために使用されます。

マスカレードは、ファイアウォールに仲介役として動作する権限を与えるものだと考えてください。ファイアウォールはパケットのアドレス情報を書き換え、正しい場所へ届くようにします。

注記: この実験環境では、Web ターミナルの接続を維持するため、アクティブなゾーンとして trusted ゾーンを使用します。

まず、現在アクティブなゾーンを確認します。

sudo firewall-cmd --get-active-zones

ネットワークインターフェース(例:eth0)とともに trusted が表示されるはずです。

次に、この trusted ゾーンでマスカレードを有効にします。

sudo firewall-cmd --zone=trusted --add-masquerade

有効になったことを確認します。

sudo firewall-cmd --zone=trusted --query-masquerade

出力が yes なら、次へ進む準備ができています。

転送ルールを作成する

このステップでは、転送ルールを作成します。

転送ルールを使うと、アプリケーション自体を変更せずに、外部から見える動作を安定させられます。ファイアウォールが、クライアントが期待する宛先と、実際にサービスが待ち受けている場所の間の変換層になります。

ここでは、「trusted ゾーンで、ポート 80 宛ての TCP トラフィックをすべてポート 8080 へ転送する」と設定します。

次のコマンドを実行します。

sudo firewall-cmd --zone=trusted --add-forward-port=port=80:proto=tcp:toport=8080

各オプションの意味を確認しましょう。

  • port=80: 元の宛先(以前の部屋)です。
  • proto=tcp: 使用する通信プロトコルです(Web トラフィックでは TCP を使用します)。
  • toport=8080: 新しい宛先(新しい部屋)です。

ルールが正しく追加されたことを確認します。

sudo firewall-cmd --zone=trusted --list-forward-ports

出力に、作成したルールが表示されるはずです。

転送をテストする

セットアップで、ポート 8080 で動作する簡単な Web サーバーが起動されています。このステップでは、まず直接アクセスして正常に動作することを確認します。

curl http://127.0.0.1:8080

次のメッセージが表示されるはずです。 Hello from Port 8080! Port Forwarding is working.

次に、自分の IP アドレスのポート 80 へアクセスして、ポートフォワーディングをテストします。

まず、自分の IP アドレスを確認します。

MY_IP=$(hostname -I | awk '{print $1}')
echo "My IP is: $MY_IP"

この IP アドレスを使って、ポート 80 に接続します。

curl http://$MY_IP:80

テストに関する注記: この実験を含む多くの Linux 環境では、Connection refused エラーが表示されることがあります。これは NAT Loopback と呼ばれる既知の制限です。カーネルは、多くの場合、NAT ルールに対して同じマシンから自身の外部 IP アドレスへ接続することを防ぎます。

この制限を覚えておくことは重要です。設定が正しいかどうかと、ローカルからのテスト結果は別だからです。同じマシンからテストすると誤解を招く場合でも、ルール自体は有効なことがあります。

実際の環境では、別のコンピューターからアクセスしたクライアントは、正常に転送されます。前のステップで list-forward-ports コマンドを実行したときにルールが表示されたことが、成功を示す確かな証拠です。

ルールを削除する

作業後に設定を元に戻すことは、よい運用習慣です。このステップでは、通常のトラフィック動作に戻すため、転送ルールを削除します。

ファイアウォール管理では、不要になったルールを削除することが重要です。古いルールが残っていると、元のテストを忘れた後も、アプリケーションの公開範囲が意図せず変わる可能性があります。

ルールを削除するには、追加したときとまったく同じ詳細を指定して --remove-forward-port を使用します。

sudo firewall-cmd --zone=trusted --remove-forward-port=port=80:proto=tcp:toport=8080

ルールが削除されたことを確認します。

sudo firewall-cmd --zone=trusted --list-forward-ports

出力は空になるはずです。

まとめ

この実験では、ポートフォワーディングを使ってネットワークトラフィックをリダイレクトする方法を学びました。次の操作を行いました。

  1. ファイアウォールがパケットを書き換えられるように、マスカレードを有効にしました。
  2. ポート 80 から ポート 8080 へトラフィックを転送するルールを作成しました。
  3. NAT Loopback と、ローカルからのテストが難しい場合がある理由を学びました。
  4. ルールを削除し、元の状態に戻しました。

これは、データベースやカスタムアプリケーションなどの内部サービスを、標準的な公開ポートで外部に公開する際によく使われる強力な手法です。