<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: kei</title>
    <description>The latest articles on DEV Community by kei (@keikmobile).</description>
    <link>https://dev.to/keikmobile</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F108204%2Fa8bfb540-504f-4a2b-b6ea-d2246eef537d.png</url>
      <title>DEV Community: kei</title>
      <link>https://dev.to/keikmobile</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/keikmobile"/>
    <language>en</language>
    <item>
      <title>How to see TCP connection establishment with tcpdump</title>
      <dc:creator>kei</dc:creator>
      <pubDate>Sun, 16 Feb 2020 10:24:03 +0000</pubDate>
      <link>https://dev.to/keikmobile/how-to-see-tcp-connection-establishment-with-tcpdump-2n23</link>
      <guid>https://dev.to/keikmobile/how-to-see-tcp-connection-establishment-with-tcpdump-2n23</guid>
      <description>&lt;p&gt;This post describes how to see TCP connection establishment and termination as packets using tcpdump on linux.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparing
&lt;/h2&gt;

&lt;p&gt;Install following commands on your linux.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tcpdump&lt;/li&gt;
&lt;li&gt;nc&lt;/li&gt;
&lt;li&gt;telnet&lt;/li&gt;
&lt;li&gt;netstat&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  See TCP connection establishment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. start TCP server
&lt;/h3&gt;

&lt;p&gt;Start TCP server using nc command with l,k option.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ nc -lk 12345
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Open another terminal and verify 12345 port is listening using netstat command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ netstat -anp | grep 12345
tcp  0  0  0.0.0.0:12345  0.0.0.0:*  LISTEN  &amp;lt;PID&amp;gt;/nc             
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  2. start TCP client and establish connection
&lt;/h3&gt;

&lt;p&gt;Start TCP client using telnet to establish TCP connection with TCP server of step 1.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ telnet 127.0.0.1 12345
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Open another terminal and verify nc process and telnet are establishing connection using netstat command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ netstat -anp | grep 12345
tcp  0  0 0.0.0.0:12345     0.0.0.0:*        LISTEN      &amp;lt;PID&amp;gt;/nc
tcp  0  0 127.0.0.1:&amp;lt;port&amp;gt;  127.0.0.1:12345  ESTABLISHED &amp;lt;PID&amp;gt;/telnet
tcp  0  0 127.0.0.1:12345   127.0.0.1:&amp;lt;port&amp;gt; ESTABLISHED &amp;lt;PID&amp;gt;/nc 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Terminate TCP client with type "Ctrl+[" and "quit" on telnet. Then Connection is close.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ telnet 127.0.0.1 12345
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
^]
telnet&amp;gt; quit
Connection closed.
$ 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;It's ready to see TCP connection establishment with tcpdump.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. See TCP 3-Way Handshake as TCP connection establishment
&lt;/h3&gt;

&lt;p&gt;Verify TCP server that start at step 1 listen 12345 port.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ netstat -anp | grep 12345
tcp  0  0  0.0.0.0:12345  0.0.0.0:*  LISTEN  &amp;lt;PID&amp;gt;/nc             
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Perform tcpdump with specify local interface and port 12345 as follows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo tcpdump -i lo -nnn port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 65535 bytes
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Start TCP client using telnet to establish TCP connection with TCP server of step 1.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ telnet 127.0.0.1 12345
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Verify tcpdump output as follows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HH:mm:ss.SSSSSS IP 127.0.0.1.&amp;lt;port&amp;gt; &amp;gt; 127.0.0.1.12345:  Flags [S], seq ...
HH:mm:ss.SSSSSS IP 127.0.0.1.12345  &amp;gt; 127.0.0.1.&amp;lt;port&amp;gt;: Flags [S.], seq ...
HH:mm:ss.SSSSSS IP 127.0.0.1.&amp;lt;port&amp;gt; &amp;gt; 127.0.0.1.12345:  Flags [.], ack ...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The format is as follows&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;timestamp IP source IP.port destination &amp;gt; IP.port: flags
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;First line means a SYN packet as "[S]" flag that telnet sent to TCP server.&lt;br&gt;
Second line means SYN + ACK packet as "[S.]" flag that TCP server sent to telnet.&lt;br&gt;
Third line means ACK packet as "[.]" flag that TCP server sent to telnet.&lt;/p&gt;

&lt;p&gt;Open another terminal and verify nc process and telnet are establishing connection using netstat command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ netstat -anp | grep 12345
tcp  0  0 0.0.0.0:12345     0.0.0.0:*        LISTEN      &amp;lt;PID&amp;gt;/nc
tcp  0  0 127.0.0.1:&amp;lt;port&amp;gt;  127.0.0.1:12345  ESTABLISHED &amp;lt;PID&amp;gt;/telnet
tcp  0  0 127.0.0.1:12345   127.0.0.1:&amp;lt;port&amp;gt; ESTABLISHED &amp;lt;PID&amp;gt;/nc 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  3. See terminate TCP connection establishment
&lt;/h3&gt;

&lt;p&gt;Keep tcpdump, and terminate TCP client with type "Ctrl+[" and "quit" on telnet. Then Connection is close.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ telnet 127.0.0.1 12345
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
^]
telnet&amp;gt; quit
Connection closed.
$ 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Verify tcpdump output as follows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HH:mm:ss.SSSSSS IP 127.0.0.1.&amp;lt;port&amp;gt; &amp;gt; 127.0.0.1.12345:  Flags [F.], seq 1,
HH:mm:ss.SSSSSS IP 127.0.0.1.12345  &amp;gt; 127.0.0.1.&amp;lt;port&amp;gt;: Flags [F.], seq 1,
HH:mm:ss.SSSSSS IP 127.0.0.1.&amp;lt;port&amp;gt; &amp;gt; 127.0.0.1.12345:  Flags [.], ack 2,
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;First line means a FIN packet as "[F]" flag that telnet sent to TCP server.&lt;br&gt;
Second line means FIN + ACK packet as "[F.]" flag that TCP server sent to telnet.&lt;br&gt;
Third line means ACK packet as "[.]" flag that TCP server sent to telnet.&lt;/p&gt;

&lt;p&gt;Open another terminal and verify nc process only.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ netstat -anp | grep 12345
tcp  0  0 0.0.0.0:12345     0.0.0.0:*        LISTEN      &amp;lt;PID&amp;gt;/nc

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



</description>
      <category>tcp</category>
      <category>tcpdump</category>
    </item>
  </channel>
</rss>
