我们来打洞:转发DNS包

基于某些众所周知的原因,在天朝上网非常需要勇气和技术。 今天在跟某人聊天时了解到Chrome竟然没办法使用proxy进行DNS查询<1>, 导致DNS查询结果持续被污染。 虽然用proxychains能把一切流量塞进代理里面, 不过用proxychains启动浏览器的话,各种自动代理插件就失效了,所以这是个得不偿失的方法。 青蛙晚上的时候突然想到iptables是不是可以把DNS查询流量转发进ssh tunnel呢? 上网google一番之后,发现这是可行的,而且其实用不到iptables,只要nc就够了。

要用SSH Tunnel转发DNS流量,最大的问题是要把DNS协议使用的UDP协议转换为TCP协议,然后在proxy端还要转换回来。 所以目前青蛙想到的方案有一个很大的缺陷,就是如果ssh服务器上不提供nc命令的话,下面的操作是没法完成的。

首先,用SSH连接ssh服务器,这里青蛙打了一套组合拳,ssh -L + -D组合,分别负责DNS流量和普通数据流量:

ssh -D1080 -L5353:127.0.0.1:5353 user@ssh-server

-L 参数的目的是在本地机器上打开一个5353端口,发送到这个端口的数据都会被转发到ssh服务器上的5353端口上。

然后,在ssh服务器上执行:

server$ mkfifo /tmp/fifo
server …
more ...

一堆小Tips (3)

今天继续关于ssh的话题。

青蛙本来想把今天这个主题放在昨天一起讲的,但是这两个Tip的关联不大,最后决定还是分开说。

在平时上网过程中,有可能遇到某个服务器(我们叫他S)无法访问的问题。

但是如果另外一台主机(叫做P)可以访问到S,并且我们还有P上面的ssh权限,那就可以把P当作跳板,直接访问到S。

假设要访问S上面的http(80)服务,那就执行如下命令:

ssh user@P的地址 -L 8080:S的地址:80

这个命令会在本地打开8080端口,将连接转发到S的80端口上,这样就达到了从本地直接访问S的目的。

事实上ssh的-L参数主要是用来建立一条客户端到服务器之间的安全隧道,以便安全的传输数据。

more ...

一堆小Tips (2)

今天的Tip主题是ssh。

经常有人问,为什么Linux里面的ssh那么难用呢, 就不能有个像secureCRT那样有地址簿的东西么。

答案是,,而且不需要其他的软件,ssh自己就能搞定。

要实现这个功能,首先要在~/.ssh里面建立一个config文件,并设置600权限。

`touch ~/.ssh/config
chmod 600 ~/.ssh/config`

然后在这个文件中加入以下内容(以10.1.1.1为例)

Host 1                     #指定主机名,这个名称可以任意,取对自己方便的就可以
HostName 10.1.1.1    #指定主机的IP,这里是10.1.1.1
User aaa                  #默认登录的用户名
Port 22                    #主机上sshd的端口号

以后,访问10 …

more ...