はじめに
A port is a communication endpoint. Within an operating system, a port is opened or closed to data packets for specific processes or network services.
通常、ポートは特定のネットワークサービスを識別します。これは手動でサービスを別のポートに設定することによって変更することができますが、一般的にはデフォルトのポートを使用できます。
最初の1024ポート(ポート番号0
から1023
)は「ウェルノウンポート番号」と呼ばれ、最も一般的に使用されるサービスに予約されています。これにはSSH(ポート22
)、HTTP(ポート80
)、HTTPS(ポート443
)などが含まれます。
1024を超えるポート番号は「エフェメラルポート」と呼ばれます。
- ポート番号
1024
から49151
までを「登録済み/ユーザーポート」と呼びます。 - ポート番号
49152
から65535
までを「ダイナミック/プライベートポート」と呼びます。
このチュートリアルでは、一般的なサービスがウェルノウンポートを使用するため、Linux上でエフェメラルポートを開きます。
DigitalOcean App Platformを使用してGitHubからアプリを展開します。DigitalOceanにスケーリングに集中させましょう。
前提条件
このチュートリアルを完了するには、以下が必要です:
- ターミナルの使用方法についての理解。
すべてのオープンポートをリストアップする
Linux上でポートを開く前に、すべてのオープンポートのリストを確認し、そのリストにないエフェメラルポートを選択する必要があります。
netstat
コマンドを使用して、ネットワークレイヤのパケット転送に最も一般的なTCPおよびUDPを含むすべてのオープンポートをリストアップします。
- netstat -lntu
これにより、以下が表示されます:
- すべてのリスニングソケット(
-l
) - ポート番号(
-n
) - TCPポート(
-t
) - UDPポート(
-u
)
OutputActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp6 0 0 ::1:5432 :::* LISTEN
tcp6 0 0 ::1:6379 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
udp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN
注意:ディストリビューションにnetstat
が含まれていない場合は、リスニングソケットをチェックしてオープンポートを表示するためにss
コマンドを使用できます。
オープンポートを持つリスニングソケットをリストアップするためにss
コマンドを使用して一貫した出力を受け取っていることを確認します:
- ss -lntu
これにより、以下が表示されます:
OutputNetid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.1:5432 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.1:27017 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.1:6379 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 128 [::1]:5432 0.0.0.0:*
tcp LISTEN 0 128 [::1]:6379 0.0.0.0:*
tcp LISTEN 0 128 [::]:22 0.0.0.0:*
これにより、netstat
とほぼ同じオープンポートが表示されます。
LinuxでTCP接続を許可するためにポートを開く
今、閉じられたポートを開き、TCP接続を待機させます。
このチュートリアルでは、ポート4000
を開きます。ただし、システムでそのポートが開かれていない場合は、別の閉じられたポートを選択してください。ただし、それが1023
より大きいことを確認してください。
ポート4000
がnetstat
コマンドを使用して使用されていないことを確認します:
- netstat -na | grep :4000
またはss
コマンド:
- ss -na | grep :4000
出力は空白のままでなければならず、現在使用されていないことが確認できます。これにより、システムiptablesファイアウォールに手動でポートルールを追加できます。
Ubuntuユーザーおよびufw
ベースのシステムの場合
ufw
– UncomplicatedFirewallのコマンドラインクライアントを使用します。
コマンドは次のようになります:
- sudo ufw allow 4000
ディストリビューションに対応するufw
ファイアウォールのセットアップ方法を参照してください。
注意:
- Ubuntu 14.0.4:「特定のポート範囲を許可」
- Ubuntu 16.0.4/18.0.4/20.0.4/22.0.4: 「他の接続/特定のポート範囲の許可」
- Debian 9/10/11: 「他の接続/特定のポート範囲の許可」
CentOSおよびfirewalld
ベースのシステム用
firewalld
デーモンのコマンドラインクライアントであるfirewall-cmd
を使用します。
以下はコマンド例です:
- firewall-cmd --add-port=4000/tcp
ディストリビューションに関しては、firewalld
のセットアップ方法を参照してください。
注意:
- CentOS 7/8: 「アプリケーションのルール設定/ゾーンのポート開放」
- Rocky Linux 8/9: 「アプリケーションのルール設定/ゾーンのポート開放」
その他のLinuxディストリビューション用
システムのIPv4パケットフィルタルールを変更するには、iptables
を使用します。
- iptables -A INPUT -p tcp --dport 4000 -j ACCEPT
ディストリビューションに関しては、iptables
を使用したファイアウォールの設定方法を参照してください。
注意:
- Ubuntu 12.04:「基本的なファイアウォール」
- Ubuntu 14.04:「他の必要な接続を受け入れる」
新しく開かれたポートをTCP接続のテスト
新しいTCPポートを正常に開いたので、テストする時が来ました。
まず、netcat (nc
)を開始してポート (-p
) 4000
でリスン (-l
) し、ls
の出力を接続されたクライアントに送信します。
- ls | nc -l -p 4000
今、クライアントがポート 4000
でTCP接続を開いた後、ls
の出力を受け取ります。今はこのセッションを放置します。
同じマシン上で別のターミナルセッションを開きます。
TCPポートを開いたので、TCP接続を確認するために telnet
を使用します。コマンドが存在しない場合は、パッケージマネージャを使用してインストールしてください。
サーバーのIPとポート番号 (4000
この例では) を入力して、次のコマンドを実行します。
- telnet localhost 4000
このコマンドは、localhost
のポート 4000
にTCP接続を開こうとします。
次のような出力が表示され、リスニングプログラム (nc
) との接続が確立されたことを示します。
OutputTrying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
while.sh
ls
の出力 (while.sh
この例では) もクライアントに送信され、成功したTCP接続を示します。
nmap
を使用して、ポート(-p
)が開いているかどうかを確認します:
- nmap localhost -p 4000
このコマンドは、開いているポートをチェックします:
OutputStarting Nmap 7.60 ( https://nmap.org ) at 2020-01-18 21:51 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00010s latency).
Other addresses for localhost (not scanned): ::1
PORT STATE SERVICE
4000/tcp open remoteanything
Nmap done: 1 IP address (1 host up) scanned in 0.25 seconds
ポートが開かれました。Linuxシステム上で新しいポートを正常に開きました。
注意: nmap
は、現在リスニングアプリケーションを持つ開いているポートのみをリストします。netcatなどのリスニングアプリケーションを使用しない場合、現在そのポートでリスニングしているアプリケーションがないため、ポート4000
を閉じて表示します。同様に、telnet
もリスニングアプリケーションにバインドする必要があるため動作しません。これがnc
が非常に便利なツールである理由です。これは単純なコマンドでそのような環境をシミュレートします。
ただし、これは一時的なものであり、システムを再起動するたびに変更がリセットされます。
ルールの永続化
この記事で紹介されているアプローチは、システムがシャットダウンまたは再起動されるまで、ファイアウォールのルールを一時的に更新します。そのため、同じポートを再起動後に再度開くには同様の手順を繰り返す必要があります。
ufwファイアウォールの場合
ufw
のルールは再起動時にリセットされません。これは、ufw
が起動プロセスに統合されており、カーネルが適切な構成ファイルを使用してファイアウォールのルールを保存するためです。
firewalld
の場合
--permanent
フラグを適用する必要があります。
ディストリビューションに応じてfirewalld
をセットアップする方法を参照してください。
注意:
- CentOS 7/8: 「アプリケーションのルールの設定」
- Rocky Linux 8/9: 「アプリケーションのルールの設定」
iptables
の場合
構成ルールを保存する必要があります。これらのチュートリアルではiptables-persistent
を推奨しています。
ディストリビューションに応じてiptables
を使用したファイアウォールのセットアップ方法を参照してください。
注意:
- Ubuntu 12.04: 「Iptablesルールの保存」
- Ubuntu 14.04: 「Iptables構成の保存」
結論
このチュートリアルでは、Linuxで新しいポートを開く方法と、受信接続用に設定する方法を学びました。また、netstat
、ss
、telnet
、nc
、およびnmap
を使用しました。
次はIptablesファイアウォールの動作方法、IptablesとNetfilterアーキテクチャの詳細、ソケットの理解、およびサーバーリソースを監視するためのTop、Netstat、Du、その他のツールの使用方法を学習してください。
Source:
https://www.digitalocean.com/community/tutorials/opening-a-port-on-linux