2015年9月1日星期二

板瓦工重新上货了

之前一直没货的板瓦工又上货了,不过最便宜的套餐依旧没有货。
买回来建站,自己代理还行。

优惠吗(95折):IAMSMART50BAR1


内存:512M
硬盘:10G 
年付:$19.99$11.99(月付$2.99)

每月:1000GB流量
购买 (不要忘记选择 Annually)/ 备用链接购买

512M 10G - 凤凰城 $11.99
https://bandwagonhost.com/aff.php?aff=301&pid=27

1G 20G - 凤凰城 $18.99
https://bandwagonhost.com/aff.php?aff=301&pid=28

512M 10G - 洛杉矶 $19.99
https://bandwagonhost.com/aff.php?aff=301&pid=34

1G 20G - 洛杉矶 $39.99
https://bandwagonhost.com/aff.php?aff=301&pid=35





无推广直接购买
https://bandwagonhost.com/cart.php

2015年8月20日星期四

使用 nghttpx 搭建 HTTP/2 代理 [转]

HTTP/1.1,定义于 1999 年,至今仍在流行。纵使人们试图在它上面添加各种黑科技,但它依然有各种各样的不足。终于,在 2015 年 5 月,HTTP/2 发布了。HTTP/2 基于 SPDY 而建,性能和特性较 HTTP/1.1 有了极大的提升,此外,虽然 HTTP/2 标准本身并没有强制 TLS 加密(HTTPS),但主流实现(Google Chrome, Mozilla Firefox)均要求 HTTP/2 被包裹在 TLS 中,因此,HTTP/2 + TLS(HTTPS)已是事实上的标准
本文中,如无特殊说明,「HTTPS」指代「HTTP + TLS」,其中的 HTTP 可以是 HTTP/1.1, SPDY/3.1 或 HTTP/2;但由于几乎所有的 HTTP/2 实现全部要求 TLS,因此单说「HTTP/2」的话,一般指自带了 TLS 的 HTTP/2。
本文介绍使用 nghttpx 配合 Squid 搭建一个支持 HTTP/2 的 HTTPS 代理的方法。
nghttpx 本身并不是一个代理,它只是一个翻译器,因此如果我们需要一个支持 HTTP/2 的正向 HTTPS 代理,可以用一个 HTTP/1.1 的正向代理(如 Squid)和 nghttpx 接在一起实现。使用这样一个 HTTPS 代理,既可以享受 HTTP/2 对多连接的优化(提高客户端和代理服务器之间的连接流畅度),又可以享受外层 TLS 带来的加密和安全。且由于流量特征是 HTTPS,不仅额外开销小,而且在一些封锁严重的 ISP 里也能应用自如。(如封锁了 DTLS 流量的情况下,OpenConnect / AnyConnect 只能 TCP over TCP,效率很低)

一、需求

需求有两种,一种是客户端原生支持 HTTP/2 的,以下以 Chrome 为例:
+------------+    +------------+    +------------+    +------------+                  
|            |    |            |    |            |    |            |                  
|   Chrome   +----+  nghttpx   +----+   Squid    +----+  Internet  |                  
|            |    |            |    |            |    |            |                  
+------------+    +------------+    +------------+    +------------+                  
如图,nghttpx 与 Squid 部署于服务器上,客户端的 Chrome 与 nghttpx 用 HTTP/2 交流,nghttpx 将请求翻译成 HTTP/1.1 发给 Squid,最后 Squid 抓取了结果返回。
另一种是客户端只支持 HTTP/1.1 的,以下以 Pidgin 为例:
+------------+    +------------+    +------------+    +------------+    +------------+
|            |    |            |    |            |    |            |    |            |
|   Pidgin   +----+  nghttpx   +----+  nghttpx   +----+   Squid    +----+  Internet  |
|            |    |            |    |            |    |            |    |            |
+------------+    +------------+    +------------+    +------------+    +------------+
如图,Pidgin 将 HTTP/1.1 请求发给本机的 nghttpx,本机的 nghttpx 翻译成 HTTP/2 之后发给服务器上的 nghttpx。之后的过程和上一种相同。

二、工具

nghttp2 是一个很优秀的 HTTP/2 的 C 类实现。它的前身是 SPDY 库 spdylay,作者都是 Tatsuhiro Tsujikawa,同时他也是著名下载工具 Aria2 的作者。nghttp2 含有多个组件,其中的 nghttpx 程序,可以进行 HTTP/2 和 HTTP/1.1 之间的翻译,如果编译时链接了 spdylay,它也可以支持 SPDY/3.1。
如果你是 Arch Linux 用户,可以直接使用我维护的 aur/nghttp2 包,直接 yaourt -S nghttp2 即可,吃豆人会帮你照料好剩下的一切。
如果你是 Debian / Ubuntu 用户,请按照官方 README 完成编译操作,编译完成后在 contrib 目录里可以找到 Upstart 配置文件。注意:nghttp2 库默认是不带 SPDY/3.1 支持的,如果需要 SPDY 支持,请先编译 spdylay 再编译 nghttp2,后者会自动检测到 spdylay 的存在并链接。
如果你是 CentOS 用户,祝您今天有个好心情

三、服务器配置

无论是哪种需求,服务器上都需要 nghttpx 和 Squid。

nghttpx

服务器上 nghttpx,前端接受的是来自客户端的 HTTP/2 请求,后端是 Squid,最小配置是这样:
frontend=0.0.0.0,443
backend=127.0.0.1,3128
private-key-file=/path/to/private/key
certificate-file=/path/to/certificate
http2-proxy=yes
其中私钥和证书必须是客户端认可的。你可以选择:
  • 去 NameCheap 之类的网站上买一个商业证书,低至 $9 一年;
  • 自己用 OpenSSL / GnuTLS 等工具签一个,然后在你的客户端里强制设置为信任;
  • 如果你不愿意花钱也不愿意折腾 OpenSSL,那你可以尝试去找家免费的 CA 给你签一个。
需要说明的是,GFW 曾被报道会区分商业证书和野证书并对后者做定点清除。试图使用野证书的同学请将此因素考虑在内。
以上只是最小配置,我个人使用的配置还加上了以下内容,是我在 nghttpx 的文档中挑出来觉得比较有用的选项:
# 使用四个 worker,请根据自己服务器的 CPU 合理调整,太小性能差,太大机器挂
workers=4
# 开启客户端 TLS 认证
verify-client=yes
verify-client-cacert=/path/to/client/ca
# 不添加 X-Forwarded-For 头
add-x-forwarded-for=no
# 不添加 Via 头
no-via=yes
# 不查询 OCSP 服务器
no-ocsp=yes
# 指定 NPN / ALPN 的顺序
npn-list=spdy/3.1,h2
# 只使用 TLS 1.2
tls-proto-list=TLSv1.2
# 开启日志功能
accesslog-file=/var/log/nghttpx/access.log
accesslog-format=$remote_addr [$time_iso8601] "$request" $status $body_bytes_sent $alpn "$http_user_agent"
有关 --npn-list 选项:前文已经说明了,nghttp2 如其名字所示,是一个 HTTP/2 的库,但是由于 Chromium / Google Chrome 的一个bug(发稿时最新的 v45 仍未修复),Cr 对 HTTP/2 代理的支持有点问题(Firefox nightly 没有问题),而 nghttpx 默认的 NPN / ALPN 顺序是 h2 优先的,所以需要在这里把 spdy/3.1 的优先级调成最高,以便让 Cr 能用 SPDY/3.1 协商……
有关 --verify-client 功能:请看下文「有关鉴权」一节。

Squid

Squid 是一个久经考验的正向代理。在我们的用例中,它是 nghttpx 的后端,只需监听 localhost 即可。我用的最小配置如下:
http_port 127.0.0.1:3128
http_access allow localhost

# 关闭缓存功能和日志功能
cache deny all
access_log none

# 优先访问 IPv4 站点,有完整 IPv6 支持的机器可以去掉
dns_v4_first on
# 不添加 Via 头
via off
# 删除 X-Forwarded-For 头
forwarded_for delete
我曾试图让 nghttpx 把源 IP 地址发给 Squid 然后让 Squid 记到日志里,但是未能成功,于是 Squid 始终只能记到一堆来自 127.0.0.1 的请求,干脆就把 Squid 的日志关闭,让 nghttpx 去记日志了。
一个可能会让强迫症不爽的地方是,Squid 默认的错误页面会引用 Squid 官网的图片(一只乌贼),而这个图片资源是 http:// 的,因此页面会带有「混合内容」,强迫症用户可以通过编辑 errorpage.css 把这个去掉:
background: url('http://www.squid-cache.org/Artwork/SN.png') no-repeat left;
或者像我一样把这个图片换成 data:image/png;base64 嵌在 CSS 里……

有关鉴权

只按照最小配置来做的话,配置出来的 HTTP/2 代理是没有任何鉴权的,任何人都可以把这个地址填进 Chrome 里当代理用,也就是说,这是一个开放代理。但实践证明:
  • 如果你在公网上搭一个不带 TLS 的 HTTP/1.1 开放代理的话,分分钟各种爬虫就会把你的地址撸走,教你做人;
  • 如果你在公网上搭一个带 TLS 的 HTTP/1.1 开放代理的话,来光顾你的爬虫就非常非常少了,几个月也遇不到几只;
  • 如果你在公网上搭一个只允许 TLS 1.2 的 HTTP/2 开放代理的话,根本不会有爬虫来光顾你……
所以,如果不想弄鉴权的话,问题也不大,因为目前根本没有 TLS 1.2 + HTTP/2 的爬虫,除非你主动把地址告诉别人,否则不会有人来用你的代理。不过,这样毕竟只是迷宫,而不是门锁,所以为了安全还是可以配置一下鉴权。
在这种 TLS 1.2 + HTTP/2 的结构下,鉴权可以在两个阶段做:TLS 和 HTTP/2(感觉是废话),也就是 nghttpx 和 Squid(好像还是废话)。
在 TLS 层面做鉴权的话,就是用上文所述的 --verify-client 了。你需要自己维护一个 CA,然后把 CA 的根证书放到服务器上,持有该 CA 根证书的私钥签出的证书对应的私钥的用户可以使用该代理,否则根本完成不了 TLS 握手,直接被拒绝。CA 的搭建和管理又是一个巨大的话题了,在此不多做叙述,只是推荐一下两个软件:适用于 GNU/Linux 用户的 XCA,和适用于 OS X 用户的 Keychain。这两个都是能够管理中小型 CA 的 GUI 程序。我个人使用的则是 EasyRSA。当然如果你足够硬核,也可以直接使用命令行的 OpenSSL 去管理 CA。再次强调,这个 CA 只是客户端认证所用的,和你买证书的那种商业 CA 没有也不应该有联系
在 HTTP 层面做鉴权的话,请照着 Squid 官方文档做。
推荐用 TLS 鉴权,你会爱上它的。而且 TLS 鉴权的话,Chrome 能用 AutoSelectCertificateForUrls 策略自动选证书,不用每次开 Chrome 的时候点一下。

四、客户端配置

客户端配置分为两种。Chrome 和 Firefox 等直接支持 HTTP/2 代理的,直接填进去就行。大部分不支持的程序,需要在本地再起一个 nghttpx,翻译一下,在本地生成一个 HTTP/1.1 的代理,供程序使用。

无需翻译的程序

Chromium / Google Chrome 理论上支持 HTTPS 代理的,但是如上文所述,目前由于一个 bug 的存在,对 HTTP/2 代理的支持有问题,暂时只能用 SPDY/3.1;Firefox 曾经不能正常使用 HTTPS 代理(当年 Chrome 是唯一能使用 HTTPS 代理的浏览器),现在它的 nightly 版本反而是支持 HTTP/2 了而超越了 Cr……
令人郁闷的是,无论是 Cr 还是 Fx,它们都未提供直接配置的 GUI,只能通过命令行或插件的方式来使用 HTTPS 代理。比如这样一个 pac 文件便可以让 Cr 和 Fx 使用 HTTPS 代理了:
function FindProxyForURL(url, host) {
  return "HTTPS proxy.example.org:443";
}
当然,pac 文件可以写得非常复杂,也可以使用浏览器插件进行更灵活的代理配置。Cr 用户推荐使用 SwitchyOmega

需要翻译的程序

如前文所述,目前除了 Cr 和 Fx,大部分软件是不支持 HTTP/2 的,而 nghttpx 是个 HTTP/1.1 和 HTTP/2 的翻译器,因此我们可以在本机起一个 nghttpx 生成一个 HTTP/1.1 的代理供不支持 HTTP/2 的程序使用。这种情况下,nghttpx 的前端接收 HTTP/1.1 的请求,然后翻译成 HTTP/2 发给服务器上的另一个 nghttpx 实例。最小配置如下:
frontend=127.0.0.1,8080
backend=proxy.example.org,443
client-proxy=yes
同样地,这只是最小配置,我个人使用的配置中还有以下选项:
# 认证用证书和私钥,如果你没用 TLS 认证则不需要
client-cert-file=/path/to/certificate
client-private-key-file=/path/to/private/key
# 四个 worker,请根据自己计算机/手机性能调整
workers=4
# 不添加 X-Forwarded-For 头
add-x-forwarded-for=no
# 不添加 Via 头
no-via=yes
# 不查询 OCSP
no-ocsp=yes
# NPN / ALPN 优先使用 h2
npn-list=h2
另外可能有用的选项是 -k。如果你用了野证书,这个选项让 nghttpx 放弃证书校验(不安全!),此外它在手机等慢速网络下也有缩短启次握手时间的效果。另外如果你想看实时请求情况的话,加上 -L INFO 能看到漂亮的彩色输出。这个 nghttpx 跑起来之后,别的程序设置 http://127.0.0.1:8080 为代理即可使用。
刚才提到了手机。是的,手机。Tatsuhiro Tsujikawa 大大的程序都是为 Android 交叉编译优化过的。(什么,您是 iOS 用户?您还是用您的 APN 代理,也就是 HTTP 明文代理吧……)
在 nghttp2 的文档中,提供了两种方便的交叉编译 Android 版 nghttpx 的方法,一种是自己装 Android NDK 和依赖,然后用android-config 和 android-make 脚本自动做。另一种是用 Dockerfile.android 文件,在 Docker 容器里装上乱七八糟的编译环境和依赖,最后产出珍贵的 nghttpx 文件并复制到容器外面来。编译完的二进制文件记得 strip 一下,能从 11 MiB 减到 2 MiB……
在 Android 上运行起 nghttpx 之后(可以用 JuiceSSH 之类的起一个,无需 root),推荐配合 Drony 使用(也无需 root),该应用使用VpnService() 捕获所有应用流量,然后再按照你定的规则(来源地址、应用名、目标主机名、目标端口号、HTTP 方法等),将这些流量进行分流(直连、截断、传给代理、交给 pac 处理等)。

五、尾声

我竟然已经整整一年没有写博客了。一年里可以写的东西其实不少,但是由于各种原因的确没怎么写。今天因某人提醒我一年没更新了,又正好手头的事情告一段落,于是便这么写了一篇。也算是能造福一些人吧。
最后,Google Chrome 使用 HTTP/2 代理看 YouTube 4k 效果如下:











本文原载于: https://wzyboy.im/post/1052.html
如有转载请注明。

2015年8月17日星期一

将 GoProxy 的 php fetchserver 部署在云平台上并用其翻墙 【转】

简介

GoProxy 中的 php fetchserver 使用了 多种 程序语言实现: Golang, JavaScript, PHP. 任一种都可用来部署。

部署

根据云计算平台不同,部署步骤会有相同。

OpenShift

  • php fetchserver 所用语言: golang
  • 看视频时下载速度: 需手动测试。供测试的服务端 https://mygo-yxorpog.rhcloud.com/ , 密码123456

步骤

服务端

  • OpenShift 部分
    1. 注册 OpenShift 账号: https://www.openshift.com/app/account/new
    2. 进入邮箱,如 Gmail https://mail.google.com
    3. 找到收件箱中 OpenShift 发来的邮件(若收件箱里没有,有可能会在垃圾箱里),点击 Verify Your Account 字样的链接,然后在打开的页面中点击 Accept
    4. OpenShift 部分至此结束,可放心关掉 OpenShift 相关的网页
  • Cloud9 IDE 部分
    1. 注册 Cloud9 IDE 及进入 IDE 环境
      可参考https://docs.google.com/document/d/1Wxwl4HrvIpie9xIRRMzasdW_HAuthBFjqL_hQCKBIfE/edit中 步骤 中的 注册 和 工作空间
    2. 进入 IDE 环境后依次书写以下命令:
      • rhc setup
        然后按回车键,此时会出现 Enter the server hostname: |openshift.redhat.com| 的字样,不用管,直接再按一次回车键。然后会出现 Login to openshift.redhat.com: 此时应输入你注册 OpenShift 时所用的邮箱地址,并按回车键,然后输入密码,再回车键。出现Generate a token now? (yes|no) 输入 yes 后按回车键,再继续输入 yes , 按回车。然后会出现 Please enter a namespace (letters and numbers only) |<none>|: 此时输入你想给空间命的名字,这个名字必须是 OpenShift 中唯一的,如果出现重复会提示你重新命名一个,然后按回车。然后输入下面的命令
      • 然后按回车,并等待应用创建完成。至此服务端创建完毕,接下进入客户端。
        注意: 
        1. mygo 是应用名,可随意填写
        2. php 默认密码是 123456 , 可 fork 后手动修改

客户端

  • GoProxy
    1. 下载 https://github.com/ARwMq9b6/goproxy/archive/config.zip , 解压后将里面的 main.user.json(作用是使 php 优先)和 php.user.json 放到 GoProxy 的目录里
    2. 修改 php.user.json , 将里面的 https://mygo-yxorpog.rhcloud.com/ 修改为您自己的——将其中的 mygo 替换为您的应用名(若未自定义,默认是 mygo ), yxorpog 替换为您的空间名,即Please enter a namespace (letters and numbers only) |<none>|: 这一步所填写的名字
  • 浏览器
    设置代理服务器为 127.0.0.1:8000 类型 https , 若不行就选 http

Heroku

待补充……
Fork 了一个 WiKi : https://github.com/ARwMq9b6/goproxy/blob/wiki/PHPDeployment.md , 可多人协作。

2015年8月16日星期日

shadowsocks 屏蔽端口,iptables方法 【转】

若作为一个公共的代理,必须对服务有所限制,不然就成了公交车了。linux下可以对端口进行限制来保护自己变成发垃圾邮件等其他运营商讨厌的替罪羊。

只留SSH,SQL,DNS,HTTP,HTTPS端口
环回网络
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
DNS
iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
网页-SQL
iptables -A OUTPUT -p tcp -m multiport --dport 80,443,3306 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --sport 80,443,3306 -j ACCEPT
代理-SSH
iptables -A OUTPUT -p tcp -m multiport --sport 1080,22 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 1080,22 -j ACCEPT
用户
iptables -A OUTPUT -p tcp --sport50000:60000 -j ACCEPT
iptables -A OUTPUT -p udp --sport50000:60000 -j ACCEPT
iptables -A INPUT -p tcp --dport50000:60000 -j ACCEPT
iptables -A INPUT -p udp --dport50000:60000 -j ACCEPT
连接数
iptables -A OUTPUT -p tcp --sport50000:60000 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp --dport50000:60000 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset
其他
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
禁止
iptables -P OUTPUT DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
请把你的SSH22端口改了
=====================================

屏蔽其他端口
iptables -A OUTPUT -p tcp -m multiport --dport 21,22,23 -j REJECT --reject-with tcp-reset
iptables -A OUTPUT -p udp -m multiport --dport 21,22,23 -j DROP
=======================================

屏蔽邮箱端口
iptables -A OUTPUT -p tcp -m multiport --dport 24,25,50,57,105,106,109,110,143,158,209,218,220,465,587 -j REJECT --reject-with tcp-reset
iptables -A OUTPUT -p tcp -m multiport --dport 993,995,1109,24554,60177,60179 -j REJECT --reject-with tcp-reset
iptables -A OUTPUT -p udp -m multiport --dport 24,25,50,57,105,106,109,110,143,158,209,218,220,465,587 -j DROP
iptables -A OUTPUT -p udp -m multiport --dport 993,995,1109,24554,60177,60179 -j DROP

======================================
限制白名单网站访问
https://github.com/fifilyu/module-http-whitelist

至于限制用户的带宽,用TC控制!

还有个防止被用来CC和敏感词的,可以安装nginx添加个其他端口的规则,用iptables nat把80端口转发到你所设置端口处理内容,然后安装云锁(对nginx检测),就有所提防了。

2015年8月2日星期日

vps服务器的安全设置【转】

我们在购买了 Linux 系统的 VPS 或服务器后,一般的商家都会给你一个 root 权限的账号,并且默认的密码不会太长,这是很不安全的。经常有客户因为弱口令而被黑客暴力破解密码导致 VPS 服务器被入侵,并用来干坏事。

所以,在开通了 Linux 系统的 VPS 或服务器后,我们有必要做一些基本的安全设置。

一、关闭 SSH 密码登陆

首先,你需要有自己的 SSH Key,如果你使用 Windows 系统,可以用 Putty 下的 PUTTYGEN.EXE 生成私匙和公匙。

第一步,运行 PUTTYGEN.EXE



一般,我们选择默认的 RSA 加密即可,默认的 1024 位加密足够用,如果要保险点,可以选择 2048 或 4096 位加密,如图红圈处:



第二步,点击 Generate ,然后鼠标随意在空白处移动



等进度条满了,就生成好你的 SSH Key 了:



如果要更安全一点,可以设置 Key Passphrase ,也就是密码,这个密码和 root 密码不同,一旦别人获取了你的 Key ,没有这个密码他也加载不了你的 Key。

第三步,点击 Save Public Key 保存你的公匙,整个文件如下

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "showfom-rsa-key-20130701"
AAAAB3NzaC1yc2EAAAABJQAAAQEAna/D52fTZ1YNjxnwAJAUhxRdPCwar8ZfWLdw
HEmT64Zqtxrz65KRxesHFRVND8Xn1GKtuQIQMu/d5fFhEajFbjoSw/n+Mz58irzU
XDbE34Y/nxy1/iWc6aJz6lX6wT7nnDcVoqX8Be8j/8sjS7cMFarn3Iy+0bSQNON3
681+hEFM7mpoYyqrCVBpARfiiEZb8tNkfzrKJFrciZ87yaKkncPeDCIbYKjuJY2h
ciK+Y+IptLdoMj5kQkSXStJFQUfFg+s3FQJ9Istu4C7BF3ZafD4mEupA7P90RRUj
Lj95mUW/P/ebWGsMVbnxz/Xmq3OL/TOuo85umbSN44DmSB3NEQ==
---- END SSH2 PUBLIC KEY ----
其中中间那么长长的一串,就是你的公匙了,可以放在服务器的 ~/.ssh/authorized_keys ,我们应采取以下的格式:

1
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAna/D52fTZ1YNjxnwAJAUhxRdPCwar8ZfWLdwHEmT64Zqtxrz65KRxesHFRVND8Xn1GKtuQIQMu/d5fFhEajFbjoSw/n+Mz58irzUXDbE34Y/nxy1/iWc6aJz6lX6wT7nnDcVoqX8Be8j/8sjS7cMFarn3Iy+0bSQNON3681+hEFM7mpoYyqrCVBpARfiiEZb8tNkfzrKJFrciZ87yaKkncPeDCIbYKjuJY2hciK+Y+IptLdoMj5kQkSXStJFQUfFg+s3FQJ9Istu4C7BF3ZafD4mEupA7P90RRUjLj95mUW/P/ebWGsMVbnxz/Xmq3OL/TOuo85umbSN44DmSB3NEQ== showfom-rsa-key-20130701
其中 ssh-rsa 为加密类型, showfom-rsa-key-20130701 为说明,可以是任意文本,如 showfom-notebook

第四步,点击 Save Private Key 生成用于 Putty 的私匙,这里我们保存为 showfom.ppk ,整个文件如下

PuTTY-User-Key-File-2: ssh-rsa
Encryption: none
Comment: Showfom
Public-Lines: 4
AAAAB3NzaC1yc2EAAAABJQAAAIBTILl54rOaEEkv95VKR6IEZ9Y0d1IpNNQeyk+e
yHPtc7jVTmfL0oiho9s2UqquaNGmLmzLjhXRj3cPZ1VZInPFqVtgWYKWPEpGckGI
7/iTpNUuz6tKguEi5RYaEtfgKWF13qC5S8dWlk2FGv7dY5GbSoZMHZtc+zTL9Jpn
NCa5nw==
Private-Lines: 8
AAAAgEWly9TSsiciZtUpYWe/eegD+Kh/pbPSUNuG6MNOAEN8ocd5Ctsz2kI9LUkw
gSpX0j8f+kmuZU62eIKHAlGZZ+nVyklcHE7qFO2AyMCuniUYm0mgdN5gjXUBFduV
VTjIaYwd282Yo0xtjPWN0DJF3jmmsrw6pwMwaa6r6pAlKANtAAAAQQClYrYCu3eu
0GcGw9G2MVLIZoHoKYPL2e6HjfPQhvsze6AKUzpTF/DGMkBFY6dH//0zSoHue2jn
gNsaLQygBvT/AAAAQQCArGNL76eXHtR28TRY2PONg8ij3YN9mCzYG3sDsV8feGAk
RyZ8T5b6xZuf9UyvZ1lIA10i7ULZ63s2hvCZUxthAAAAQD+auXN8fUAylROh8zTM
14FyY7GRwdN7y7+EtZ8NuVDLvZP9Svpd4V5Ti9LpqjtiUcp0eELCd5i7zxyV2oHe
U78=
Private-MAC: ce0968aff198e2c2550704625b23ba7575e6b260
这个 showfom.ppk 你需要通过 Putty 目录下的 PAGEANT.EXE 导入,这样你就可以不需要输入 root 密码即可登录你的 VPS。

PS: WinSCP 和 Putty 的 SSH Key 是通用的,只需要导入一次即可。

但是 Putty 的 Private Key 是不标准的,只能用于 Putty 或 WinSCP ,如果你使用 Xshell 4 ,则需要转换成 rsa 文件,可以在 PUTTYGEN.EXE 上方菜单里的 Conversions > Export OpenSSH Key 方式转换。

第五步,导入你的 Linux VPS 或服务器

如果你本地是 Linux 桌面环境,可以很简单的一条命令搞定:

ssh-copy-id -i ~/.ssh/id_rsa.pub root@198.51.100.100
但是大多数用户还是 Windows 用户,所以我建议两种比较简单的方法

1、把自己的公匙放在 https://launchpad.net/ 网站,并得到类似 https://launchpad.net/~showfom/+sshkeys 这样的地址,然后通过以下命令导入你的 Key

curl https://launchpad.net/~showfom/+sshkeys > ~/.ssh/authorized_keys
如果没有 .ssh 目录,可以新建立一个

mkdir .ssh
2、也可以直接写入 authorized_keys 文件

1
2
3
4
cat >>/root/.ssh/authorized_keys<<EOF

ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAna/D52fTZ1YNjxnwAJAUhxRdPCwar8ZfWLdwHEmT64Zqtxrz65KRxesHFRVND8Xn1GKtuQIQMu/d5fFhEajFbjoSw/n+Mz58irzUXDbE34Y/nxy1/iWc6aJz6lX6wT7nnDcVoqX8Be8j/8sjS7cMFarn3Iy+0bSQNON3681+hEFM7mpoYyqrCVBpARfiiEZb8tNkfzrKJFrciZ87yaKkncPeDCIbYKjuJY2hciK+Y+IptLdoMj5kQkSXStJFQUfFg+s3FQJ9Istu4C7BF3ZafD4mEupA7P90RRUjLj95mUW/P/ebWGsMVbnxz/Xmq3OL/TOuo85umbSN44DmSB3NEQ== showfom-rsa-key-20130701
EOF
在某些服务商的 CentOS 系统里,由于开启了 SELinux ,默认是禁止了 .ssh 目录的权限的,可以用下面的命令解除限制:

restorecon -R -v /root/.ssh
如果遇到 authorized_keys 权限问题,可用如下命令解决:

chattr -i authorized_keys
然后你可以重启开启一个 SSH 窗口,测试是否不需要输入密码即可用 root 登陆。

第六步,关闭 SSH 密码登陆

编辑 SSH 配置文件:

vim /etc/ssh/sshd_config
找到

#PasswordAuthentication yes
并改为

PasswordAuthentication no
保存,退出,重启 SSH 服务

Ubuntu 下:

/etc/init.d/ssh restart
CentOS 下:

service sshd restart
好了,这样禁止 SSH 密码登陆就大功告成,这一步就拒绝了 90% 的入侵危险,当然,你自己的私匙一定要保存好,否则被别人偷走可是不需要密码就能进你的服务器哦。

二、安装 CSF 防火墙屏蔽尝试入侵服务器的 IP

CSF 防火墙安装略简单,几个命令即可搞定:

rm -fv csf.tgz
wget http://www.configserver.com/free/csf.tgz
tar -xzf csf.tgz
cd csf
sh install.sh
然后运行 perl /usr/local/csf/bin/csftest.pl 检测是否安装成功

为了防止系统误屏蔽本地 IP,可以修改 /etc/csf/csf.allow 和 /etc/csf/csf.ignore 文件加入你需要的白名单 IP ,然后用 csf -r 命令重启读取配置文件即可。

三、用 iptables 只开启常规端口

一般我们只需要开启 22, 53, 80, 443 这三个常见的对外开放端口,可以使用如下命令

清空 iptables 默认规则

iptables -F
允许 22 端口进入和返回

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
允许 53 端口,一般作为 DNS 服务使用

iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --sport 53 -j ACCEPT
允许本机访问本机

iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
允许所有 IP 访问 80 和 443 端口,一般作为 http 和 https 用途

iptables -A INPUT -p tcp -s 0/0 --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
保存配置

iptables-save > /etc/sysconfig/iptables
重新加载 iptables

iptables -L
四、安装 fail2ban 屏蔽并举报扫描 SSH 端口的 IP

有很多精力旺盛的家伙会整天扫描 SSH 密码,当然直接关闭 SSH 密码登陆即可防止,但是为了给他们一点教训,可以安装 fail2ban ,屏蔽之余,还能自动写举报信给 IP 所在的 ISP。

CentOS 下安装:

导入 epel 源:

CentOS 6.x 32 位:

rpm -Uvh http://download.fedoraproject.or ... ease-6-8.noarch.rpm
CentOS 6.x 64 位:

rpm -Uvh http://download.fedoraproject.or ... ease-6-8.noarch.rpm
安装 fail2ban

yum -y install fail2ban
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
service fail2ban start
Ubuntu / Debian 下安装:

apt-get install fail2ban -y
通过查看 /var/log/fail2ban.log 文件即可知道有哪些精力过剩的家伙在整天扫描你的 SSH 了。

后记

因为近期不少客户的 VPS 或服务器被黑客入侵,原因都是用了很简单的 root 密码,所以考虑以后卖无管理型的 VPS 时,直接做个屏蔽密码的系统,用户购买的时候提交自己的 SSH Key ,或者系统分配你一个 SSH Key ,这样就会安全多。国外的 Amazon EC2、 DigitalOcean 和 HPCloud 均有导入自己 SSH Key 并默认屏蔽密码的方式,大大增加了安全性。


转自:http://ttt.tt/104/