使用socat进行端口转发
2012-12-02 22:46
621 查看
socat | 半卷
当然这些都不是我关心的重点。我发现并尝试使用socat的原因可以参看此前的一次端口转发的尝试,本文的重点是介绍一下我对socat的使用心得,以及折腾了一个小时的GENTOO版socat服务脚本。
为了表示对网络先驱的尊重,首先贴参考文章:
《Port Forwarding in user space [INFO]》和《How to forward port in user space using socat》
socat其实可以看作是netcat的加强N倍版,因此乍一看socat的命令行,那叫一个复杂。不过仔细一看后,其实发现socat的参数也是很有规律、简洁的。例如,我需要的转发功能是:
对于所有15000端口的TCP访问,一律转发到 server.wesnoth.org:15000 上。
于是,对应的命令就是:
“-d -d -lf /var/log/socat.log”是参数,前面两个连续的-d -d代表调试信息的输出级别,-lf则指定输出信息的保存文件。
“TCP4-LISTEN:15000,reuseaddr,fork,su=nobody”是一号地址,代表在15000端口上进行TCP4协议的监听,复用绑定的IP,每次又连接到来就fork复制一个进程进行处理,同时将执行用户设置为nobody用户。
“TCP4:server.wesnoth.org:15000″是二号地址,代表将socat监听到的任何请求,转发到server.wesnoth.org:15000上去。
但是在服务器上运行的命令,最好还是写成为一个服务脚本,这样便于后续重启服务器之类的。刚好我的VPS服务器上的系统是gentoo,于是就费了点时间写了一个脚本。
首先贴脚本的配置文件:
然后贴脚本代码,保存的位置当然是
接着,配置完
关闭服务的命令是:
当然,我更是直接加入到了boot服务组里了,下次开机时能够自动启动:
好了,大功告成!
不过,依旧有一些问题。例如我首先使用 TCP4-LISTEN:15000 绑定了一个IPv4的TCP监听后,接着使用 TCP6-LISTEN:15000 绑定则会提示失败:
可是此时查看网络端口的监听情况,并没有发现IPv6上有监听:
真是奇怪呢……可惜手头没有IPv6,难以测试啊……
使用socat进行端口转发
沈觅仁 技术打火机 1 commentsocat是一个多功能的网络工具,名字来由是” SOcket CAT”,因此可以看出它基于socket,能够折腾socket相关的无数事情。当然这些都不是我关心的重点。我发现并尝试使用socat的原因可以参看此前的一次端口转发的尝试,本文的重点是介绍一下我对socat的使用心得,以及折腾了一个小时的GENTOO版socat服务脚本。
为了表示对网络先驱的尊重,首先贴参考文章:
《Port Forwarding in user space [INFO]》和《How to forward port in user space using socat》
socat其实可以看作是netcat的加强N倍版,因此乍一看socat的命令行,那叫一个复杂。不过仔细一看后,其实发现socat的参数也是很有规律、简洁的。例如,我需要的转发功能是:
对于所有15000端口的TCP访问,一律转发到 server.wesnoth.org:15000 上。
于是,对应的命令就是:
1 | socat -d -d -lf /var/log/socat.log TCP4-LISTEN:15000,reuseaddr,fork,su=nobody TCP4:server.wesnoth.org:15000 |
“TCP4-LISTEN:15000,reuseaddr,fork,su=nobody”是一号地址,代表在15000端口上进行TCP4协议的监听,复用绑定的IP,每次又连接到来就fork复制一个进程进行处理,同时将执行用户设置为nobody用户。
“TCP4:server.wesnoth.org:15000″是二号地址,代表将socat监听到的任何请求,转发到server.wesnoth.org:15000上去。
但是在服务器上运行的命令,最好还是写成为一个服务脚本,这样便于后续重启服务器之类的。刚好我的VPS服务器上的系统是gentoo,于是就费了点时间写了一个脚本。
首先贴脚本的配置文件:
1 2 3 4 5 6 7 8 | # Configuration for /etc/init.d/socat # File: /etc/socat.conf SOCAT_ARGS="-d -d -d -lf /var/log/socat.log" AUTOSTART="wesnoth wesnoth6" SOCAT_wesnoth="TCP-LISTEN:15000,reuseaddr,fork,su=nobody TCP4:server.wesnoth.org:15000" SOCAT_wesnoth6="TCP6-LISTEN:15001,reuseaddr,fork,su=nobody TCP4:server.wesnoth.org:15000" |
/etc/init.d/socat:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #!/sbin/runscript # Copyright 1999-2007 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 BIN=/usr/bin/socat SOCAT_CONF=/etc/socat.conf SOCAT_ARGS="-d -d -lf /var/log/socat.log" [ ! -f $SOCAT_CONF ] || source $SOCAT_CONF [ -x $BIN ] || exit 0 depend() { need net } start() { ebegin "Starting ${SVCNAME}" if test "x$AUTOSTART" = "xnone" -o -z "x$AUTOSTART" ; then ewarn "Autostart is set to 'none', so disabled." exit 0 fi for FORWARD in $AUTOSTART ; do ARGS=`eval echo \\\$SOCAT_$FORWARD` PID="/var/run/${SVCNAME}/$FORWARD.pid" start-stop-daemon -b --start --exec ${BIN} --make-pidfile --pidfile "${PID}" -- ${SOCAT_ARGS} ${ARGS} & done eend $? "Check ${SOCAT_LOG} to see why startup failed" } stop() { ebegin "Stopping ${SVCNAME}" for PID in /var/run/${SVCNAME}/*.pid; do start-stop-daemon --stop --quiet --exec ${BIN} --pidfile "${PID}" done eend $? } # vim: set ts=4 : |
/etc/socat.conf后,就可以启动socat服务了:
1 | /etc/init.d/socat start |
1 | /etc/init.d/socat stop |
1 | rc-update add socat boot |
不过,依旧有一些问题。例如我首先使用 TCP4-LISTEN:15000 绑定了一个IPv4的TCP监听后,接着使用 TCP6-LISTEN:15000 绑定则会提示失败:
1 2 3 | # socat -d -d TCP6-LISTEN:15000,reuseaddr,fork,su=nobody TCP4:server.wesnoth.org:15000 2010/09/29 23:19:42 socat[3166] E bind(3, {AF=10 [0000:0000:0000:0000:0000:0000:0000:0000]:15000}, 28): Address already in use 2010/09/29 23:19:42 socat[3166] N exit(1) |
1 2 3 4 5 6 7 | # netstat -an | grep LISTEN tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:15000 0.0.0.0:* LISTEN tcp6 0 0 :::21 :::* LISTEN |
相关文章推荐
- 攻防实战:使用Lcx进行内网端口转发
- Mac下使用PF进行端口转发和防火墙配置(类似Linux的iptables)
- 使用SSH进行端口转发
- 使用SecureCRT进行端口转发
- mac下使用pf进行端口转发的疑问与解答
- 使用iptables进行端口重定向(转发)
- 使用SecureCRT进行端口转发
- centos端口转发神器:socat安装及使用
- 使用LCX进行内网端口转发
- 攻防实战:使用Lcx进行内网端口转发
- 使用SSH反向隧道进行内网穿透(远程端口转发)
- 使用plink进行端口转发
- 使用SecureCRT进行端口转发
- linux如何使用iptables进行本地端口转发
- Linux系统如何使用iptables进行本地端口转发?
- 使用SSH进行端口转发
- LINUX 实现端口转发 - 安装使用rinetd
- 使用Java进行RS232C端口的开发
- 使用ufw配置ip端口转发
- 【linux】ftp使用端口转发问题