Linuxでポートを開く方法

はじめに

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を含むすべてのオープンポートをリストアップします。

  1. netstat -lntu

これにより、以下が表示されます:

  • すべてのリスニングソケット(-l
  • ポート番号-n
  • TCPポート-t
  • UDPポート-u
Output
Active 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コマンドを使用して一貫した出力を受け取っていることを確認します:

  1. ss -lntu

これにより、以下が表示されます:

Output
Netid 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より大きいことを確認してください。

ポート4000netstatコマンドを使用して使用されていないことを確認します:

  1. netstat -na | grep :4000

またはssコマンド:

  1. ss -na | grep :4000

出力は空白のままでなければならず、現在使用されていないことが確認できます。これにより、システムiptablesファイアウォールに手動でポートルールを追加できます。

Ubuntuユーザーおよびufwベースのシステムの場合

ufw – UncomplicatedFirewallのコマンドラインクライアントを使用します。

コマンドは次のようになります:

  1. 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を使用します。

以下はコマンド例です:

  1. firewall-cmd --add-port=4000/tcp

ディストリビューションに関しては、firewalldのセットアップ方法を参照してください。

注意:

  • CentOS 7/8: 「アプリケーションのルール設定/ゾーンのポート開放」
  • Rocky Linux 8/9: 「アプリケーションのルール設定/ゾーンのポート開放」

その他のLinuxディストリビューション用

システムのIPv4パケットフィルタルールを変更するには、iptablesを使用します。

  1. iptables -A INPUT -p tcp --dport 4000 -j ACCEPT

ディストリビューションに関しては、iptablesを使用したファイアウォールの設定方法を参照してください。

注意:

  • Ubuntu 12.04:「基本的なファイアウォール」
  • Ubuntu 14.04:「他の必要な接続を受け入れる」

新しく開かれたポートをTCP接続のテスト

新しいTCPポートを正常に開いたので、テストする時が来ました。

まず、netcat (nc)を開始してポート (-p) 4000 でリスン (-l) し、ls の出力を接続されたクライアントに送信します。

  1. ls | nc -l -p 4000

今、クライアントがポート 4000 でTCP接続を開いた後、ls の出力を受け取ります。今はこのセッションを放置します。

同じマシン上で別のターミナルセッションを開きます。

TCPポートを開いたので、TCP接続を確認するために telnet を使用します。コマンドが存在しない場合は、パッケージマネージャを使用してインストールしてください。

サーバーのIPとポート番号 (4000 この例では) を入力して、次のコマンドを実行します。

  1. telnet localhost 4000

このコマンドは、localhost のポート 4000 にTCP接続を開こうとします。

次のような出力が表示され、リスニングプログラム (nc) との接続が確立されたことを示します。

Output
Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. while.sh

ls の出力 (while.sh この例では) もクライアントに送信され、成功したTCP接続を示します。

nmapを使用して、ポート(-p)が開いているかどうかを確認します:

  1. nmap localhost -p 4000

このコマンドは、開いているポートをチェックします:

Output
Starting 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で新しいポートを開く方法と、受信接続用に設定する方法を学びました。また、netstatsstelnetnc、およびnmapを使用しました。

次はIptablesファイアウォールの動作方法IptablesとNetfilterアーキテクチャの詳細ソケットの理解、およびサーバーリソースを監視するためのTop、Netstat、Du、その他のツールの使用方法を学習してください。

Source:
https://www.digitalocean.com/community/tutorials/opening-a-port-on-linux