VPS 不仅可以用来搭建 PPTP、L2TP/IPSec 和 OpenVPN,而且还可以直接作为 SSH 代理跳墙(我自己搭建的是L2TP/IPSec的方式,但是,电脑上基本上是连上就断,手机上却可以正常访问,在调试的时候觉得应该是OpenSwan的问题,不知谁能解答一下?)。
以下将介绍一个如何把 VPS 作为 SSH 代理跳墙的简易方法:
I、连接 VPS
对 Windows 来讲,你可以安装一个 SSH 客户端(例如 Putty), 对 Mac 来讲,你也可以安装一个 SSH 客户端(例如 Issh),但更简单的方法是直接在终端应用程序上通过以下命令连接:
ssh -N -D 7070 [email protected] -p 22222
记得将 “94.249.184.93″ 替换成你 VPS 的 IP 地址,将22222换成你的修改了之后的SSH端口,按下 “Return” 键,输入 VPS 登录密码,如果正确,回车后你将看不到任何新的内容(可以加入-f选项当连接成功后进入后台运行)。
顺便说一下,不管你的 VPS 事先是否已经安装了 VPN,你都可以把 VPS 作为 SSH 代理,这不会影响 VPN 的使用。
技巧:
尽管以上是最简单的连接方法,但是只能供你一个人使用――除非你想把自己的 VPS 帐户和别人分享。而如果要和别人分享同一个 SSH 代理,你可以通过以下 4 个步骤新建一个受限的 VPS 用户:
1、登录 VPS
在终端应用程序上输入以下命令(设置了密钥访问的自行修改,比如添加”-i”和”-p”选项):
ssh [email protected]
记得将 “94.249.184.93″ 替换成你 VPS 的 IP 地址。
2、创建一个用户组
输入以下命令:
groupadd sshproxy
你可以将 “sshproxy” 替换成任意名字。
3、创建受限用户
输入以下命令:
useradd -d /home/sshproxy -m -g sshproxy -s /bin/false sshproxy
以上命令将会在 “sshproxy” 创建一个新的 SSH 用户 “sshproxy”,该用户只能使用 SSH 代理,不能登录你的 VPS 帐户(设置shell为/bin/false的效果)。
4、为新用户设置密码
输入以下命令:
passwd sshproxy
然后,为该用户设置任意密码 (例如 “123456″)。
完了之后,你就可以把该用户名和密码分享给朋友,他们也就可以通过以下命令使用你的 SSH 代理:
ssh -N -D 7070 [email protected]
记得把 “sshproxy” 替换成你新建的用户名,把 “94.249.184.93″ 替换成你 VPS 的 IP 地址。
确实是可以跳墙,但是,真的很不稳定:
channel 2: open failed: connect failed: No route to host
channel 2: open failed: administratively prohibited: open failed
channel 8: open failed: connect failed: Connection timed out
……
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
# useradd -h
用法:useradd [选项] 登录
useradd -D
useradd -D [选项]
选项:
-b, –base-dir BASE_DIR 新账户的主目录的基目录
-d, –home-dir HOME_DIR 新账户的主目录
-D, –defaults 显示或更改默认的 useradd 配置
-g, –gid GROUP 新账户主组的名称或 ID
-G, –groups GROUPS 新账户的附加组列表
-m, –create-home 创建用户的主目录
-M, –no-create-home 不创建用户的主目录
-s, –shell SHELL 新账户的登录 shell
小知识:/sbin/nologin和/bin/false的区别
/bin/false是最严格的禁止login选项,一切服务都不能用,而/sbin/nologin只是不允许系统login,可以使用其他ftp等服务。
如果想要用false在禁止login的同时允许ftp,则必须在/etc/shells里增加一行/bin/false。
小技巧:
查看 /etc/passwd文件,能看到各用户使用的shell
nologin
当用户配置成/sbin/nologin时,如果再使用该用户ssh到linux操作系统,会提示
This account is currently not available.
如果在树莓派下,配置错误,误将/usr/sbin/nologin配置成/sbin/nologin,SSH时会提示
root@raspberrypi:/home# useradd -s /sbin/nologin piaohailin
root@raspberrypi:/home# su piaohailin
Cannot execute /sbin/nologin: No such file or directory
false
当用户配置成/bin/false时,ssh之后显示如下:
root@raspberrypi:/home# useradd -s /bin/false piaohailin
root@raspberrypi:/home# su piaohailin
root@raspberrypi:/home# whoami
root
不会有任何提示,用户切换不过去。
绑定本地端口
既然SSH可以传送数据,那么我们可以让那些不加密的网络连接,全部改走SSH连接,从而提高安全性。
假定我们要让8080端口的数据,都通过SSH传向远程主机,命令就这样写:
$ ssh -D 8080 user@host
SSH会建立一个socket,去监听本地的8080端口。一旦有数据传向那个端口,就自动把它转移到SSH连接上面,发往远程主机。可以想象,如果8080端口原来是一个不加密端口,现在将变成一个加密端口。
SSH的默认端口是22,也就是说,你的登录请求会送进远程主机的22端口。使用p参数,可以修改这个端口。
$ ssh -p 2222 user@host
上面这条命令表示,ssh直接连接远程主机的2222端口。
本地转发
有时,远程机器能访问某个端口(如remote-secret.com:8080),但本地机器无法访问。这时使用SSH的本地转发功能,即可将远程端口映射到本地:
$ ssh -L 9090:remote-secret.com:8080 my-remote-host.com
此时访问本地的9090端口就相当于用远程服务器my-remote-host.com访问remote-secret.com:8080。
提示:如果写成-L 9090:localhost:8080,就是把远程服务器的8080端口映射到本地的9090端口了
应用举例:如果远程服务器处于某受保护的内网中,可以借助其SSH服务获得与其等同的访问权限。
提示:默认情况下,本地转发的端口只能在本机上访问,要想允许外部访问,请添加-g选项。
参考链接:
- http://www.bing.com/search?q=%E7%94%A8vps%E7%BF%BB%E5%A2%99+ssh&mkt=zh-CN
- http://www.iokay.net/it-technology/ssh-proxy/
- 实战 SSH 端口转发 – http://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/index.html
- http://linux-wiki.cn/wiki/SSH%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%EF%BC%88%E9%9A%A7%E9%81%93%EF%BC%89
- http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html
- http://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.html
- http://www.lampblog.net/2011/10/%E5%A6%82%E4%BD%95%E6%8A%8Avps%E4%BD%9C%E4%B8%BAssh%E4%BB%A3%E7%90%86%E7%BF%BB%E5%A2%99/
《 “如何把VPS作为SSH代理跳墙” 》 有 21 条评论
利用反向ssh从外网访问内网主机
http://blog.mythsman.com/?p=3485
linux系统的3种端口转发方式
http://www.hi-roy.com/2016/05/20/linux%E7%B3%BB%E7%BB%9F%E7%9A%843%E7%A7%8D%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E6%96%B9%E5%BC%8F/
反向TCP隧道,使得NAT或防火墙后的内网机器可以被外网访问
https://github.com/aploium/shootback
SSH端口转发
https://www.secpulse.com/archives/55681.html
http://mp.weixin.qq.com/s?__biz=MzIyNjQzMjcyNw==&mid=2247484392&idx=1&sn=6a413c8d9625b1f175dc461d9bca4709&scene=1#rd
[Tools]代理转发工具汇总分析: https://www.t00ls.net/articles-35614.html
1. http://www.freebuf.com/articles/system/12182.html #Socks代理反弹突破内网
2. http://www.cnseay.com/3972/ #奇人绝技:利用php socket5代理进行内网渗透测试
3. https://www.91ri.org/14390.html #内网渗透随想
4. http://le4f.net/post/reverse-shell-during-the-penetration-test #渗透测试:反弹与转发小结
5. http://staff.washington.edu/corey/fw/ssh-port-forwarding.html #ssh 端口转发
开源项目 OpenVPN 2.4.0 版本的安全审计报告
http://blog.quarkslab.com/security-assessment-of-openvpn.html
A Red Teamer’s guide to pivoting(端口转发指南)
https://artkond.com/2017/03/23/pivoting-guide/
sshttp – 可以将 SSH 服务隐藏在 HTTP 服务之后
https://github.com/stealth/sshttp
方便快速用iptables做端口转发的bash脚本(Bash scripts to help setup port redirects with iptables)
https://github.com/foospidy/ipt-kit
Linux 端口转发特征总结
https://mp.weixin.qq.com/s?__biz=MzA3Mzk1MDk1NA==&mid=2651903919&idx=1&sn=686cc53137aa9e8ec323dda1e54a2c23
http://lisux.me/lishuai/?p=439
【技术分享】SSH如何反向代理稳定穿透内网
http://bobao.360.cn/learning/detail/4234.html
聊聊端口复用的实现和坑点
https://mp.weixin.qq.com/s/JMjPYox-wvcvcCaQQcnMDw
`
0x00 开篇
0x01 端口复用要点
0x02 端口复用的坑点
0x03 端口复用过程
0x04 端口复用源码分析
0x05 总结
`
Intelligent proxy pool for Humans
https://github.com/imWildCat/scylla
一种把指定程序的 TCP 流量重定向到代理的方法
https://www.v2ex.com/t/476594
https://github.com/hmgle/graftcp
`
graftcp 可以把任何指定程序(应用程序、脚本、shell 等)的 TCP 连接重定向到 SOCKS5 代理。
对比 tsocks、proxychains 或 proxyChains-ng,graftcp 并不使用 LD_PRELOAD 技巧来劫持共享库的 connect()、getaddrinfo() 等系列函数达到重定向目的,这种方法只对使用动态链接编译的程序有效,对于静态链接编译出来的程序,例如默认选项编译的 Go 程序,proxychains-ng 就无效了。graftcp 使用 ptrace(2) 系统调用跟踪或修改任意指定程序的 connect 信息,对任何程序都有效。
`
SSH隧道综合指南
http://www.4hou.com/technology/10863.html
[Linux] 玩转 SSH 端口转发
https://www.v2ex.com/t/488442#reply0
https://blog.fundebug.com/2017/04/24/ssh-port-forwarding/
创建一个受限用户用于SSH隧道
https://ox0spy.github.io/post/configuration/create-restricted-linux-user-for-ssh-tunnel/
mole – 建立基于 SSH 进行端口转发的命令行工具
https://github.com/davrodpin/mole
一款轻量级、功能强大的内网穿透代理服务器。支持tcp、udp流量转发,支持内网http代理、内网socks5代理,同时支持snappy压缩、站点保护、加密传输、多路复用、header修改等。支持web图形化管理,集成多用户模式。
https://github.com/cnlh/nps
一条命令实现端口复用后门
https://mp.weixin.qq.com/s/HDZUsTbffeGhgwu1FOWQNg
如何在CentOS / RHEL 8上创建无外壳访问权限的SFTP用户
https://bynss.com/2020/306304.html
`
$ sudo adduser –shell /bin/false sftpuser
$ sudo passwd sftpuser
$ sudo mkdir -p /var/sftp/files
$ sudo chown sftpuser:sftpuser /var/sftp/files
$ sudo chown root:root /var/sftp
$ sudo chmod 755 /var/sftp
$ sudo vim /etc/ssh/sshd_config
Match User sftpuser
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/sftp
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
$ sudo systemctl restart sshd.service
`
使用SSH代理转发配置与故障排查
https://docs.github.com/en/developers/overview/using-ssh-agent-forwarding
http://www.unixwiz.net/techtips/ssh-agent-forwarding.html
What’s different between /bin/false and /sbin/nologin as nologin user’s shell
https://www.thegeekdiary.com/whats-different-between-bin-false-and-sbin-nologin-as-nologin-users-shell/
`
Since both commands return non-zero, there is not so much difference. Originally, /bin/false has been created for a general command as it always returns non-zero. Then, seems it is used as nologin user’s shell before creating /sbin/nologin.
简单来说就是当对应帐户尝试直接通过shell登录时,它们都会返回非0值,不过 nologin 可能会有更友好的返回信息(内容放在/etc/nologin.txt里面),但就限制帐户对shell的直接访问这一点来说,两者并没有不同。
`
What’s the difference between /sbin/nologin and /bin/false
https://unix.stackexchange.com/questions/10852/whats-the-difference-between-sbin-nologin-and-bin-false
What is the difference between /sbin/nologin and /bin/false?
https://serverfault.com/questions/519215/what-is-the-difference-between-sbin-nologin-and-bin-false
Does /usr/sbin/nologin as a login shell serve a security purpose?
https://unix.stackexchange.com/questions/155139/does-usr-sbin-nologin-as-a-login-shell-serve-a-security-purpose
`
So the actual intent of nologin is just so that when a user attempts to login with an account that makes use of it in the /etc/passwd is so that they’re presented with a user friendly message, and that any scripts/commands that attempt to make use of this login receive the exit code of 1.
With respect to security, you’ll typically see either /sbin/nologin or sometimes /bin/false, among other things in that field. They both serve the same purpose, but /sbin/nologin is probably the preferred method. In any case they’re limiting direct access to a shell as this particular user account.
限制特定用户帐户对 shell 的[直接]访问。
`