my blog my blog

Tag: TCP
64位版本的SocksCap64代理程序介绍与推荐

 

奶牛最近在找一个好用的代理程序,支持socks5的tcp和udp两种协议,并且支持64位win8系统,终于最后找到了这个sockscap64.

首先很难的,作者是国人,并且提倡软件免费,并打算一直免费提供sockscap64这软件。sockscap64目前支持socks代理和http代理,并且支持tcp和udp,Sockscap64是基于远程DLL注入技术, 通过修改系统Winsock的API后从而使运行于Sockscap64的网络软件通过SOCKS代理访问网络; 从而实现网络加速或突破局域网限制的功能。经过测试udp功能也比较稳定。

特此推荐,下载http://www.sockscap64.com/software/SocksCap64-setup-2.6.exe

Ubuntu下socks5代理服务器dante-server的安装与配置

 

安装

  1. apt-get install dante-server 

配置文件在/etc/danted.conf

  1. vim /etc/danted.conf 
  2. # $Id: sockd.conf,v 1.43 2005/12/26 16:35:26 michaels Exp $ 
  3. # A sample danted.conf 
  4. # The configfile is divided into three parts; 
  5. #    1) serversettings 
  6. #    2) rules 
  7. #    3) routes 
  8. # The recommended order is: 
  9. #   Serversettings: 
  10. #               logoutput 
  11. #               internal 
  12. #               external 
  13. #               method 
  14. #               clientmethod 
  15. #               users 
  16. #               compatibility 
  17. #               extension 
  18. #               connecttimeout 
  19. #               iotimeout 
  20. #               srchost 
  21. #  Rules: 
  22. #       client block/pass 
  23. #               from to 
  24. #               libwrap 
  25. #               log 
  26. #     block/pass 
  27. #               from to 
  28. #               method 
  29. #               command 
  30. #               libwrap 
  31. #               log 
  32. #               protocol 
  33. #               proxyprotocol 
  34. #  Routes: 
  35.  
  36. # the server will log both via syslog, to stdout and to /var/log/lotsoflogs 这行是日志输出,输出到syslog stdout和lotsoflogs里面
  37. logoutput: syslog stdout /var/log/lotsoflogs 
  38.  
  39. # The server will bind to the address 10.1.1.1, port 1080 and will only 
  40. # accept connections going to that address. 
  41. #internal: 10.1.1.1 port = 1080 
  42. # Alternatively, the interface name can be used instead of the address. 这里设置eth0为网卡,端口1080
  43. internal: eth0 port = 1080 
  44.  
  45. # all outgoing connections from the server will use the IP address 
  46. # 195.168.1.1 
  47. #external: 192.168.1.1,这里是设置流量出口使用的ip,也是用eth0网卡的
  48. external:eth0
  49. # list over acceptable methods, order of preference. 
  50. # A method not set here will never be selected. 
  51. # If the method field is not set in a rule, the global 
  52. # method is filled in for that rule. 
  53.  
  54. # methods for socks-rules. 设置方式为用户名模式
  55. method: username 
  56. #methods for client-rules. 
  57. clientmethod: none 
  58.  
  59. #or for PAM authentification 
  60. #method: pam 
  61.  
  62. # An important section, pay attention. 
  63.  
  64. # when doing something that can require privilege, it will use the 
  65. # userid: 
  66. user.privileged: root 
  67.  
  68. # when running as usual, it will use the unprivileged userid of: 
  69. user.notprivileged: nobody 
  70.  
  71. # If you compiled with libwrap support, what userid should it use 
  72. # when executing your libwrap commands?  "libwrap". 
  73. user.libwrap: nobody 
  74.  
  75.  
  76. # some options to help clients with compatibility: 
  77.  
  78. # when a client connection comes in the socksserver will try to use 
  79. # the same port as the client is using, when the socksserver 
  80. # goes out on the clients behalf (external: IP address). 
  81. # If this option is set, Dante will try to do it for reserved ports aswell. 
  82. # This will usually require user.privileged to be set to "root". 
  83. compatibility: sameport 
  84.  
  85. # If you are using the bind extension and have trouble running servers 
  86. # via the server, you might try setting this.  The consequences of it 
  87. # are unknown. 
  88. compatibility: reuseaddr 
  89.  
  90. # The Dante server supports some extensions to the socks protocol. 
  91. # These require that the socks client implements the same extension and 
  92. # can be enabled using the "extension" keyword. 
  93. # enable the bind extension. 
  94. extension: bind 
  95.  
  96.  
  97. # misc options. 
  98.  
  99. # how many seconds can pass from when a client connects til it has 
  100. # sent us it's request?  Adjust according to your network performance 
  101. # and methods supported. 
  102. #connecttimeout: 30   # on a lan, this should be enough if method is "none". 
  103.  
  104. # how many seconds can the client and it's peer idle without sending 
  105. # any data before we dump it?  Unless you disable tcp keep-alive for 
  106. # some reason, it's probably best to set this to 0, which is 
  107. # "forever". 
  108. #iotimeout: 0 # or perhaps 86400, for a day. 
  109.  
  110. # do you want to accept connections from addresses without 
  111. # dns info?  what about addresses having a mismatch in dnsinfo? 
  112. #srchost: nounknown nomismatch 
  113.  
  114. # The actual rules.  There are two kinds and they work at different levels. 
  115. # The rules prefixed with "client" are checked first and say who is allowed 
  116. # and who is not allowed to speak/connect to the server.  I.e the 
  117. # ip range containing possibly valid clients. 
  118. # It is especially important that these only use IP addresses, not hostnames, 
  119. # for security reasons. 
  120. # The rules that do not have a "client" prefix are checked later, when the 
  121. # client has sent its request and are used to evaluate the actual 
  122. # request. 
  123. # The "to:" in the "client" context gives the address the connection 
  124. # is accepted on, i.e the address the socksserver is listening on, or 
  125. # just "0.0.0.0/0" for any address the server is listening on. 
  126. # The "to:" in the non-"client" context gives the destination of the clients 
  127. # socksrequest. 
  128. # "from:" is the source address in both contexts. 
  129.  
  130.  
  131. # the "client" rules.  All our clients come from the net 10.0.0.0/8. 
  132.  
  133. # Allow our clients, also provides an example of the port range command. 设置客户可以通过任何ip登陆,访问任何ip
  134. client pass { 
  135.         from: 0.0.0.0/0 to: 0.0.0.0/0 
  136. #       method: rfc931 # match all idented users that also are in passwordfile 
  137.  
  138. # This is identical to above, but allows clients without a rfc931 (ident) 
  139. # too.  In practise this means the socksserver will try to get a rfc931 
  140. # reply first (the above rule), if that fails, it tries this rule. 
  141. #client pass { 
  142. #       from: 10.0.0.0/8 port 1-65535 to: 0.0.0.0/0 
  143. #} 
  144.  
  145.  
  146. # drop everyone else as soon as we can and log the connect, they are not 
  147. # on our net and have no business connecting to us.  This is the default 
  148. # but if you give the rule yourself, you can specify details. 
  149. #client block { 
  150. #       from: 0.0.0.0/0 to: 0.0.0.0/0 
  151. #       log: connect error 
  152. #} 
  153.  
  154.  
  155. # the rules controlling what clients are allowed what requests 
  156.  
  157. # you probably don't want people connecting to loopback addresses, 
  158. # who knows what could happen then. 
  159. #block { 
  160. #       from: 0.0.0.0/0 to: 127.0.0.0/8 
  161. #       log: connect error 
  162. #} 
  163.  
  164. # the people at the 172.16.0.0/12 are bad, no one should talk to them. 
  165. # log the connect request and also provide an example on how to 
  166. # interact with libwrap. 
  167. #block { 
  168. #       from: 0.0.0.0/0 to: 172.16.0.0/12 
  169. #       libwrap: spawn finger @%a 
  170. #       log: connect error 
  171. #} 
  172.  
  173. # unless you need it, you could block any bind requests. 
  174. #block { 
  175. #       from: 0.0.0.0/0 to: 0.0.0.0/0 
  176. #       command: bind 
  177. #       log: connect error 
  178. #} 
  179.  
  180. # or you might want to allow it, for instance "active" ftp uses it. 
  181. # Note that a "bindreply" command must also be allowed, it 
  182. # should usually by from "0.0.0.0/0", i.e if a client of yours 
  183. # has permission to bind, it will also have permission to accept 
  184. # the reply from anywhere. 
  185. #pass { 
  186. #       from: 10.0.0.0/8 to: 0.0.0.0/0 
  187. #       command: bind 
  188. #       log: connect error 
  189. #} 
  190.  
  191. # some connections expect some sort of "reply", this might be 
  192. # the reply to a bind request or it may be the reply to a 
  193. # udppacket, since udp is packetbased. 
  194. # Note that nothing is done to verify that it's a "genuine" reply, 
  195. # that is in general not possible anyway.  The below will allow 
  196. # all "replies" in to your clients at the 10.0.0.0/8 net. 
  197. #pass { 
  198. #       from: 0.0.0.0/0 to: 10.0.0.0/8 
  199. #       command: bindreply udpreply 
  200. #       log: connect error 
  201. #} 
  202.  
  203.  
  204. # pass any http connects to the example.com domain if they 
  205. # authenticate with username. 
  206. # This matches "example.com" itself and everything ending in ".example.com". 
  207. #pass { 
  208. #       from: 10.0.0.0/8 to: .example.com port = http 
  209. #       log: connect error 
  210. #       method: username 
  211. #} 
  212.  
  213.  
  214.  
  215.  
  216. # block any other http connects to the example.com domain. 
  217. #block { 
  218. #       from: 0.0.0.0/0 to: .example.com port = http 
  219. #       log: connect error 
  220. #} 
  221.  
  222. # everyone from our internal network, 10.0.0.0/8 is allowed to use 
  223. # tcp and udp for everything else. 设置协议支持tcp和udp
  224. pass { 
  225.         from: 0.0.0.0/0 to: 0.0.0.0/0 
  226.         protocol: tcp udp 
  227.  
  228. # last line, block everyone else.  This is the default but if you provide 
  229. # one  yourself you can specify your own logging/actions 
  230. #block { 
  231. #       from: 0.0.0.0/0 to: 0.0.0.0/0 
  232. #       log: connect error 
  233. #} 
  234.  
  235. # route all http connects via an upstream socks server, aka "server-chaining". 
  236. #route { 
  237. # from: 10.0.0.0/8 to: 0.0.0.0/0 port = http via: socks.example.net port = socks 
  238. #} 

配置完成,

  1. /etc/init.d/danted start 

进行启动。登陆是用本机用户名和密码即可。建议将用户的shell设置为nologin

QQ手动抓对方IP测试成功

 

QQ是我们熟悉不过的IM软件了,一直以来都很好奇那些显IP的外挂是怎么搞成的,因为最近也在看计算机网络方面的书籍,昨天闲着没事儿就找了下网上介绍那些外挂是如何来做的。他们是通过对QQ的文件进行反汇编,然后分析代码做的,呃,这个奶牛真心搞不了,毕竟不是搞软件的人,下面奶牛就把自己的思路来分享给大家:

从抓包开始,工具wireshark

因为聊天的过程会有各种数据包,而数据包有ip,直接截取可行否?答案:否

不知道朋友们有没有注意到,腾讯现在已经提供7日内聊天记录可查询的服务,也就是说我们的数据包肯定不是直接发送到对方的pc,肯定是经过腾讯的服务器,所以此过程中腾讯做了中间人,他可以得到我们所有发送的内容,而且还经常帮我们分析一下,提醒用户涉及财物的时候请谨慎。

而实际的抓取过程中也证实了这一点,抓到的通讯中的ip并非对方的实际IP,估计应该是腾讯服务器的IP

那么可行方案有没有呢?有的,我们可以通过文件传送来进行抓取:

直接发送一个大文件,让对方接收,然后你就可以看到你的wireshark数据包猛增,这个ip就是对方的真实ip。腾讯不会浪费自己服务器的资源来截取这些对他们来说大多数无用的东西,所以文件传送肯定是点对点来完成了,实际测试中也得到了印证。

一些思考:腾讯QQ的文件传送过程中并没有使用奶牛预期的TCP传送,而是使用的UDP,这点挺出乎意料的。所以肯定在接收程序与发送程序之间有很多协议上的处理,对于丢包与重发机制上肯定有很多设计,因为文件传送必然需要可靠的传送。感兴趣的朋友可以自行测试下。

一个网络数据包的故事——理顺下网络数据包的传输(三)

 

接续接着上节“ 二.怎么找到你?” ,奶牛继续来说说这个网络数据包滴故事的第三节:你等着,我来了。

三.你等着,我来了。

这节呢,就是一个传输的过程,涉及比较多的就是网络层跟运输层的一些东东。其实前几天打算自己理顺下计算机网络是有原因滴,看鸟哥讲述的网络那部分有一些迷惑,主要是对于NAT问题的理解。这节我们将把自己藏身在一个最隐蔽的角落来讲述这个故事,我们是一个内网滴小主机,什么是内网呢,呃,就是说你没有public ip address,所以你没法直接在互联网上进行通信。那么怎么办哇,你可以走你的网关哇,那这个网关又是什么哩?我们这里就笼统滴把它当个路由器吧。路由器是在物理层、网络层、运输层上的东西,也就是说,我们发一个数据包出去的时候,除了具体的data内容不会被修改,其它滴很多东西都是重新封包处理滴。好啦,下面我们就一层层滴来解释。

首先第一个过程是判断我们的目的地址是不是内网的ip,如果是,直接ARP后直接用硬件地址通信(我们本来就没打算再继续这个过程,比较容易理解,只是提一下),如果不是哩,那么我们就会把这个数据包交给我们的路由器。这时候路由器有了这个数据包(仍旧以TCP为例),路由的NAT会自动将其中的源地址与源端口还有源mac(source ip && source port)地址都更新成为路由器自己的硬件地址,IP地址跟端口(路由器公网的IP跟端口),并且在NAT转换表中添加一条记录,这里记录的是路由器更新的内容以及目标主机的信息(目标IP跟目标端口)。这个就是NAT工作的一个很重要的作用,它将我们内网的主机完全隐藏在了自己的身下,然后把自己作为一个外交官,与外界进行通信。然后路由器将数据包运输到公网IP所在滴网络,再进行对目的主机的查找,如果没找到就继续往上一层网关传递数据包,直至找到目标主机,并将数据包传递上去。这里奶牛说的很简单,不想让大家很混乱,所以很多细节都避而不谈了,一般也不需要知道。

当目标主机发回数据的时候,目标ip跟端口就是我们第一层公网路由器的ip跟端口,因为那个ip跟端口已经可以定位一台主机了,所以那些在网络传输的过程中是不会变化的,唯一变化滴是mac地址,这里我们说下,数据包传递过程中mac地址是逐层变化的,一般就是本机的mac与上层网关的mac会每次都被修改,因为这个是硬件通信的要求,但是网络层跟运输层在公网的传递是不变的,直到数据又回到了我们的保护伞第一层路由器。这时候路由器看到:哦?终于等待的数据回来了。(因为我们刚才记录在NAT转换表中了目标ip跟目标端口哇,所以这里我们可以知道是我们想要的数据咯),然后我们要把这些数据换个头发回给我们的内网主机,这时候目标ip跟端口信息被更换为内网主机的ip跟端口,又发回给了内网主机,这时候内网主机就得到了自己需要的信息。

有何为证这就是我们想要的信息呢?1.因为我们在内网,所以这些数据包肯定发来时候的mac是网关的,直接arp就可以查到,你看看是不是。2.仍旧是那个ip跟端口哇,你看看是不是你要的不就是到了哇,汗一下。这里奶牛截取一下自己的通信包的一些信息给大家看下,增强下印象:

首先我们发送一个数据包的信息是:

  1. 源主机:192.168.1.100 
  2. 目标主机:220.181.111.147 
  3. 协议:TCP 
  4. Source port: 63516 (63516) 
  5. Source: QuantaCo_60:44:f1 (00:26:9e:60:44:f1) 
  6. Destination port: http (80) 
  7. Destination: Tp-LinkT_23:d7:9a (94:0c:6d:23:d7:9a) 

我们接收到的数据包的信息是:

  1. 目标主机:192.168.1.100  
  2. 源主机:220.181.111.147  
  3. 协议:TCP  
  4. Source port: http (80) 
  5. Source: Tp-LinkT_23:d7:9a (94:0c:6d:23:d7:9a) 
  6. Destination port: 63516 (63516) 
  7. Destination: QuantaCo_60:44:f1 (00:26:9e:60:44:f1) 

好吧,故事就讲到这里吧,如果朋友们看着还是乱,那就自己看下《计算机网络:自顶向下方法》这本书吧,写得很好,细致容易理解,作为入门书籍相当棒。

一个网络数据包的故事——理顺下网络数据包的传输(二)

 

接续接着上节“ 一.我在哪里?你又在哪里?” ,奶牛继续来说说这个网络数据包滴故事。

二.怎么找到你?

你可能会疑问,上一节我们不是说了你在哪里哇,那还用找哇?当然,我们这节就是要弄清楚我是怎么知道的你在哪里。

关键词:ARP DNS

先来说ARP

  1. ARP(address resolution protocol):地址解析协议是获取物理地址的一个TCP/IP协议。
  2. 某节点的IP地址的ARP请求被广播到网络上后,这个节点会收到确认其物理地址的应答,这样的数据包才能被传送出去。 

那ARP解析的究竟是什么呢?让我们看一下:

  1. arp -a 
  2.  
  3. 接口: 192.168.1.100 --- 0xb 
  4.   Internet 地址         物理地址              类型 
  5.   192.168.1.1           94-0c-6d-23-d7-9a     动态 
  6.   192.168.1.255         ff-ff-ff-ff-ff-ff     静态 

奶牛查询了下本地的arp,我们可以看到,奶牛是在路由器的环境下,网关就是IP:192.168.1.1,它的硬件mac地址是94-0c-6d-23-d7-9a ,这记录在我们的arp表中,而192.168.1.255就是广播地址啦,如果我们的路由器下还有一台机器的IP是192.168.1.2,如果我们知道它就是我们的目标,我们就要把数据包发送给它,那么我们就需要首先利用ARP来查询到192.168.1.2的硬件MAC地址,然后将这个地址封在我们的以太网帧中,这样子才能把数据通过硬件发送出去,因为最终归结到最后,所有数据包还是要通过硬件来完成传送的。

再来说说DNS

  1. DNS(Domain Name System)是域名系统的缩写
  2. 它是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库
  3. 能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。  

从定义来看,DNS就是将IP与域名进行互相映射,我们可以通过dns查找一个域名对应的IP,也可以通过IP查找这个IP下的域名。对于域名,我们这里也来说一下,域名是指abc.com  nenew.net或相类似形式的名称,而www.abc.com  www.nenew.net只是一个子域名,跟blog.nenew.net哇wiki.nenew.net哇是同等地位的。当然子域跟IP也是对应的。

  1. nslookup nenew.net 8.8.8.8 
  2. 服务器:  google-public-dns-a.google.com 
  3. Address:  8.8.8.8 
  4. 非权威应答: 
  5. 名称:    nenew.net 
  6. Address:  65.49.24.75 

用nslookup命令来查询nenew.net的IP地址,可以得到奶牛现在用的服务器的IP,当然,这里跟我们说的数据包的故事有些远了,我们继续绕回去,有了域名,我们就不用去记忆一整串的IP地址了,因此,如果你想与一台服务器进行通信,传送数据包,有时候也会用到DNS来帮助我们解析出目标的IP,这样子我们就知道了IP包中的目标地址了。

对于TCP或者UDP的表头中的目标端口,我们一般还是以默认的知道的情况下才好进行数据包的传送,比如我们要浏览一个网页,那么默认的端口一般就是80,这个是公认的,小于1024的端口一般都被赋予了相应的功能跟意义,虽然我们也可以手动进行修改,但是很多东西是约定俗成的。

综合一下上面:

以太网帧的表头中的目的地址是mac硬件地址,使用arp将目标IP解析成硬件地址

IP数据包的表头中的目的地址是IP,这个IP可以是我们事先知道的,也可以是通过DNS查询得到的。

TCP包的表头中的目的端口是目标的端口号,一般是默认定义好的(比如web的80端口ftp的21端口)也可以是事先知道的。

通过这三点,我们就可以确定出你在哪里,并且知道我是怎么找到你的。

数据包的故事继续,下节继续说数据包的传输过程:你等着,我来了。

一个网络数据包的故事——理顺下网络数据包的传输(一)

 

昨晚半夜看鸟哥,看网络数据包那章的时候,有一些东西很零乱,有一些问题也没有具体来说明,昨晚想了一脑子浆糊,主要是纠结于nat这层,今天查了一些介绍,算是能理清楚了。整理一下,讲述下一个网络数据包的故事。

一.我在哪里?你又在哪里?

这个问题很哲学,我在哪里?你又在哪里?呃,如果你不知道我在哪里你怎么找我?我不知道你在哪里我又怎么找你呢?那我们就来看看一个数据包的结构吧(以TCP为例):

|<–           MAC数据包总长度           –>|

|         |<–       IP数据包总长度       –>|

|                 |<–   TCP数据包总长度  –>|

| MAC数据包表头 | IP数据包表头 | TCP数据包表头 | 实际内容 |

这里不难看出,数据包的层次关系来,MAC数据包包包裹着IP数据包,IP数据包又包裹着TCP数据包,TCP数据包里面是要传输的内容。下面来说说这个MAC IP TCP都是神马东东。

  1. MAC(Medium Access Control) 
  2. 媒体介入控制层,属于OSI模型中数据链路层下层子层。 
  3. IP(Internet Protocol) 
  4. 网络之间互连的协议的缩写,中文简称为“网协”,也就是为计算机网络相互连接进行通信而设计的协议。 
  5. TCP(Transmission Control Protocol) 
  6. 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,UDP是同一层内另一个重要的传输协议。  

MAC也表示网卡滴硬件地址,就是你滴网卡那串00:11:22:33:44:55:66形式滴硬件地址。下面说说各个包的表头里面都有一些什么重要滴东西(当然,这里只介绍那些最重要的东西)。

MAC的表头里面标明了目的地址与来源地址,这两个地址都是硬件MAC地址,因为MAC帧在数据链路层,这层是整个OSI的物理层之上,也就是物理层是直接负责将这些数据进行网卡之间的传输滴,所以这里的地址是硬件地址。MAC从硬件上说明了我在哪里与你在哪里。但是这个MAC的表头会跟随数据的传输而逐步变化。

IP的表头里面也有类似的目标地址与来源地址,这里的地址是用IP表示的。当然,无论你是私有IP还是公有IP,这里的IP地址也是会变化滴,正向发出的时候目标IP是不会变化的,返回的时候,来源IP也不变化,也就是说你要访问的那个IP地址在传输过程中并不会改变,变化的是源地址source IP。

TCP的表头里面没有地址,只有端口,分目标端口与来源端口。这个端口多数是随机产生的,当然,目标端口一般不是随机产生的,比如你要访问一个web服务,那么目标端口一般就是80咯,关于端口的知识各位可以百科下。这里跟IP很相似,目标端口不会变化,但是来源端口会跟随着路由变化。具体为什么变化哩,奶牛在下节中回来跟大家说明。

好了,这样子,“我在哪里?你在哪里?”的问题基本上就有了一个明确的定位,虽然上面看着有些零乱,而且有很多变化,但是,我们可以知道一些变化的,一些不变化的,而且这里我们也可以想到一个问题,TCP/IP是协议簇,为啥他俩这么暧昧哩,因为他俩在一起可以确定一条传输的路径哇,有些联系在一起密不可分滴关系里,暧昧暧昧哇~~~

好了,如果感兴趣滴朋友就期待奶牛滴下一节吧~~~