使用netcat能够做什么

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

2020-05-11 · 2 分钟 · 283 字

centos6升级python到2.7版本

有些软件需要安装python2.7,但centos6默认安装的是2.6版本。但yum依赖2.6,所以不能覆盖安装。需要保留两者 编译安装python2.7 wget https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tgz tar xvf Python-2.7.14.tgz sudo mkdir /usr/local/python2.7 cd Python-2.7.14 ./configure --prefix=/usr/local/python2.7 --enable-shared make sudo make install 验证 cd /usr/local/python2.7/bin ./python 报错: ./python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory 将python2.7的动态链接库加入到系统会读取的配置中 sudo vim /etc/ld.so.conf # 在该配置文件追加一行:/usr/local/python2.7/lib sudo ldconfig 备份原有的python which python # /usr/bin/python [myhost tmp]$ md5sum /usr/bin/python /usr/bin/python2.6 8505ca7b24f60f8dca8d6d2622ed0563 /usr/bin/python 8505ca7b24f60f8dca8d6d2622ed0563 /usr/bin/python2.6 # 发现已经有python2.6,且与python的md5一致,那就不用备份直接删除了 sudo rm /usr/bin/python 编辑yum的执行程序 sudo vim /usr/bin/yum # 将#!/usr/bin/python 中的python改为python2.6 # 即 #!/usr/bin/python2.6 执行yum验证下,没有报错就ok了 ...

2019-04-09 · 1 分钟 · 143 字

用lockf保证同一时间只有一个进程运行

安装 参见github 使用场景 保证同一时间只有一个进程运行。 例如 crontab 设定每分钟跑一次 1.php ,但如果超过1分钟该脚本还没执行完,就会出现多个php脚本同时运行的情况,在某些场景下可能会有问题。 为了满足上述需求,我们可能会在脚本里添加一段代码,创建锁,执行完后删除锁,若锁文件存在则直接return。 还有另一种解决方案就是用 lockf 使用例子: lockf -s -t 0 /tmp/xx.lock /usr/local/bin/php -f 1.php

2019-02-25 · 1 分钟 · 21 字

给你的Mac/Linux的rm装一个回收站

作为程序员,在工作中经常用到rm。我在不久前用vscode写代码,在底下的终端里想删掉没用的文件,手抖把未提交到git的代码文件删了。还好代码量不多,否则会崩溃。毕竟重写代码是很痛苦的~ 因此本文标题提上了日程 选择一款安全的删除脚本 Github看到一个脚本满足需求。 github地址,里边有多种安装方式。我选择的是npm全局安装。 npm i -g safe-rm 安装后,safe-rm命令就可以用了~ 将安装好的脚本设置为rm的别名 vim编辑~/.bash_profile(或其他bash启动时会执行的文件)。添加 alias rm='safe-rm' 由于我使用了fish-shell,因此还需要在fish启动时会执行的config文件里添加别名:vim编辑~/.config/fish/config.fish。添加 alias rm='safe-rm' Done 添加完之后别忘了重新打开终端窗口哦(或者source刚刚的配置文件)。至此,rm后文件的被mv到~/.Trash。即使是重名的文件也会在文件尾添加时间后缀,保证文件不被覆盖。

2018-10-09 · 1 分钟 · 19 字

mysql命令行神器mycli

为什么使用它 受够了mysql原生client后,你会爱上mycli的自动补全和高亮。对于我这种常常记不住表结构的人来说,自动补全真是爽得不行。 ps:sql新手谨慎使用,建议多裸写sql后再来使用该软件 安装 Mac brew install mycli CentOS # 请尽量先将pip升级到最新版本 pip install --upgrade pip yum install python-devel yum install libffi-devel easy_install mycli 使用方法 和mysql原生命令行一样: mycli -uname

2018-04-22 · 1 分钟 · 27 字

Squid使用SSLBump正向代理

背景:最近需要使用nodeJs访问一个历史久远的网站,那个网站的服务器证书是错误的,且使用的协议是TLSv1.0。浏览器上不得不使用IE并关闭各种安全设置和设置为兼容模式才能正常访问。Nodejs的新版本已经不支持这种不安全的协议,所以需要搭建一个代理服务进行访问。刚开始使用的是mitmproxy ,当时的最新版本对于SSL错误会报错,所以将源码中校验部分去掉就可以正常使用了。但部署到生产环境,会出现cpu占用过高的情况。所以后面换了Squid。 部署Squid参考了一篇文章,原文:here,下面是简单翻译。 Squid是个很强大的Web代理,它可以应用于无线认证、重定向、用户身份验证、日志记录等。但其在SSL方面一直存在局限性。在3.2版本之前,Squid的策略只是简单地传递SSL加密流量,因为它无法校验受信任的SSL链接。对于每个SSL连接也无法给用户做预警。但3.5版本后允许更多的控制,但要注意仍然无法校验受信任的SSL链接。 这里不会过多地介绍使用SSL Bump配置Squid以外的知识,对于编译和配置squid的细节你最好看下官方文档。 如果通过代理自动监测,通知浏览器连接到代理服务器,这样是挺简单的。但有些用户可能会试图规避这一点,并尝试直接连接。 在这种情况下,我们需要强制这些用户通过截取流量来使用代理。SSL Bumping的前提是中间人攻击,但由于这是在您的用户清楚所有流量都是检查过的环境中完成的,因此这并不是真正的攻击,这只是一种策略。Squid用于执行SSL Bumping有一些新方法,但是我会总结出最具实战性的方法:Squid收到一个https请求,然后为用户建立安全连接。 远程连接建立后,Squid会重新加密所有流量; 这时候的加密使用的是本地私钥,以及本地证书颁发机构即时创建出来的证书。 所以我们首先要确保的是你已经安装了3.5或更高版本的Squid。尽管3.2,3.3以及3.4版本也能实现,但3.5版本后SSL Bump的指令有了些显著变化。另外,编译Squid时需要带上‘–with-openssl’参数。 在CentOS我使用以下参数来编译Squid(foam:我带上–enable-ipf-transparent参数会报错,所以我是去掉再编译的) ./configure \ --prefix=/usr \ --exec-prefix=/usr \ --includedir=/usr/include \ --datadir=/usr/share \ --libdir=/usr/lib64 \ --libexecdir=/usr/lib64/squid \ --localstatedir=/var \ --sysconfdir=/etc/squid \ --sharedstatedir=/var/lib \ --with-logdir=/var/log/squid \ --with-pidfile=/var/run/squid.pid \ --with-default-user=squid \ --enable-silent-rules \ --enable-dependency-tracking \ --with-openssl \ --enable-icmp \ --enable-delay-pools \ --enable-useragent-log \ --enable-esi \ --enable-follow-x-forwarded-for \ --enable-ipf-transparent \ --enable-auth 接下来我们需要生成本地的SSL证书,这里我使用的是简单的命令,没有在意怎么去加密。 # Generate Private Key openssl genrsa -out example.com.private 2048 然后是创建Certificate Signing Request(CSR),即证书注册请求。 ...

2017-09-23 · 3 分钟 · 630 字

在Linux下编译php扩展

在windows下我们需要开启某个扩展,很容易。一般情况下,dll文件都已经安静地躺在extension目录下,只等待你在php.ini里将它前面的;去掉。 而在linux,你cd到php的extensions目录往往发现里面空空的。或许只有几个so文件落寞地待着。 这里以编译fileinfo扩展为例(注意这是php内置的扩展,如果你编译的是第三方扩展请自行到官网下载源码) 一、找到扩展包 你需要到PHP源码包里寻找,希望源码包没被你删除。 cd到php-5.x.x/ext/目录,你会发现里面有很多内置的扩展 我们cd到fileinfo目录 二、编译 phpize ./configure --with-php-config=/usr/local/php/bin/php-config make && make install 上面的命令很好理解,首先是执行phpize,它是用来安装php扩展的工具,如果你的系统无法识别,请使用完整路径。比如/usr/local/php/bin/phpize 。这个工具会在当前目录下生成configure文件。 接着就是编译的三板斧啦~其中with-php-config参数请按照你实际情况填写 没有意外的话,经过上面的编译,你会在php/lib/php/extensions/(在php.ini的extension_dir可找到, 或者 php -i | grep exten)目录下找到生成的fileinfo.so文件 三、添加配置 最后只需要在php.ini里把扩展添加进去就好了 extension = "fileinfo.so" 最后别忘了reload php-fpm

2015-08-09 · 1 分钟 · 32 字

lnmp、lamp、lnmpa一键安装包

最近在DO买了个VPS。这个安装包不错,不需要重复造轮子,可以专心做自己的事了。 注:本文转自Linux运维笔记 这个脚本是使用shell编写,为了快速在生产环境上部署LNMP/LAMP/LANMP(Linux、Nginx/Tengine、MySQL /MariaDB/Percona、PHP),适用于CentOS/Redhat 5+、Debain 6+和Ubuntu 12+ 脚本特性: 持续不断更新 源码编译安装,大多数源码是最新stable版,并从官方网址下载 一些安全优化 提供多个数据库版本(MySQL-5.6, MySQL-5.5, MariaDB-10.0, MariaDB-5.5, Percona-5.6, Percona-5.5) 提供多个PHP版本(php-5.3, php-5.4, php-5.5,php-5.6,php-7/phpng(alpha)) 提供Nginx、Tengine 提供多个Apache版本(Apache-2.4,Apache-2.2) 根据自己需求安装PHP缓存加速器,提供ZendOPcache、xcache、apcu、eAccelerator、ionCube和ZendGuardLoader(php-5.4、php-5.3 PHP源码加密) 根据自己需求安装Pureftpd、phpMyAdmin 根据自己需求安装memcached、redis 根据自己需求可使用tcmalloc或者jemalloc优化MySQL、Nginx 提供添加虚拟主机脚本 提供Nginx/Tengine、PHP、Redis、phpMyAdmin升级脚本 提供本地备份和远程备份(服务器之间rsync)脚本 提供CentOS 6/7下HHVM安装**#news** Github地址:https://github.com/lj2007331/lnmp LNMP问题反馈论坛:http://bbs.linuxeye.com LNMP最新源码一键安装脚本问题反馈请加QQ群: 235258658 安装步骤: yum -y install wget screen #for CentOS/Redhat #apt-get -y install wget screen # for Debian/Ubuntu wget http://linuxeye.oss-cn-hangzhou-internal.aliyuncs.com/lnmp/lnmp-full.tar.gz #阿里云内网下载地址(包含源码) wget http://mirrors.linuxeye.com/lnmp-full.tar.gz # 国内下载地址(包含源码) wget http://downloads.linuxeye.com/lnmp-full.tar.gz # 美国下载地址(包含源码) wget http://downloads.linuxeye.com/lnmp.tar.gz # 仅脚本源码,建议国外主机下载此包,源码包从官方站点下载 tar xzf lnmp-full.tar.gz #tar xzf lnmp.tar.gz cd lnmp # 如果需要修改目录(安装、数据存储、Nginx日志),请修改options.conf文件 screen -S lnmp # 如果网路出现中断,可以执行命令`screen -r lnmp`重新连接安装窗口 ./install.sh # 请勿sh install.sh或者bash install.sh这样执行 添加虚拟主机**:** ...

2015-03-21 · 1 分钟 · 181 字

给不同域名配置不同虚拟站点

有时候为了区分业务,给不同二级域名配置不同的站点也是很不错的。 以下配置的环境是:CentOS + Apache 首先在 httpd/conf/httpd.conf, 将其中的 ServerAdmin ServerName DocumentRoot 注释掉。 其中看到有一行是: Include conf.d/*.conf 既然已经包含了所有conf文件,那我就直接开干了。 以下是apache配置目录下的文件,很清楚地看到没有vhosts.conf之类的文件,那么我们自己在conf.d目录下创建 [root@foam conf.d]# tree /etc/httpd/ -L 3 /etc/httpd/ |-- conf | |-- httpd.conf | |-- httpd.conf.bak.2014.12.10 | |-- httpd.conf.bak.2014.12.2 | |-- httpd.conf.rpmsave | `-- magic |-- conf.d | |-- README | |-- php.conf | `-- welcome.conf |-- logs -> ../../var/log/httpd |-- modules -> ../../usr/lib64/httpd/modules `-- run -> ../../var/run/httpd 5 directories, 8 files vhosts.conf文件内容如下: NameVirtualHost *:80 #这行我一开始漏掉了,导致访问的一直是第一个虚拟站点,很郁闷啊。 <VirtualHost *:80> ServerAdmin #管理员账号,如 root@localhost DocumentRoot #该主机的目录,如 /var/www/html ServerName #域名1,如 zoufeng.me ServerAlias #别名(可选),如 www.zoufeng.me ErrorLog "logs/域名1-error.log" CustomLog "logs/域名1-access.log" combined <Directory "/var/www/html"> order allow,deny allow from all </Directory> </VirtualHost> <VirtualHost *:80> ServerAdmin #管理员账号,如 root@localhost DocumentRoot #该主机的目录,如 /var/www/html2 ServerName #域名2,如 m.zoufeng.me ServerAlias #别名(可选) ErrorLog "logs/域名2-error.log" CustomLog "logs/域名2-access.log" combined <Directory "/var/www/html"> order allow,deny allow from all </Directory> </VirtualHost> 编辑后,重启apache服务 ...

2014-12-10 · 1 分钟 · 142 字

搭建LAMP

首先检查我的CentOS6是否预装apache [root@foam /]# rpm -qa | grep httpd httpd-tools-2.2.15-29.el6.centos.x86_64 httpd-2.2.15-29.el6.centos.x86_64 果然是安装了的,那么先卸载它。 [root@foam /]# rpm -e httpd warning: /etc/httpd/conf/httpd.conf saved as /etc/httpd/conf/httpd.conf.rpmsave 出来个警告,但是不影响卸载。一、安装Apache1. yum install httpd 2. [root@foam init.d]# /etc/init.d/httpd start Starting httpd: httpd: Could not reliably determine the server’s fully qualified domain name, using 23.245.26.38 for ServerName [ OK ] 没找到domain name,使用ip地址做为server name。 设置Domain [root@foam init.d]# cd /etc/httpd/conf [root@foam conf]# vim httpd.conf 找到ServerName。将前面的#去掉 ServerName zoufeng.com:80 :wq 保存 [root@foam conf]# chkconfig httpd on #设为开机启动 [root@foam conf]# /etc/init.d/httpd restart #重启Apache Stopping httpd: [ OK ] Starting httpd: [ OK ] ps:安装并启动apache后,浏览器输入IP,可以访问了。二、安装Mysql1.安装 [root@foam conf]# yum install mysql mysql-server btw:下载速率有8.0M/s [root@foam ~]# /etc/init.d/mysqld start #启动 Initializing MySQL database: Installing MySQL system tables… OK Filling help tables… OK [root@foam ~]# chkconfig mysqld on #设置为开机启动 [root@foam ~]# cp /usr/share/mysql/my-medium.cnf /etc/my.cnf cp: overwrite `/etc/my.cnf’? #可以覆盖它 2.设置密码 [root@foam /]# mysql_secure_installation 提示需要输入密码 Enter current password for root (enter for none): (默认是空,直接enter即可) Set root password? [Y/n] 接下来输入两次新密码即可 提示是否把匿名用户删除 Remove anonymous users? [Y/n] y … Success! 提示是否不允许root远程登录(安全起见,不允许) Disallow root login remotely? [Y/n] y … Success! 后面还有两个询问,默认Y就可以。 重启Mysql [root@foam ~]# /etc/init.d/mysqld restart Stopping mysqld: [ OK ] Starting mysqld: [ OK ]三、安装PHP51.安装 [root@foam ~]# yum install php btw:这次是8.4MB/s 2.安装php组件 [root@foam ~]# yum install php-mysql php-gd libjpeg* php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-mcrypt php-bcmath php-mhash libmcrypt 3.重启mysql和apache [root@foam ~]# /etc/init.d/mysqld restart Stopping mysqld: [ OK ] Starting mysqld: [ OK ] [root@foam ~]# /etc/init.d/httpd restart Stopping httpd: [ OK ] Starting httpd: [ OK ] 最后在/var/www/html/下新建index.php。 echo phpinfo(); 浏览器输入ip地址,看到了熟悉的php参数页面。配置成功!! ==============至此LAMP搭建完成================== 如果希望调试PHP,希望显示错误信息,需要到 /etc/php.ini 修改

2014-12-03 · 2 分钟 · 242 字