ポートフォワーディングは、ポートマッピングとも呼ばれ、リモートデバイスがプライベートローカルエリアネットワーク(LAN)内の特定のサービスに接続できるようにするための方法です。その名の通り、このプロセスは特定のポートへのリクエストを別のポートまたはネットワークに転送することを含みます。これは転送中のパケットの宛先を変更し、ネットワークアドレス変換(NAT)操作の一種とみなされます。
ポートフォワーディングを有効にすると、内部ネットワークに接続されていないデバイスやホストが相互にアクセスできるようになります。これは、無効になっている場合は制限されます。ポートフォワーディングのメリットを活用して、対象のウェブサイトをブロックしたり、セキュリティを向上させたり、必要に応じてNATファイアウォールを回避する迂回路を追加したりできます。
このチュートリアルでは、Linuxでiptablesを使用してポートをフォワーディングする手順を説明します。
前提条件
このチュートリアルを進めるには、以下が必要です。
- Ubuntuがインストールされていること(お使いのシステムに)。
- 同じデータセンター内にある2台のUbuntu 20.04ホストで、プライベートネットワークが有効になっているもの.
- sudo権限が設定された非ルートユーザーアカウント(各マシンに)。
ホストの詳細
まず、稼働しているサーバーのインターフェースとアドレスの詳細を知る必要があります。システムのネットワークインターフェースを確認してみましょう。
|
1 |
ip -4 addr show scope global |
以下のような出力が表示されます。
|
1 2 3 4 5 6 7 8 9 |
Sample Output 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 198.51.100.45/18 brd 45.55.191.255 scope global eth0 valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 192.168.1.5/16 brd 10.132.255.255 scope global eth1 valid_lft forever preferred_lft forever |
ここで、ハイライトされた出力は2つのインターフェースを示しています。最初のインターフェース eth0はアドレス 192.51.100.45に割り当てられており、2番目の eth1はアドレス 192.168.1.5に割り当てられています。これら2つのインターフェースのうち、1つはパブリックで、もう1つはプライベートです。この2つを区別し、デフォルトゲートウェイに接続されているパブリックインターフェースを特定するためのコマンドを実行します。区別するには、次のように入力します。
|
1 |
ip route show | grep default= |
以下のような出力が表示されます。
|
1 2 3 |
Output: ip route show | grep default |
チュートリアル用のダミーデータ
このチュートリアルでは、ダミーのアドレスとインターフェースの割り当てを使用します。これらのデータは、必要に応じて自由に使用または置き換えてください。
ウェブサーバーのネットワーク詳細:
-
パブリックIPアドレス: 203.0.113.2
-
プライベートIPアドレス: 192.0.2.2
-
パブリックインターフェース: eth0
-
プライベートインターフェース: eth1
ファイアウォールのネットワーク詳細:
-
パブリックIPアドレス: 203.0.113.15
-
プライベートIPアドレス: 192.0.2.15
-
パブリックインターフェース: eth0
-
プライベートインターフェース: eth1
ウェブサーバーのセットアップ
ウェブサーバーホストから始めましょう。まず、 sudo ユーザーでログインします。
Nginxのインストール
まず、Nginxをインストールし、プライベートインターフェースのみをリッスンするようにロックします。これにより、ポートフォワーディングが正しく設定されている場合にのみ、ウェブサーバーが利用可能になります。
次に、ローカルパッケージキャッシュを更新し、aptを使用してNginxをダウンロードしてインストールします。
|
1 |
sudo apt-get update |
|
1 |
sudo apt-get install nginx |
制限の追加
ウェブサーバーホストにNginxをインストールしたら、プライベートインターフェース以外からの入力を受け付けないようにロックします。また、これにより、ポートフォワーディングの設定が正しい場合にのみウェブサーバーがアクティブになります。
制限を追加するには、デフォルトのサーバーブロック設定ファイル /etc/nginx/sites-enabled/default お好みのテキストエディタ(ここではnanoテキストエディタを使用します)で、以下を入力します:
|
1 |
sudo nano /etc/nginx/sites-enabled/default |
出力には、listenディレクティブが2回表示されます:

このチュートリアルでは、最初のディレクティブを使用してIPv4フォワーディングを示します。IPv6用に設定されている2番目のディレクティブは削除できます。Nginxがプライベートインターフェースからのみ入力を受け取るように、80の直前にコロンを付けてWebサーバーのプライベートIPアドレスを追加します。次に、ディレクティブを編集します:

完了したら、ファイルを保存して閉じます。次に進む前に、構文エラーがないことを確認してください。ファイルをテストしてみましょう:
|
1 |
sudo nginx -t |

エラーが表示されなければ、Nginxを再起動して新しい設定を有効にすることができます:
|
1 |
sudo service nginx restart |
ネットワーク制限の検証
Webサーバーへのアクセスレベルを検証してみましょう。次の curl コマンドを使用して、プライベートインターフェース経由でWebサーバーにアクセスを試みます:
|
1 |
curl --connect-timeout 5 192.0.2.2 |
次のような出力が表示されます:

パブリックインターフェースを使用しようとすると、接続できなくなります:
|
1 |
curl --connect-timeout 5 203.0.113.2 |
|
1 |
curl: (7) Failed to connect to 203.0.113.2 port 80: Connection refused |
これはまさに期待通りの結果です。
ポート80を転送するようにファイアウォールを設定する
ファイアウォールマシンでのポートフォワーディングの実装を進めましょう。
カーネルでのフォワーディングの有効化
デフォルトでは、ほとんどのシステムでポートフォワーディングがオフになっています。いくつかの編集を行ってポートフォワーディングをオンに変更します。また、以降のステップで示すように、 sudo 権限を使用してポートフォワーディングを永続的にオンにするオプションもあります。
カーネルレベルでトラフィックフォワーディングをオンにするには、以下を入力します:
|
1 |
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward |
ポートフォワーディングを永続的にオンにするには、 /etc/sysctl.conf ファイルを編集します。ファイルを sudo 権限で開き、以下を入力します:
|
1 |
sudo nano /etc/sysctl.conf |
ファイル内で、次のような行を見つけてコメントアウトを解除します:
|
1 |
net.ipv4.ip_forward=1 |
完了したら、ファイルを保存して閉じます。次に、 sysctl コマンドを使用して設定の変更を適用し、有効にします:
|
1 |
sudo sysctl -p |
|
1 |
sudo sysctl --system |
基本的なファイアウォールのセットアップ
まず、マシンに基本的なファイアウォールをセットアップする方法に関するガイドを確認してください。完了すると、以下の状態になります:
- インストールされた iptables-persistent
- デフォルトのルールセットの への保存/etc/iptables/rules.v4
- を使用したルールの追加および変更に関する包括的な知識iptables コマンド
また、iptablesファイアウォールルールを一覧表示および削除する方法.
転送ルールの追加
パブリックインターフェース( eth0 )のポート 80 に流入するトラフィックが、プライベートインターフェース( eth1)に転送されるようにファイアウォールを設定します。デフォルトでは、基本的なファイアウォールには FORWARD チェーンがトラフィックを DROP するように設定されています。ファイアウォールルールを追加することで、Webサーバーへの転送接続が許可されます。セキュリティを強化するため、転送リクエストを許可するようにファイアウォールルールをロックします。
In the FORWARD チェーンでは、ポート 80 宛ての、パブリックインターフェースからプライベートインターフェースに向かう新しい接続を受け入れます。新しい接続は conntrack 拡張機能を使用して識別し、 TCP SYN パケットで表します:
|
1 |
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT |
着信接続から生じる、双方向のその後のトラフィックを許可する必要があります。以下のコマンドを入力して、パブリックインターフェースとプライベートインターフェースの間の ESTABLISHED と RELATED トラフィックを許可します:
|
1 |
iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
|
1 |
iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
Let’s verify if our policy on the FORWARDチェーンのポリシーが DROPに設定されているか確認しましょう。:
|
1 |
sudo iptables -P FORWARD DROP |
これまでに、パブリックインターフェースとプライベートインターフェースの間のトラフィックがファイアウォールを通過できるようにするルールをいくつか追加しました。しかし、 iptables は、ファイアウォールルールの設定がまだ完了していないため、トラフィックを転送するように指示されていません。次のステップでは、NATルールを追加し、トラフィックを転送するために永続的なルールセットを調整します。
パケットを転送するためのNATルールの追加
2つの異なる操作を行い、 iptables がパケットを正しく変更し、クライアントやWebサーバーとの通信を円滑にできるようにします。
DNATは、 PREROUTINGチェーン( nat テーブル内)を開始する最初の操作です。この操作はパケットの宛先アドレスを変更し、ネットワーク間を通過する際に正しくルーティングされるようにします。ただし、パブリックネットワーク上のクライアントはファイアウォールサーバーに接続するため、プライベートネットワークのトポロジーに関する情報を持っていません。プライベートネットワークと情報をやり取りするには、各パケットの宛先アドレスを変更して、宛先のWebサーバーに正しく到達できるようにします。
ポートフォワーディングの設定に焦点を当てていることに注意することが重要です。ファイアウォールに到達するすべてのパケットに対してNATを実行することは、このチュートリアルの範囲外です。ポート 80 のパケットを、WebサーバーのプライベートIPアドレスに一致させます。
|
1 |
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 |
パケットは、クライアントの元のアドレスを送信元アドレスとして含んだ状態で、Webサーバーに正しくルーティングされます。サーバーがそのアドレスに直接返信を送信しようとしても、正当なTCP接続を確立することはできません。
適切なルーティングを設定するために、パケットの送信元アドレスを変更します。送信元アドレスをファイアウォールサーバーのプライベートIPアドレスに編集しましょう。変更後、返信はファイアウォールに送り返され、ファイアウォールがそれをクライアントに転送します。
この機能を有効にするには、パケットがネットワークに送信される直前に評価される、 POSTROUTINGチェーン( nat テーブル内)にルールを追加します。次に、IPアドレスとポートによってWebサーバー宛てのパケットを一致させます。
|
1 |
sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -d 192.0.2.2 -j SNAT --to-source 192.0.2.15 |
このルールが適用されると、Webブラウザでファイアウォールマシンのパブリックアドレスを指定することで、Webサーバーにアクセスできるようになります。
|
1 |
curl 203.0.113.15 |
次のような出力が表示されます。

ポートフォワーディングの設定は完了です。
永続的なルールセットの調整
ポートフォワーディングの設定が完了したら、これを永続的なルールセットに保存します。現在のルールセット内のコメントを保持したい場合は、 iptables-persistent サービスを使用してルールを保存します。
|
1 |
sudo service iptables-persistent save |
また、ファイルを開いて手動で編集し、コメントを保持することもできます。
|
1 |
sudo nano /etc/iptables/rules.v4 |
次に、 filter テーブルと nat テーブルを設定して、それぞれ FORWARD チェーンのルールと ROUTING ルールを追加します。 nat テーブルを調整することで、以下の例に示すように PREROUTING および POSTROUTING ルールを追加できるようになります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
/etc/iptables/rules.v4 *filter # デフォルトですべての送信を許可し、受信および転送パケットをドロップする :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] # プロトコルごとのカスタムチェーン :UDP - [0:0] :TCP - [0:0] :ICMP - [0:0] # 許容可能なUDPトラフィック # 許容可能なTCPトラフィック -A TCP -p tcp --dport 22 -j ACCEPT # 許容可能なICMPトラフィック # 定型的な許可ポリシー -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A INPUT -i lo -j ACCEPT # 無効なパケットをドロップする -A INPUT -m conntrack --ctstate INVALID -j DROP # プロトコル固有のチェーンにトラフィックを渡す ## 新規接続のみを許可する(確立済みおよび関連する接続はすでに処理されている必要があります) ## TCPの場合、さらに新規 of SYNパケットのみを許可する。これが新規TCP接続を確立するための唯一の有効な ## 方法であるため -A INPUT -p udp -m conntrack --ctstate NEW -j UDP -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP -A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP # ここまで到達したものはすべて拒否する ## 拒否メッセージはプロトコル固有のものにするよう試みる -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -A INPUT -p tcp -j REJECT --reject-with tcp-reset -A INPUT -j REJECT --reject-with icmp-proto-unreachable # ポート80をWebサーバーに転送するルール # Webサーバーのネットワーク詳細: # * パブリックIPアドレス: 203.0.113.2 # * プライベートIPアドレス: 192.0.2.2 # * パブリックインターフェース: eth0 # * プライベートインターフェース: eth1 # # ファイアウォールのネットワーク詳細: # # * パブリックIPアドレス: 203.0.113.15 # * プライベートIPアドレス: 192.0.2.15 # * パブリックインターフェース: eth0 # * プライベートインターフェース: eth1 -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 転送フィルタリングルールの終了 # 変更をコミットする COMMIT *raw :PREROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] # パブリックインターフェースのポート80へのリクエストを変換するルール # これにより、プライベートインターフェースを使用してWebサーバーに # 正しく転送できるようになります。 # Webサーバーのネットワーク詳細: # * パブリックIPアドレス: 203.0.113.2 # * プライベートIPアドレス: 192.0.2.2 # * パブリックインターフェース: eth0 # * プライベートインターフェース: eth1 # # ファイアウォールのネットワーク詳細: # # * パブリックIPアドレス: 203.0.113.15 # * プライベートIPアドレス: 192.0.2.15 # * パブリックインターフェース: eth0 # * プライベートインターフェース: eth1 -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 -A POSTROUTING -d 192.0.2.2 -o eth1 -p tcp --dport 80 -j SNAT --to-source 192.0.2.15 # Webサーバーのトラフィックに対するNAT変換の終了 COMMIT *security :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT |
上記の値を追加したら、ファイルを保存して閉じます。次に、以下のコマンドを入力してルールの構文をテストします。
|
1 |
sudo iptables-restore -t < /etc/iptables/rules.v4 |
エラーが表示されなければ、ルールセットをロードします。
|
1 |
sudo service iptables-persistent reload |
ファイアウォールのパブリックIPアドレス経由でWebサーバーに引き続きアクセスできることを確認しましょう。
|
1 |
curl 203.0.113.15 |
まとめ
このチュートリアルの終わりまでに、iptablesを使用したLinuxサーバーでのポート転送に慣れているはずです。ポート転送機能を利用して、プライベートネットワークのトポロジーを隠蔽しつつ、ゲートウェイファイアウォールマシンを介してサービストラフィックが自由に流れるように効率化できます。
このプロセスはネットワークの安全性と使用するポートに明示的に依存しているため、安全です。ネットワークにセキュリティファイアウォールやVPNセキュリティがない場合、リスクが発生する可能性があります。したがって、このチュートリアルで説明したようにファイアウォールを構成することをお勧めします。このガイドが、プライベートネットワークを使用する際にインターネット上で安全を維持するのに役立つことを願っています。
システムに実装できるその他のファイアウォールソリューションをさらに探索するには、次のリソースを参照してください:当社のブログ:
- Ubuntu 18.04でUFWを使用してファイアウォールを構成する
- CentOS 7でFirewallDを使用してファイアウォールをセットアップする
- UFWの基本:必須のファイアウォールコマンドを学ぶ
ハッピーコンピューティング!
コメント
コメントはまだありません。最初のコメントを投稿しましょう。