Linuxのサーバーとネットワークに関する世界観1(コマンド)です。Linuxネットワーク2(設定)やLinuxネットワーク設定A(sysconfig)やLinuxネットワーク設定B(ifupdown)やネットワークの世界観も参照してください。
Web関連の項目はWebの世界やWebサーバーに分割しました。
自分の書いたブログ「神々とともに生きる詩人」2021/01/14より。
UNIXでは、伝統的にネットワーク色が強い。
たとえば大学のワークステーションでは、telnetによるネットワークに繋がった別ホストへの接続や、NFSを使ったネットワーク上のファイルシステムのマウント、NISによるネットワーク上のログイン情報の共通化などが、DOSに比べて簡単にできる。
この時、MIPSやAlphaなど、CPUアーキテクチャが異なるホストでも、基本的に構わない。
ただし、異なるアーキテクチャのバイナリは別マシンでは当然ながら動かないことに注意。
LinuxのようなUNIX系のOSはこのように、ネットワークでさまざまなマシンが繋がった時に、真価を発揮する。
移植性も参照のこと。
自分の書いたブログ「神々とともに生きる詩人」2021/01/27より。
Linuxでは、traceroute, route, netstat, ifconfig, arp, nslookupなどのコマンドで、ネットワーク関連の操作を行うが、これらのコマンドの多くは型遅れとなっており、現在はiproute2パッケージを代わりに使う。
また、ifconfigなどのコマンドは低レベルで強力だが使いづらいため、より上の高レベルな設定システム、たとえばDebianであればifupdownを用いて設定を行うことがデフォルトとなっている。
自分の書いたブログ「神々とともに生きる詩人」2021/01/27より。
Linux上におけるほかのネットワークプログラムとしては、リモートによる接続やリモートログインを行う、telnetやrlogin, sshのようなプログラムや、ネットワーク上でログイン情報を共通化するNIS/YP、ネットワーク上のファイルシステムをローカルにあるのと同じようにマウントできるNFSなどがある。
NFS以外のネットワークファイルシステムに準ずるシステムとしては、サーバとの間でファイル転送を行うFTPや、Windowsネットワークを実装したSambaなどがある。
IPアドレスには、送信元のIPアドレス、受信先のIPアドレスがあり、パケットのIPアドレスに対応する。
パケットはIPアドレスを付与して送信され、ルーター間を転送しながら相手にたどり着く。
ひとつひとつのルーターの接続経路はtraceroute/tracertコマンドで一覧表示できる。
routeコマンドはルーターのルーティングテーブルを表示・設定するコマンド。
パケットは暗号化されていないと簡単に他人から傍受することができる。HTTPにおいて接続を暗号化するためには、https接続(SSL/TLS暗号化)を利用する。
現在の自分が実行しているネットワーク接続の一覧はnetstatコマンドで表示できる。IPやTCP/UDPの各パケットの統計情報などもnetstatで調べることができる。
IPアドレスは従来の32bitのIP v4の他に、よりビット数を増やし多くの機器にアドレスを付与することのできる128bitのIP v6がある。
最近では、通信経路の匿名化技術であるTorプロジェクトなどが開発されている。
nslookupはDNSサーバに名前解決を問い合わせるコマンド。
arpはイーサネットにおけるIPアドレスとMACアドレスの対照表であるARPテーブルを表示・設定するコマンド。
UNIXやWinSockでは、ソケットAPIを用いて、プログラムとプログラムの間でネットワーク接続と通信を簡単に行える。
ソケットはBSD UNIXで採用されたTCP/UDPの接続API。ファイルシステムと同じように使うことができ、互いに関連性を持った状態で片方にデータを書き込むともう片方からデータを読み込むことができる。ソケットにはファイルと同じようにファイルディスクリプタ(読み書きしているストリームを識別する番号)が割り当てられ、ファイルと同様に扱われる。
ソケットは通常サーバー・クライアントで、ひとつの公開サーバーに対して複数のクライアントが接続する形で接続が行われる。P2Pと呼ばれる、中央サーバーが無くピアとピアが直接接続されるネットワーク方式もある。
サーバーは通常マルチスレッドでデーモンとして実装される。デーモンはUNIXにおけるシステムに常に常駐するプログラムのことで、コマンドとは異なり、システムで常にサービスを提供する。
インターネットにサーバーを公開し、外部のネットワークからアクセスするためには、「ポート」と呼ばれるアプリケーション番号を外部に「開ける」必要がある。HTTPの場合はポート80番をルーターやファイアーウォールの設定で開ける必要がある。
HTTPデーモンを起動し、ポート80番を開ければ、クライアントのWebブラウザから、Webサーバーのコンテンツを閲覧することができる。
また、「www.hogehoge.com」といった独自のURLでコンテンツを表示したければ、独自ドメインを取ることが必要となる。
DHCPを用いてルーターが自動的にIPアドレスを各コンピュータに割り振っている場合、各コンピュータのIPアドレスが動的に変わってしまうことがある。これはサーバーを公開する上では問題となる。ダイナミックDNSを使うことで、IPアドレスが変わっても自動でDNSサーバーに通知し、固有のホスト名を持つことができる。
自宅サーバーを管理・運営する場合、システムのセキュリティなどがきちんとしていなければウイルスにかかったり踏み台(乗っ取られてウイルスを他のサーバーに感染させたり、ウイルス入りのメールを不特定多数に送りつけたりする中継地点のサーバー)にされたりする危険性がある。また、掲示板を運用するのであればきちんと運営しなければ犯罪予告や誹謗中傷などの書き込みがされることもある。そのため、安易にサーバーを立てることは好ましくない。自身もウイルスにかからないように気をつけながら、悪意ある利用者が侵入することができないように、セキュリティの専門家と一緒にサーバーを管理することが必要である。
ソケットはUNIXにおけるファイルAPI(open(), write(), read(), close())と同様のネットワーク通信の実装である。
TCP/IPの下位プロトコル(トランスポート層、UDP/TCP)の通信が行える。
基本は、複数のソケットが互いに関係を持つと有効になる。一方に書き込むともう一方から出てくる。そのため、ハードウェアやシステム的なことを考えなくても、ファイルのAPIと同様に簡単にネットワーク通信が出来る。
BSD系UNIXを起源とするAPIであり、そのためこのソケットのAPIは「BSD socket」などと呼ばれる。
ソケットはファイルとして扱われる。そのため、通常のファイルと同じように、ファイルディスクリプタからストリームとして読み書きできる。
Linux カーネル(ソケット)も参照のこと。
ソケットプログラミングの実例は以下のようなページが参考になる。
ifconfigを参照のこと。
netstatを参照のこと。
routeを参照のこと。
iproute2を参照のこと。
モニタリングを参照のこと。
さまざまなネットワーク系コマンドを参照のこと。
curlを参照のこと。
Linuxネットワーク(2.設定)を参照のこと。
DNSサーバも参照のこと。
NISも参照のこと。
WinSockも参照のこと。
英語がスラスラ読めるありえないあなたには以下がお勧め。
そう、英語が読めないから僕らは苦労するんだよ…(トボトボ)。
僕が思うに、ネットワーク系のコマンドを使いこなせることは、ネットワークプログラミングを始めるにあたってとても有効です。
コマンドでできることは、コードを記述してできることと変わりません。ネットワーク系のコマンドが使えることで、ソケットAPIやHTTPリクエストなどを用いたネットワークプログラミングができるようになります。
Linux/UNIXでのネットワークプログラミング。