socat是一個(gè)多功能的網(wǎng)絡(luò)工具,名字來由是” SOcket CAT”,因此可以看出它基于socket,能夠折騰socket相關(guān)的無數(shù)事情。
當(dāng)然這些都不是我關(guān)心的重點(diǎn)。我發(fā)現(xiàn)并嘗試使用socat的原因可以參看此前的 一次端口轉(zhuǎn)發(fā)的嘗試 ,本文的重點(diǎn)是介紹一下我對(duì)socat的使用心得,以及折騰了一個(gè)小時(shí)的GENTOO版socat服務(wù)腳本。
為了表示對(duì)網(wǎng)絡(luò)先驅(qū)的尊重,首先貼參考文章:
《 Port Forwarding in user space [INFO]》 和《 How to forward port in user space using socat 》
socat其實(shí)可以看作是netcat的加強(qiáng)N倍版,因此乍一看socat的命令行,那叫一個(gè)復(fù)雜。不過仔細(xì)一看后,其實(shí)發(fā)現(xiàn)socat的參數(shù)也是很有規(guī)律、簡(jiǎn)潔的。例如,我需要的轉(zhuǎn)發(fā)功能是:
對(duì)于所有15000端口的TCP訪問,一律轉(zhuǎn)發(fā)到 server.wesnoth.org:15000 上。
于是,對(duì)應(yīng)的命令就是:
1 socat -d -d -lf /var/log/socat.log TCP4-LISTEN:15000,reuseaddr,fork,su=nobody TCP4:server.wesnoth.org:15000“-d -d -lf /var/log/socat.log”是參數(shù),前面兩個(gè)連續(xù)的-d -d代表調(diào)試信息的輸出級(jí)別,-lf則指定輸出信息的保存文件。
“TCP4-LISTEN:15000,reuseaddr,fork,su=nobody”是一號(hào)地址,代表在15000端口上進(jìn)行TCP4協(xié)議的監(jiān)聽,復(fù)用綁定的IP,每次又連接到來就fork復(fù)制一個(gè)進(jìn)程進(jìn)行處理,同時(shí)將執(zhí)行用戶設(shè)置為nobody用戶。
“TCP4:server.wesnoth.org:15000″是二號(hào)地址,代表將socat監(jiān)聽到的任何請(qǐng)求,轉(zhuǎn)發(fā)到server.wesnoth.org:15000上去。
但是在服務(wù)器上運(yùn)行的命令,最好還是寫成為一個(gè)服務(wù)腳本,這樣便于后續(xù)重啟服務(wù)器之類的。剛好我的VPS服務(wù)器上的系統(tǒng)是gentoo,于是就費(fèi)了點(diǎn)時(shí)間寫了一個(gè)腳本。
首先貼腳本的配置文件:
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"然后貼腳本代碼,保存的位置當(dāng)然是
/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
后,就可以啟動(dòng)socat服務(wù)了:
1 / etc / init.d / socat start關(guān)閉服務(wù)的命令是:
1 / etc / init.d / socat stop當(dāng)然,我更是直接加入到了boot服務(wù)組里了,下次開機(jī)時(shí)能夠自動(dòng)啟動(dòng):
1 rc-update add socat boot好了,大功告成!
不過,依舊有一些問題。例如我首先使用 TCP4-LISTEN:15000 綁定了一個(gè)IPv4的TCP監(jiān)聽后,接著使用 TCP6-LISTEN:15000 綁定則會(huì)提示失敗:
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)可是此時(shí)查看網(wǎng)絡(luò)端口的監(jiān)聽情況,并沒有發(fā)現(xiàn)IPv6上有監(jiān)聽:
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真是奇怪呢……可惜手頭沒有IPv6,難以測(cè)試啊……
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
