OpenBSD 6.1で見られるもの:
fstat | grep internet
私のopenbsdサーバー(192.168.102.128)で実行すると、次の結果が表示されます。
jrx sshd 87949 3* internet stream tcp 0x0 192.168.102.128:22 <-- 192.168.102.67:63857
root sshd 69801 3* internet stream tcp 0x0 192.168.102.128:22 <-- 192.168.102.67:63857
_smtpd smtpd 26906 8* internet6 stream tcp 0x0 [::1]:25
_smtpd smtpd 26906 9* internet6 stream tcp 0x0 [fe80::1%lo0]:25
_smtpd smtpd 26906 10* internet stream tcp 0x0 127.0.0.1:25
root sshd 20185 3* internet stream tcp 0x0 *:22
root sshd 20185 4* internet6 stream tcp 0x0 *:22
_syslogd syslogd 13823 4* internet dgram udp *:514
_syslogd syslogd 13823 5* internet6 dgram udp *:514
_dhcp dhclient 62845 3* internet dgram udp *:0
_dhcp dhclient 62845 9* internet raw ip 0x0
root dhclient 90416 3* internet dgram udp *:0
私のアカウントjrxを使用してホスト192.168.102.67にSSH接続があるので、最初の行を理解します。
しかし、2行目のルートアカウントが同じソケットと同じクライアントポートでsshd(プロセス69801)を実行するのはなぜですか?
これはクライアント側のSSHクライアントの特別な構成ですか? (クライアント側ではパテを使用します)
編集する:存在する絶対OpenBSD第2版、2つではなく1つの接続線のみが表示されます。
答え1
これが私が期待していたものです。特権ポートでリッスンするには、プロセスをroot権限で実行する必要があります。ただし、ユーザーが接続されたら、接続するユーザーの権限でプロセスを実行したいと思います。サーバープロセスが単に権限を放棄すると、他のユーザーからの要求を処理できません。サーバーが同時に複数の接続を処理する必要があるという問題もあります。したがって、ルートとして実行されているサーバーは、ユーザーが接続するまでソケットでリッスンし、別の要求を処理し、正しい権限レベルで実行できるようにフォークして2つのインスタンスを作成します。あるインスタンスは再接続リスニング状態に戻り、もう一方のインスタンスは権限の低いユーザーに切り替えられます。どちらもソケット接続を参照するハンドルのコピーを持っています。
もし誰でもプロセスがソケットを閉じると、同じファイルで通信する2つのプロセスとは異なり、接続が切断されます。