理想的には、ほとんどのローカルネットワークは外界から保護されています。自宅にWebサーバーやNextcloudインスタンスなどのサービスをインストールしようとしたことがある場合は、実際の経験から、サービスはネットワーク内から簡単にアクセスできますが、世界中ではアクセスできないことをご存知でしょう。ウェブ。
これには技術的な理由とセキュリティ上の理由の両方がありますが、ローカルネットワーク内の何かへのアクセスを外部に開放したい場合があります。これは、インターネットからローカルネットワークにトラフィックを正しく安全にルーティングできる必要があることを意味します。この記事では、その方法を説明します。
最初に理解する必要があるのは、ローカルインターネットプロトコル(IP)アドレスとパブリックIPアドレスの違いです。現在、世界のほとんどは(まだ)IPv4と呼ばれるアドレス指定システムを使用しています。IPv4は、ネットワーク化された電子デバイスに割り当てるために使用できる番号のプールが限られていることで有名です。実際、世界にはIPv4アドレスよりも多くのネットワークデバイスがありますが、それでもIPv4は機能し続けます。これはローカルアドレスが原因で可能です。
世界中のすべてのローカルネットワークは同じを使用しています アドレスプール。たとえば、私のホームルーターのローカルIPアドレスは192.168.1.1です。そのうちの1つはおそらくホームルーターと同じ番号ですが、192.168.1.1に移動すると、 myに到達します。 あなたのではなく、ルーターのログイン画面 ルーターのログイン画面。これは、ホームルーターには実際には2つのアドレスがあります。1つはパブリックアドレス、もう1つはローカルアドレスです。パブリックルーターは、ローカルルーターがインターネットで検出されないように保護し、他の人の192.168.1.1と混同されないようにします。
実際、これがインターネットがインターネットと呼ばれる理由です。インターネットは、相互接続された、または自己完結型のネットワークの「Web」です。各ネットワークは、職場、自宅、学校、ビッグデータセンター、または「クラウド」自体のいずれであっても、接続されたホストの集合であり、ゲートウェイ(通常はルーター)と通信して、インターネットとローカルネットワーク、およびローカルネットワークからインターネットへ。
つまり、現在接続しているネットワークではないネットワーク上のコンピューターにアクセスしようとしている場合、そのコンピューターのローカルアドレスを知っていても意味がありません。 publicを知る必要があります リモートネットワークのゲートウェイのアドレス。そして、それだけではありません。また、そのゲートウェイを通過してリモートネットワークにアクセスするためのアクセス許可も必要です。
その他のLinuxリソース
- Linuxコマンドのチートシート
- 高度なLinuxコマンドのチートシート
- 無料のオンラインコース:RHELの技術概要
- Linuxネットワーキングのチートシート
- SELinuxチートシート
- Linuxの一般的なコマンドのチートシート
- Linuxコンテナとは何ですか?
- 最新のLinux記事
理想的には、今でもあなたの周りにファイアウォールがあります。あなたはそれらを見ません(うまくいけば)、しかしそれらはそこにあります。テクノロジーが進むにつれて、ファイアウォールには楽しい名前が付けられますが、実際には少し退屈です。ファイアウォールは単なるコンピュータサービス(「デーモン」とも呼ばれます)であり、ほとんどの電子デバイスのバックグラウンドで実行されるサブシステムです。たとえば、マウスやトラックパッドの動きをリッスンするデーモンなど、コンピュータ上で実行されているデーモンは多数あります。ファイアウォールは、特定の種類のネットワークトラフィックを受け入れるか拒否するようにプログラムされたデーモンです。
ファイアウォールは比較的小さなプログラムであるため、最新のほとんどのデバイスに組み込まれています。彼らはあなたの携帯電話、あなたのルーター、そしてあなたのコンピューターで動いています。ファイアウォールはネットワークプロトコルに基づいて設計されており、ネットワークを介して送信されるデータパケットがそれ自体に関する特定の情報をアナウンスする(または無視する)必要があることは、他のコンピューターと通信する仕様の一部です。ネットワークデータに含まれるものの1つは、ポートです。 番号。これは、ファイアウォールがトラフィックを受け入れたり拒否したりするときに使用する主要なものの1つです。
たとえば、WebサイトはWebサーバーでホストされます。 Webサイトを表示する場合、コンピューターは、Webホストのポート80宛てのトラフィックとして自身を識別するネットワークデータを送信します。 Webサーバーのファイアウォールは、ポート80宛ての着信トラフィックを受け入れるようにプログラムされているため、要求を受け入れます(そして、Webサーバーはそれに応じてWebページを送信します)。ただし、そのWebサーバーのポート22宛てのネットワークデータを(偶然または設計によって)送信した場合、ファイアウォールによって拒否される可能性があります(また、しばらくの間禁止される可能性があります)。
IPアドレスのように、ポートやファイアウォールは実際には物理的な世界に「存在」しないため、これは理解するのに奇妙な概念になる可能性があります。これらはソフトウェアで定義された概念です。コンピューターやルーターを開いてネットワークポートを物理的に検査したり、チップに印刷された番号を調べてIPアドレスを見つけたり、ファイアウォールを水中に置いて消したりすることはできません。しかし、これらの概念が存在することがわかったので、あるネットワークのあるコンピューターから別のネットワークの別のコンピューターに移動する際のハードルがわかりました。
今度はそれらの封鎖を回避する時が来ました。
自分のネットワークを制御していて、自分のファイアウォールを開いて自分のトラフィックをルーティングし、ネットワークへの外部トラフィックを許可しようとしていると仮定します。まず、ローカルIPアドレスとパブリックIPアドレスが必要です。
ローカルIPアドレスを見つけるには、ip
を使用できます Linuxでのaddressコマンド:
$ ip addr show | grep "inet "
inet 127.0.0.1/8 scope host lo
inet 192.168.1.6/27 brd 10.1.1.31 scope [...]
この例では、私のローカルIPアドレスは192.168.1.6です。もう1つのアドレス(127.0.0.1)は、コンピューターが内部から自分自身を参照するために使用する特別な「ループバック」アドレスです。
macOSでローカルIPアドレスを見つけるには、ifconfig
を使用できます。 :
$ ifconfig | grep "inet "
inet 127.0.0.1 netmask 0xff000000
inet 192.168.1.6 netmask 0xffffffe0 [...]
また、Windowsでは、ipconfig
を使用します :
$ ipconfig
icanhazip.comでルーターのパブリックIPアドレスを取得します。 Linuxでは、curlコマンドを使用してターミナルからこれを取得できます。
$ curl http://icanhazip.com
93.184.216.34
これらの番号は後で使えるように手元に置いておきます。
調整が必要な最初のデバイスはゲートウェイデバイスです。これは、大きな物理サーバーの場合もあれば、小さなルーターの場合もあります。いずれにせよ、ゲートウェイはほぼ確実にネットワークアドレス変換(NAT)を実行しています。これは、トラフィックを受け入れて宛先IPアドレスを変更するプロセスです。
外部Webサイトを表示するためにネットワークトラフィックを生成する場合、コンピュータには基本的に外界の知識がないため、コンピュータはそのトラフィックをローカルネットワークのゲートウェイに送信する必要があります。コンピュータが知る限り、インターネット全体は単なるネットワークルーター、192.168.1.1(またはルーターのアドレス)です。したがって、コンピュータはすべてをゲートウェイに送信します。トラフィックを調べて、実際にどこにあるかを判断するのは、ゲートウェイの仕事です。 に向かい、そのデータを実際のインターネットに転送します。ゲートウェイは応答を受信すると、着信データをコンピューターに転送します。
ゲートウェイがルーターの場合、コンピューターを外部に公開するには、コンピューターを表すためにルーターのポートを指定する必要があります。これにより、特定のポートへのトラフィックを受け入れ、そのすべてのトラフィックを直接コンピューターに転送するようにルーターが構成されます。使用するルーターのブランドに応じて、このプロセスは、ポートフォワーディングや仮想サーバー、場合によってはファイアウォール設定など、いくつかの異なる名前で行われます。
デバイスはそれぞれ異なるため、設定を調整するためにクリックする必要があるものを正確に伝える方法はありません。通常、Webブラウザを介してホームルーターにアクセスします。ルーターのアドレスはルーターの下部に印刷されている場合があり、192.168または10で始まります。
ルーターのアドレスに移動し、インターネットサービスを利用したときに提供された資格情報を使用してログインします。多くの場合、admin
と同じくらい簡単です。 数値のパスワードを使用します(このパスワードはルーターにも印刷される場合があります)。ログインがわからない場合は、インターネットプロバイダーに電話して、詳細を尋ねてください。
グラフィカルインターフェイスで、1つのポートの着信トラフィックをコンピューターのローカルIPアドレスのポート(通常は同じポートが最も簡単です)にリダイレクトします。この例では、ホームルーターのポート22(SSH接続に使用)宛ての着信トラフィックをデスクトップPCにリダイレクトします。
必要なポートをリダイレクトできます。たとえば、予備のコンピューターでWebサイトをホストしている場合、ルーターのポート80宛てのトラフィックをWebサイトホストのポート80にリダイレクトできます。
ゲートウェイが物理サーバーの場合、firewall-cmdを使用してトラフィックを転送できます。 リッチルールの使用 オプションで、サーバーに特定のアドレス(パブリックIP)と特定のポート(この例では、SSHに使用されるポートである22を使用)で着信要求をリッスンさせ、そのトラフィックをIPに転送することができます。ローカルネットワークのアドレスとポート(コンピューターのローカルアドレス)。
$ firewall-cmd --permanent --zone=public \
--add-rich-rule 'rule family="ipv4" destination address="93.184.216.34" forward-port port=22 protocol=tcp to-port=22 to-addr=192.168.1.6'
ほとんどのデバイスにはファイアウォールが備わっているため、ポートとトラフィックを転送した後でも、トラフィックがローカルコンピューターに到達できない場合があります。ローカルネットワーク内でもトラフィックをブロックするファイアウォールがある可能性があります。ファイアウォールはコンピュータを安全にするように設計されているため、ファイアウォールを完全に非アクティブ化する衝動に抵抗してください(トラブルシューティングを除く)。代わりに、トラフィックを選択的に許可できます。
パーソナルファイアウォールを変更するプロセスは、オペレーティングシステムによって異なります。
Linuxには、すでに多くのサービスが定義されています。利用可能なものを表示する:
$ sudo firewall-cmd --get-services
amanda-client amanda-k5-client bacula bacula-client
bgp bitcoin bitcoin-rpc ceph cfengine condor-collector
ctdb dhcp dhcpv6 dhcpv6-client dns elasticsearch
freeipa-ldaps ftp [...] ssh steam-streaming svdrp [...]
許可しようとしているサービスがリストされている場合は、ファイアウォールに追加できます:
$ sudo firewall-cmd --add-service ssh --permanent
サービスがリストにない場合は、手動で開きたいポートを追加できます:
$ sudo firewall-cmd --add-port 22/tcp --permanent
ファイアウォールでポートを開くことは、現在のゾーンに固有です。 。ファイアウォール、firewall-cmd、およびポートの詳細については、私の記事ファイアウォールでLinuxを強化するを参照してください。 、クイックリファレンスとしてファイアウォールのチートシートをダウンロードしてください。
この手順は、特定のポートでそのポート宛てのトラフィックが受け入れられるように、コンピューターでポートを開くことだけを目的としています。ゲートウェイですでにリダイレクトを行っているため、トラフィックをリダイレクトする必要はありません。
トラフィックをルーティングするためのゲートウェイとローカルネットワークを設定しました。これで、ネットワーク外の誰かが特定のポート宛てのパブリックIPアドレスに移動すると、同じポート上のコンピューターにリダイレクトされます。ネットワークを監視および保護するのはあなた次第ですので、新しい知識を慎重に使用してください。開いているポートが多すぎると、悪意のある攻撃者やボットへの招待状のように見える可能性があるため、使用する予定のポートのみを開いてください。そして何よりも、楽しんでください!