1. 概要

実際、すべてのアプリケーションは、ネットワークを介して他のデバイスと対話するためにポートを採用しています。 TCPとUDPを2つの主要なトランスポートプロトコルとして使用する場合、ネットワークを介してデータを送受信するためのポートが必要です。 すべてのオペレーティングシステムは、効果的な通信のためにこの論理エンティティを必要とします。 アプリケーションサービスを開始するたびに、それらは利用可能なネットワークポートに自動的にマップされます。

ただし、多くのオペレーティングシステムでは、デフォルトでポートが閉じられています。 そのため、ベースオペレーティングシステムでネットワークポートを開いて、ベースからリモートシステムへの通信フローを有効にする必要があります。

この記事では、Linuxでネットワークポートを開く方法について説明します。

2. ネットワークポートとは何ですか?

基本的に、すべてのホストマシンはシステム内で複数のアプリケーションを実行できます。 アプリケーションが他のデバイスと通信する必要がある場合、アプリケーションはホストに関連付けられたIPアドレスを持つネットワークインターフェイスを使用します。 ただし、2つ以上のアプリケーションが同じマシンで実行されている場合、関連付けられたポートは、その特定のアプリケーションのトラフィックをネットワークインターフェイスから区別するのに役立ちます。ポートが開いている、またはリッスンしているとは、アプリケーションまたはプロセスがトラフィックを受け入れる準備ができていること。

3. iptables

iptables は、Linuxシステムがネットワークパケットをフィルタリングするために使用するデフォルトのファイアウォールソフトウェアです。 Netfilterフレームワークを使用して、着信パケットと発信パケットを管理するIPパケットフィルタールールを実装します。 基本的に、それはテーブルとチェーンの概念を中心に展開します。

チェーンはパケットを処理するための一連のルールであり、テーブルは特定の機能を実行するために使用されるチェーンのコレクションです。 ここで、フィルターはルールに照らしてパケットを調べ、それに応じてルーティングします。 アプリケーションとシステムのセキュリティを向上させるためにパケットフィルターを有効にすることは常に良い習慣です。

次に、iptablesコマンドを使用してファイアウォールルールを一覧表示しましょう。

$ sudo iptables -L

Chain INPUT (policy DROP)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

ここで、出力は、デフォルトですべての入力トラフィックがブロックされることを示しています。 その結果、他のデバイスからサーバーに到達するパケットはすべてドロップされます。

一般に、ルールの適用は一時的なものであり、システムの再起動時に削除されます。 この発生を回避するために、iptables-saveコマンドを使用してiptablesルールを保存しましょう。

$ /sbin/iptables-save

4. ネットワークポートを開く

説明のために、以下の例を見てみましょう。

ここでは、Linuxマシンのポート8080でホストされているWebアプリケーションがあります。 Linuxシステムのファイアウォールソフトウェアは、着信および発信トラフィックを監視します。 ただし、ユーザー定義のファイアウォールルールに基づいて、ネットワークパケットをフィルタリングします。 Webアプリケーションはシステム内で正常に実行されていますが、外部に公開することはファイアウォールのルールに依存します。

ポート8080で実行されるサーバーに単純なnodejsアプリケーションをデプロイしてみましょう。

$ npm start
> [email protected] start /home/tools/baeldung-iptables/node-hello
> node index.js
Server running on http://192.168.56.109:8080/ 
..
..

アプリケーションは正常にデプロイされ、 curl コマンドを使用して確認できるため、マシンからアクセスできます。

$ curl https://localhost:8080/
Hello Node!

それでは、ブラウザからhttp://192.168.56.109:8080を開いてみましょう。 「nodejs」アプリケーションは例外なく実行されていますが、サイトはブラウザから開いていません

ここでは、サーバーでのパケットフィルターの展開が原因で問題が発生します。 次の図のように、サーバーはインターフェースでリクエストをドロップします。

この問題を克服するには、ポート8080でサーバーに着信するすべてのWebトラフィックを許可するルールをiptableに作成する必要があります。

$ sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT

この場合、宛先ポートが8080のTCPパケットを受け入れるためのルールをINPUTチェーンに追加しています。

それでは、ブラウザページを更新して、次のことを確認しましょう。

同様に、着信ネットワーク接続をブロックするいくつかの例を見てみましょう。

サーバーへのすべての着信TELNET接続をブロックするには、以下のルールをINPUTチェーンに追加します。

$ sudo iptables -I INPUT -p tcp --dport 23 -j DROP

特定のIPアドレスからサーバーへの着信Webトラフィック接続をブロックする場合は、同様のルールをINPUTチェーンに追加することでブロックできます。

$ sudo iptables -I INPUT -p tcp --dport 80 -s 192.168.56.109 -j DROP

5. 結論

要約すると、ネットワークポートは、アプリケーションが他のデバイスと対話するために不可欠です。 サーバーでのiptablesの有効化は、ネットワーク上のアプリケーショントラフィックの管理に役立つため、セキュリティ構造を強化する上で重要です。 ベストプラクティスとして、ルールはアプリケーションのニーズに基づいてiptablesを使用して調整する必要があります。