polipo pac

最近又跟墙斗争了,吗的,升级安卓5之后Nexus 5手机特别耗电,最近终于找到原因了。google认为wifi没有连接,所以一直保持3g的连接,然后导致一些服务也在不停连接,然后就很耗电。这TM不能忍。

考虑到手机还要经常上一些国内的网站,一直保持VPN也不是办法。突然发现,android现在支持在连接wifi的时候设置pac,那就爽了。考虑到教育网翻墙快,我就设想设置一个跳板服务器,通过跳板服务器翻墙。又考虑到好多设备要翻墙,可以搞个缓存,于是就用到了polipo

Polipo配置:

因为教育网的服务器不能翻墙,要设置polipo的转发,主要就是转发。之前设置过shadowsocks,直接转发到shadowsocks端口即可。没有shadowsocks,直接使用ssh转发也可以,只要是socks的都行。主要是shadowsocks比较专业。其他设置查看man。

PAC:

既然wifi就支持PAC,就不需要其他翻墙软件了。我尝试过好几种方案。如根据解析的IP是否是国外,根据dns是否能解析等。最后还是觉得根据域名来比较好,网上有个gfwlist。然后将这里面的域名搞出来,但还是不全,比如gvt1.com就不在里面,没有他就不能在google play上下载东西(gvt1.com好像是google的CDN网络)。我还得考虑google scholar的问题,得用tor翻墙,否则会被认为是机器人。最后的PAC见github

现在手机就好了,以前7个小时的电池能用1天了,爽!而且国内网站不卡,完美。

shadowsocks和systemd

起因:

据说国家局域网在4月就开始实施了,我顿时就吓尿了。上个外网要2次NAT不是坑爹吗。加上最近据说IOS的VPN也被封了。我就觉得手机翻墙应该换个方式了。找了找发现shadowsocks最合适,手机也不用root。在学校这个是没有任何问题的,在家速度好像慢一点,估计是出口的时候非教育网审查比较严格。所以我宁可经过学校的电脑翻墙。那么就需要转发。(电脑可以在学校的电脑开个shadowsocks客户端转成sock5,然后接收所有非本地的请求,浏览器可以直接使用)

解决:

转发有很多种方法,比如github上有人给出的iptables和haproxy,我还是用最简单的ssh吧。可是ssh相当于加密两次(shadowsocks加密,ssh转发加密),有点浪费。 ssh -fNqn -L \*:28765:shadow_server:shadow_port server 。连接服务器时,把相应端口和ip改成学校的即可。

维护:

很久之前就想搞搞systemd,但是KDE的开机启动太方便,以至于我根本不想理systemd。回家不登录图形界面就不能利用KDE了。必须得学学。关于systemd的争议已经很久了。我觉得还是systemd更先进,尽管刚开始接触有点复杂,其实还是很容易使用的。最好的学习方式还是看看别人怎么写的。

根据wiki,可到 /etc/systemd/ 和 /usr/lib/systemd/ 找相应的service看看写法。然后根据manservice,大概就能写出开机脚本了。

这次我是用他来启动一个ssh转发的开机脚本。如下: 一般有ssh都是需要以用户模式启动的,因为要用到认证文件。 systemctl --user enable sshforwarding.service

日志:

journalctl 是和systemd配套的。为了查看服务的运行情况,就要查看日志。用 sudo journalctl -F _SYSTEMD_UNIT 找到要查看的服务的名称,然后 sudo journalctl -e _SYSTEMD_UNIT=shadowsocks@shadowsocks.service 就能查看过滤后的日志,查看连接信息。

测试:

现在手机翻墙感觉快了一点,日。不知道是不是心理作用,youtube能流畅看了。希望国家局域网是谣言,日tm。

实用SSH

已经1个多月没有更新了,上个月突然就事情多了。比如开学交报告,面试工作,然后就是保研了。当然还有其他事,简直麻烦。现在成了保研狗,之前还信誓旦旦说要工作,现在仔细想想,确实现在准备还不充分,1写代码能力还很差,2没有在某个专业有很深的研究。所以还得在读研期间好好学习。


 

SSH在Linux下,是个绝好的东西。因此很有必要进一步掌握它,而不仅仅是只会ssh登录主机。我直接就看了一本书,叫SSH: The Secure Shell The Definitive Guide。我在这里介绍一点其中的精华和比较实用的技巧以及一些SSH高级特性,详细的还得参考书籍。

escape sequences

这是我之前从来没有听说过的,但是却很好用,所以看书还是很有用的。在ssh中同样有转义字符,通常是~。可以在登录ssh后,按下 ~? 来查看用法,会出现以下内容:

我觉得最有用的是 ~^Z ,可以暂时挂起ssh连接,可以使用jobs查看效果,然后fg,重新连接。

ssh-config

直接 man ssh_config ,就能获取大量有用配置。想想现在我有7、8台主机,我还要记IP什么的,很麻烦。最初的做法是用alias,后来发现真是弱爆了。这个只能用来登录什么的,scp就没办法了。使用ssh-config只要创建一个 ~/.ssh/config 文件,然后怎么配置就可以看man,或者参考Simplify Your Life With an SSH Config File。以下是个例子:

这样就方便多了,无论scp还是ssh,都能直接使用 ssh aws  ,如此简洁的命令。

ssh-keygen

我相信很多人的密钥都没有密码,什么意思呢?就是ssh host时,不需要输入密码。其实这是很不安全的。当然现在还来得及补过,只要 ssh-keygen -p -f .ssh/id_rsa 就能在原key的基础上加上一个密码。以下还有一些关于ssh-keygen的用途:

  • ssh-keygen -l -f ~/.ssh/known_hosts    查看本机登录的主机及其指纹
  • ssh-keygen -f .ssh/id_rsa.pub -e -m pem > .ssh/id_rsa_pub.pem  生成pem格式的公钥

ssh-agent

确实id_rsa有密码有时会很不方便,这时可以用ssh-agent解决。我还没有意识到这个问题,所以还没怎么使用,有兴趣的可以参考ssh-agent

scp

这也是非常有用的命令,结合ssh config,我最常用的命令一共3条。

  1. scp aws:text1 text1  从服务器上cp到本机
  2. scp text2 aws:text2  从本机cp到服务器
  3. scp -rp aws:/home/ubuntu ./ubuntu  cp目录并保持权限

exec command

有时登录ssh,只是为了运行一个命令,那么可以简单直接运行。最简单的是 ssh aws ls -al ,当然也有在本地运行命令,然后保存结果到服务器。如 ls -la | ssh aws 'cat > test' 。如果运行的命令比较复杂,则可以通过linux常用方法批量运行。

X11

ssh也支持图像化(X11),首先要在服务器端启用X11 forwarding,当然还要有相应的库。本机执行 ssh -Y aws ,然后试试xterm看看有没有图像,然后接着操作其他高级的图像界面。为了安全起见,最好不要启用X11,实在要用也可以使用vnc。

有时为了远程运行一个图形界面的程序,并且ssh退出后不打断图形程序的运行。比如运行一个bt程序。首先要 export DISPLAY=:0 ,表明使用远程主机的DISPLAY (简单来说,DISPLAY会被设置为localhost:10.0,类似的。10表示监听端口为6000+10,0表示第一个screen,远程主机将图形信息发送的6010,ssh则负责转发到本地),然后使用nohup,如 nohup vuze &

forwarding

这也是ssh不得不说的吊功能。不但可以用来加密,还可以用来穿透防火墙,或者说翻墙。具体有local forwarding,remote forwarding,dynamical forwarding。具体看前一篇,DNS配置

match

如果有个用户比较特别,允许其用密码登录,其他不能用密码登录。Match就能发挥作用了。详细查看man ssh_config. 简单最常用的配置如:

注意match下的规则,是从match下一直结束或者遇到下一个match,小心操作,登不上去就麻烦了。

subsystem

这是ssh的特性之一。最常用的是sftp。然后又发展出sshfs,就是以ssh形式挂载远程文件目录。这体验跟网速延迟有很大关系。延迟小网速快,体验就非常好,跟本地磁盘差不多。简单用法: sshfs -o IdentityFile=/home/york/.ssh/RH-Hadoop.pem ubuntu@54.64.60.106: ~/tmp 其他可以参考sshfs.

这个功能在局域网里简直算吊炸。比如我远程挂载了一个目录/opt,里面有matlab。我就可以在本地执行matlab了。爽不爽。

restart

为了使配置生效,必须重启sshd。这个很讨厌,如果不小心配置错了,登不了服务器就麻烦了。如果能不打断连接的情况下,重启sshd就好了。这点开发者早就想到了。可以用如下命令重启。

reverse ssh

如果你有一台内网机器A(外网无法直接ssh到A),但有一台外网机器B(可以从A直接ssh连接到B),当你要在外网ssh连接A时,就是reverse ssh的用武之地。具体如下:

其中20002端口可以设置成任意其他空闲端口。perfect!

 

链接:

  1. Why passphrase
  2. ssh configSimplify Your Life With an SSH Config File
  3. converting-openssh-public-keys

 

我很高兴有人通过博客联系我。我之前没有外链,纯粹通过搜索引擎。有人能到这里就说明我的内容还是有用的,这也是写博客的动力之一。现在我决定分享到g+和twitter,虽然也没有多少好友。