<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Netcat on Foam 的博客</title>
    <link>https://blog.foamzou.com/tags/netcat/</link>
    <description>Recent content in Netcat on Foam 的博客</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Mon, 11 May 2020 15:46:36 +0800</lastBuildDate>
    <atom:link href="https://blog.foamzou.com/tags/netcat/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>使用netcat能够做什么</title>
      <link>https://blog.foamzou.com/posts/what-can-netcat-do/</link>
      <pubDate>Mon, 11 May 2020 15:46:36 +0800</pubDate>
      <guid>https://blog.foamzou.com/posts/what-can-netcat-do/</guid>
      <description>&lt;h2 id=&#34;楔子&#34;&gt;楔子&lt;/h2&gt;
&lt;p&gt;[admonition] 今天朋友找我解决一个问题，他的java服务在阿里服务器里监听了某端口（使用的TCP），但通过公网无法连接。我尝试在本地telnet那个端口（跨公网），不通。在他服务器里telnet 127.0.0.1 端口，是通的。说明服务正常监听了端口。但由于我不熟悉他的java服务，无法判断该java服务是否只监听了本地回环地址。 因此公网无法访问大概有两种可能，一，java服务只监听了本地回环地址； 二、防火墙限制了端口 排除第二种情况对我来说比较简单，我通过netcat在服务器监听端口，然后在本地telnet，不通！说明问题的确出在防火墙身上。该服务器为Ubuntu，使用&lt;code&gt;ufw status&lt;/code&gt;查看防火墙状态，显示为&lt;code&gt;inactive&lt;/code&gt;，也就是关闭状态。再查看阿里云安全组规则，已经开放了tcp/udp的所有端口(-1/-1)。后面我再次执行&lt;code&gt;ufw disable&lt;/code&gt;，端口就通了。所以这是ufw的bug？ [/admonition] 引子有点长了。主要是为了说明，如果想知道与服务器之间的tcp连接是否通，可以使用netcat工具去判断。下面介绍下netcat ~&lt;/p&gt;
&lt;h2 id=&#34;netcat是什么&#34;&gt;netcat是什么&lt;/h2&gt;
&lt;p&gt;是一种计算机网络实用程序，用于使用TCP或UDP读写网络连接，号称 TCP/IP 的瑞士军刀。大家一般简写为&lt;code&gt;nc&lt;/code&gt;。总之，涉及到网络的事儿，它几乎都能做。为什么叫瑞士军刀，因为它体积很小，不同版本的nc可执行文件只有几十k到300多k，而且大部分linux发行版都有预安装。&lt;/p&gt;
&lt;h2 id=&#34;各种版本&#34;&gt;各种版本&lt;/h2&gt;
&lt;p&gt;netcat有许多版本，能力从弱到强为：GUN、BSD、Ncat。基础功能三者都一样，不同的是一些版本额外内置了些高级/有趣的功能（例如Ncat有个参数&lt;code&gt;--chat&lt;/code&gt;，可以创建匿名聊天室）。 大部分centos6内置的是BSD版本的nc，我的Centos7里边内置的nc是Ncat（属于nmap工具集里边） 使用&lt;code&gt;man nc&lt;/code&gt;，拉到最下边可以看到你的nc版本。（使用man你基本能够查阅所有的用法了，其它软件也是如此，只要是标准安装的） ps. socat号称是更为强大的nc，有兴趣的小伙伴可以自己去看看。&lt;/p&gt;
&lt;h2 id=&#34;用途&#34;&gt;用途&lt;/h2&gt;
&lt;h3 id=&#34;检查端口通不通&#34;&gt;检查端口通不通&lt;/h3&gt;
&lt;p&gt;以往我一直使用telnet来判断某个端口是否通，但telnet是基于tcp协议的，如果要判断udp端口就无能为力了。这时可以使用nc来判断。为了方便实验，本文统一使用同一台机器模拟服务端和客户端。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 咱们使用nc创建一个tcp协议监听的端口。-l为listen，默认协议为tcp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nc -l 8088
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 使用nc连上该端口。-v(verbose)用于显示更多信息，-z（zero I/O）表示不发送数据包，仅显示连接状态。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 下面succeed表示端口是通的
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nc -vz 127.0.0.1 8088
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Connection to 127.0.0.1 8088 port [tcp/radan-http] succeeded!
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 创建一个udp端口。-u指使用udp协议
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nc -lu 8088
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 同样，加一个u表示使用udp连接该端口，同时你会看到服务端打印出若干个X。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 不是说加了z参数就不会发数据包吗，为什么服务端收到了报文？我认为udp是无连接状态的，通过系统调用write
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 往该套接字发数据，通过返回值才知道包发出去没有，从而判断udp端口是否通
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nc -vzu 127.0.0.1 8088
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Connection to 127.0.0.1 8088 port [udp/radan-http] succeeded!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;端口扫描&#34;&gt;端口扫描&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 扫描tcp端口。-w(wait)指定连接超时时间，单位秒。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 连接成功的端口将作为标准输出
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nc -v -w3 -z 127.0.0.1 1-65535 | tee succeed_port.log
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 下面摘抄部分连接成功的端口
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; Connection to 127.0.0.1 22 port [tcp/ssh] succeeded!
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; Connection to 127.0.0.1 25 port [tcp/smtp] succeeded!
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; Connection to 127.0.0.1 80 port [tcp/http] succeeded!
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; Connection to 127.0.0.1 443 port [tcp/https] succeeded!
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; Connection to 127.0.0.1 1100 port [tcp/mctp] succeeded!
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; Connection to 127.0.0.1 1111 port [tcp/lmsocialserver]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; succeeded! Connection to 127.0.0.1 2255 port [tcp/vrtp]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; succeeded! Connection to 127.0.0.1 3001 port [tcp/*]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; succeeded! Connection to 127.0.0.1 3306 port [tcp/mysql]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; succeeded! Connection to 127.0.0.1 4300 port [tcp/corelccam] succeeded!
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; Connection to 127.0.0.1 4369 port [tcp/epmd] succeeded!
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; Connection to 127.0.0.1 5672 port [tcp/amqp] succeeded!
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; Connection to 127.0.0.1 6553 port [tcp/*] succeeded!
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 扫描udp端口。nc -v -zu 127.0.0.1 1-65535
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 以下为我本地扫描结果
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Connection to 127.0.0.1 636 port [udp/ldaps] succeeded!
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Connection to 127.0.0.1 35157 port [udp/*] succeeded!
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Connection to 127.0.0.1 54890 port [udp/*] succeeded!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;文件传输&#34;&gt;文件传输&lt;/h3&gt;
&lt;p&gt;归根到底都是创建一个tcp/udp连接，通过连接收发数据而已。所以，无论数据是ascii字符串，二进制文件都可以发送/接收。 为了加快传输速率/加密，你甚至还可以在发送之前对数据进行压缩/加密。 对于大文件，个人认为还是scp、rsync这类专业的工具靠谱。小文件可以试试这种方法，毕竟简单，不需要ssh认证。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
