私はTCP 3ウェイハンドシェイクにどのLinuxサービス/プロセスが関連しているかを理解しようとしています。たとえば、誰が拒否フラグ[R.]と一緒にSYN要求を送信します。
例:ポート8088が受信中で、8089が開いています。両方のポートで接続要求を発行した後、tcpdumpの出力は次のようになります。
8089の場合:
$ sudo tcpdump -i any -nn port 8088 or port 8089
04:23:12.260621 IP 192.168.112.129.52298 > 192.168.112.129.8089: Flags [S], seq 300539809, win 43690, options [mss 65495,sackOK,TS val 19840756 ecr 0,nop,wscale 7], length 0
04:23:12.260637 IP 192.168.112.129.8089 > 192.168.112.129.52298: Flags [R.], seq 0, ack 300539810, win 0, length 0
8088の場合:
$ sudo tcpdump -i any -nn port 8088 or port 8089
04:23:21.680070 IP 192.168.112.129.42814 > 192.168.112.129.8088: Flags [S], seq 670408355, win 43690, options [mss 65495,sackOK,TS val 19850176 ecr 0,nop,wscale 7], length 0
04:23:21.680087 IP 192.168.112.129.8088 > 192.168.112.129.42814: Flags [S.], seq 1185731197, ack 670408356, win 43690, options [mss 65495,sackOK,TS val 19850176 ecr 19850176,nop,wscale 7], length 0
04:23:21.680098 IP 192.168.112.129.42814 > 192.168.112.129.8088: Flags [.], ack 1, win 342, options [nop,nop,TS val 19850176 ecr 19850176], length 0
それでは、ここで[R.] 8089と[S.] SYN-ACK 8088を送信するLinuxサービスは何ですか?また、パケットが受信機にどのように到達し、トラフィック量はどのくらいですか? 8089でパケットをドロップするためにファイアウォールルール(iptablesを使用)を追加するときのプロセスは何ですか?
よろしくお願いします:)
答え1
TCP パケットのフラグは、サービスおよびプロセスで直接管理されません。
socket()
通常、開発者は標準のPOSIXインターフェースを使用してネットワーク機能(、、、connect()
などlisten()
)bind()
を開発します。accept()
Linuxカーネルは、これらの呼び出しのデフォルトの受信者です。
リソースはサービスに割り当てられ(
socket()
たとえば、呼び出し時に)、リソースがすでに使用されている場合(たとえば、すでにbind()
使用されているアドレス/ポートペアを使用)、呼び出しプロセスに適切なエラーが返されます。実際のTCPスタックコンテンツ(開発者が呼び出すときに3ウェイハンドシェイクなど)を管理する
connect()
か、要求されたアドレス/ポートペアにバインドされたサービスがない場合(またはサービスが接続を拒否した場合)、RSTを返します。外部からパケットを受信し、その内容を適切なプロセス(アドレス/ポートで完了したか、実際に呼び出されているか、
bind()
問題のソケットにあるプロセス)に転送します。connect()
recv()
read()
プロセスに入る前にネットワークトラフィックが許可されていることを確認するためにファイアウォールがトリガされます。したがって、TCP/8000 を受信するサービスがあっても、ファイアウォールがそのサービスへの接続を許可しない場合、次の結果が発生します。
- Aiptables
RST
ポリシーまたはルールがREJECT
。 - iptablesポリシーまたはルールが実行されるとタイムアウトが発生します
IGNORE
。