banner
ximalaya

ximalaya

这里是openkava 的blog,关注程序开发的一切技术。 ZZ 表示转载的文章,如涉及版权,请和我联系删除。 在这里你可以看到关于以下技术的文章: 移动开发技术,ANDROID ,IOS,WINDOWS PHONE平台开发,企业ERP开发,动态脚本PYTHON ,OPENGL ES 3D技术,游戏开发技术,HTML5 ,JAVASCRIPT ,MYSQL,AMAZON EC2 ,GOOGLE GAE ,GOOGLE CLOUD SQL 等 。 本站发展历程: 2010年,正式把所有的blog移到这里,租用godaddy的空间,记录生活和工作上的一些心得。 下面是关于我的个人介绍,写在这里权当凑字数啦。 职业:软件开发,开发经验6年,管理经验3年; 工作上使用的技术:C#, SQL SERVER 个人使用的技术:PYTHON,PHP, CSS, JAVA ,ANDROID ,object-c 等等 联系我请发邮件:<a href="http://blog.openkava.com/openkava@gmail.png"><img class="alignnone size-full wp-image-96" title="邮箱" src="http://blog.openkava.com/openkava@gmail.png" alt="" width="174" height="24" /></a>

socat 工具做端口转发

linux:

socat TCP4-LISTEN:188,reuseaddr,fork TCP4:192.168.1.22:123 &

(在本地监听 188 端口,并将请求转发至 192.168.1.22 的 123 端口)

windows:

cmd:> socat TCP4-LISTEN:1234,reuseaddr,fork TCP4:192.168.1.22:3389

TCP4-LISTEN:在本地建立的是一个 TCP ipv4 协议的监听端口;
reuseaddr:绑定本地一个端口;
fork:设定多链接模式,即当一个链接被建立后,自动复制一个同样的端口再进行监听

socat 启动监听模式会在前端占用一个 shell,因此需使其在后台执行。
socat -d -d tcp4-listen:8900,reuseaddr,fork tcp4:10.5.5.10:3389 # 端口转发

server : socat exec:/bin/sh  tcp4.x.x.x:999
client: socat tcp-listen:999 - # 服务端开启 sh 终端,显示到客户端
socat -d -d tcp4-listen:8901,reuseaddr,fork tcp4:10.120.0.208:3389
socat -d -d tcp4-listen:8903,reuseaddr,fork tcp4:10.5.5.10:1433

ssl tunnel :
server tcp-listen:8888 ,reuseaddr,fork , tcp4:10.0.0.client
client tcp4:10.0.0.server tcp-connect:hostname:8888

tun: 创建两个服务器和客户端之间一条通道
socat -d -d tcp-listen:9999,reuseaddr tun:10.0.0.1/23,up #server
socat socat tcp.x.x.x:9999 tun:10.0.0.2/24 ,up

 


说起来有点土,事到如今才第一次用 socat.
不过今天看了一眼,netcat (nc) 这东西 ms 已经 N 年没有人维护了。最先有个叫 nc110 的东西,由于太普及,以至于人们都不想再去改动它的功能。结果导致多年来没有任何进步… 现任的 RHEL5 里面好像也是由 nc110 改出来的。另外分支出来一个 netcat, 这个在 google 上直接 netcat 最容易出来,但也好多年没有人动过了… 由于这些情况,才使得 socat 应运而生。虽然它已经生了好多年了,不过我才认识…
用 socat 试几个 netcat 常用的用法,对比如下:

  1. 听 tcp 12345 端口

nc -l 127.0.0.1 12345#

socat tcp-listen:12345 -#

  1. 向远处 tcp 12345 端口发点字

echo “test” | nc 127.0.0.1 12345#

echo “test” | socat - tcp-connect:127.0.0.1:12345#

  1. 听 udp 23456 端口

nc -u -l 127.0.0.1 23456#

socat udp-listen:23456 -#

  1. 向远处 udp 23456 端口发点字

echo “test” | nc -u 127.0.0.1 23456#

echo “test” | socat - udp-connect:127.0.0.1:23456#

  1. 听 unix socket /tmp/unix.socket

nc -U -l /tmp/unix.socket#

netcat 没有 - U 选项

socat unix-listen:/tmp/unix.socket -#

  1. 向本地 unix socket /tmp/unix.socket 发点字

echo “test” | nc -U /tmp/unix.socket#

netcat 没有 - U 选项

echo “test” | socat - unix-connect:/tmp/unix.sock#

  1. 听本地 unix datagram socket /tmp/unix.dg.sock
    nc110 搞不定,netcat 也搞不定

socat unix-recvfrom:/tmp/unix.dg.sock -#

  1. 向本地 unix datagram socket /dev/log 发点字
    nc110 搞不定,netcat 也搞不定

echo “test” | socat - unix-sendto:/tmp/unix.dg.sock#

 

----------第二篇放一起了-------
linux 下实现 UDP 端口映射
原文链接: http://www.hiadmin.com/?tag=socat

一、实际问题
snmp 监听端口默认为 UPD 161,当监控服务器无法直接访问时,就需要用到端口映射来解决!
同样问题还有 dns 服务器的 UPD 53 端口。
二、使用 nc 来映射 UPD 端口
假设被监控服务器的 IP 为 192.168.1.1;用于端口映射的主机为某个公网 IP 如 59.1.1.1;需要映射的端口为 UDP 161 转发端口设为 1161(自定义建议 1024 以上端口)
在端口映射服务器上操作,要安装 nc,一般系统都会安装;
【注:nc 存在安全漏洞,一定要设定防火墙】
首先使用 mkfifo 建立管道文件
#mkfifo /tmp/snmpfifo
通过 nc 建立端口映射 -l 为监听模式 -u 为 UDP -p 为本地端口;将内网监控 161 端口映射到本地的 1161 端口上;
#nc -l -u -p 1161 < /tmp/snmpfifo | nc -u 192.168.1.1 161 > /tmp/snmpfifo
查看 netstat 1161 是否监听
#netstat -nlp |grep :1161
udp 0 0 0.0.0.0:1161 0.0.0.0:* 31472/nc

在监控服务器上进行测试是否能采集到数据:
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.2 = INTEGER: 2
IF-MIB::ifIndex.3 = INTEGER: 3
IF-MIB::ifIndex.4 = INTEGER: 4
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: eth0
....
#snmpwalk -c public -v2c 59.1.1.1:1161 if

设定成功;这里存在一个问题就是 nc 监听的端口每次一连接就会挂起,采取一个比较笨的办法就是写个 restart.sh 脚本放在 crontab 中每分钟执行一次;
产生该问题的主要原因我在下面讲 socat 的时候会分析的;
针对 snmp 采集这样是没有问题,如果 dns 服务就不行啦!
三、采用 nc 升级版本的 socat 来实现 UDP 端口映射
软件包下载地址:http://www.dest-unreach.org/socat/download/
安装无非就是 configure make make install
socat 的主要特点就是在两个数据流之间建立通道;且支持众多协议和链接方式:ip, tcp, udp, ipv6, pipe,exec,system,open,proxy,openssl,socket 等
这里不一一介绍啦!
有兴趣可以查看官方文档:http://www.dest-unreach.org/socat/doc/socat.html
我们说说如何使用 socat 建立 UPD 端口映射
#socat udp4-listen:11161,reuseaddr,fork UDP:[监控服务器 IP]:161
udp4-listen:在本地建立的是一个 udp ipv4 协议的监听端口;
reuseaddr,绑定本地一个端口;
fork,设定多链接模式,即当一个链接被建立后,自动复制一个同样的端口再进行监听;

【注:nc 就是因为缺少 fork 模式,所以每次监听只能处理一次连接】
socat 是一个强大的软件,希望与有这方面需求的同仁一起学习这个好的工具!
ps:无论是 nc 方式还是 socat 方式,启动监听模式都是在前端占用一个 shell,所以请在后台执行或者使用 screen 工具等等!

 

附:
socat 官方文档:http://www.dest-unreach.org/socat/doc/socat.html


socat 是一個 netcat (nc) 的替代產品,可以稱得上 nc++。socat 的特點就是在兩個流之間建立一個雙向的通道。socat 的地址類型很 多,有 ip, tcp, udp, ipv6, pipe,exec,system,open,proxy,openssl, 等等。看一個例子:

c:&gt;socat - tcp:192.168.1.18:80

這個命令等同於 nc 192.168.1.18 80。 socat 裡面,必須有兩個流,所以第一個參數 - 代表標準的輸入輸出,第二個流連接到 192.168.1.18 的 80 端口。再看一個反向 telnet 的例子:

on server:
c:&gt;socat tcp-listen:23 exec,pty,stderr

這個命名把 cmd 綁定到端口 23,同時把 cmd 的 Stderr 重定向到 stdout。

on client:
c:&gt;socat readline tcp:server:23

連接到服務器的 23 端口,即可獲得一個 cmd shell。readline 是 gnu 的命令行編輯器,具有歷史功能。

再看文件傳遞的例子。nc 也經常用來傳遞文件,但是 nc 有一個缺點,就是不知道文件什麼時候傳完了,一般要用 Ctrl+c 來終止,或者估計一個時間,用 - w 參數來讓他自動終止。用 socat 就不用這麼麻煩了:

on host 1:
c:&gt;socat -u open.exe,binary tcp-listen:999

on host 2:
c:&gt;socat -u tcp:host1:999 open.exe,create,binary

這個命令把文件 myfile.exe 用二進制的方式,從 host 1 傳到 host 2。-u 表示數據單向流動,從第一個參數到第二個參數,-U 表示從第二個到第一個。文件傳完了,自動退出。

再來一個大家喜歡用的例子。在一個 NAT 環境,如何從外部連接到內部的一個端口呢?只要能夠在內部運行 socat 就可以了。

外部:
c:&gt;socat tcp-listen:1234 tcp-listen:3389

內部:
c:&gt;socat tcp:outerhost:1234 tcp:192.168.12.34:3389

這樣,你外部機器上的 3389 就影射在內部網 192.168.12.34 的 3389 端口上。

socat 還具有一個獨特的讀寫分流功能,比如:

c:&gt;socat open.txt!!open.txt,create,append tcp-listen:80,reuseaddr,fork

這個命令實現一個假的 web server,客戶端連過來之後,就把 read.txt 裡面的內容發過去,同時把客戶的數據保存到 write.txt 裡面。”!!” 符號用戶合併讀寫流,前面的用於讀,後面的用於寫。

 

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。