前言 企业内部大部分服务器都只有内网,一般可以使用NAT方式正向代理访问公网资源。对于Linux来说一般通过ssh登录服务器,在没有公网IP的情况下可以修改ssh config配置文件,利用一台可以接入内网并具有公网IP的服务器作为代理或者称为Tunnel跳板机来管理,可以灵活定制访问规则并优化ssh参数让管理更加轻松。
使用ssh config作为ssh代理轻松管理内网服务器
更新历史 2022年04月27日 - 增加SSH使用小技巧 2019年01月31日 - 初稿
阅读原文 - https://wsgzao.github.io/post/ssh-config/
扩展阅读
SSH CONFIG FILE - https://www.ssh.com/ssh/config/
ssh_config的配置文件来源 1 2 3 4 5 6 7 8 9 10 11 man ssh_config NAME ssh_config -- OpenSSH SSH client configuration files DESCRIPTION ssh(1) obtains configuration data from the following sources in the following order: 1. command-line options 2. user's configuration file (~/.ssh/config) 3. system-wide configuration file (/etc/ssh/ssh_config)
ssh程序可以从三个途径获取配置参数:
命令行选型,比如 -F configfile
用户配置文件,放置在 ~/.ssh/config
系统配置文件,放置在 /etc/ssh/ssh_config(区别于 /etc/ssh/sshd_config)
上面三个途径,前面的途径传入的参数可以覆盖后面的途径传入的参数(与 linux 里的大部分应用类似)。因为/etc/ssh/ssh_config 会影响 ssh 全局的配置,因此如果想对多主机进行管理(不影响别人的情况下),可以考虑修改自己家目录下的/.ssh/config 文件( 字符表示当前登录用户的家目录)。
ssh_config配置文件实例 首先看一个配置文件的 demo,假设8.8.8.8是你可以直接登录的Tunnel公网跳板机,10.65.32.0是需要管理的内网地址段,前提是8.8.8.8和内网服务器的防火墙策略均已配置正确,这里就不再赘述。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 StrictHostKeyChecking no CheckHostIP no Host 10.65.32.* HostName %h ProxyCommand ssh bastion_GOP_SG_NC_MAIN -W %h:%p Host bastion_GOP_SG_NC_MAIN HostName 8.8.8.8 port 22 User wangao Host 10.65.200.* HostName %h ProxyCommand ssh bastion_GOP_SG_MH_MAIN -W %h:%p Host bastion_GOP_SG_MH_MAIN HostName 9.9.9.9 port 22 User wangao
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 StrictHostKeyChecking no CheckHostIP no Host 10.71.12.* HostName %h ProxyCommand ssh bastion_GOP_SG_NC_MAIN -W %h:%p Host 10.71.13.* HostName %h ProxyCommand ssh bastion_GOP_SG_NC_MAIN -W %h:%p Host 10.71.14.* HostName %h ProxyCommand ssh bastion_GOP_SG_NC_MAIN -W %h:%p Host 10.71.15.* HostName %h ProxyCommand ssh bastion_GOP_SG_NC_MAIN -W %h:%p Host bastion_GOP_SG_NC_MAIN HostName 8.8.8.8 port 22 User wangao
CheckHostIP no,禁用known_hosts检查 Directs ssh to additionally check the host IP address in the known_hosts file.
StrictHostKeyChecking no,跳过known_hosts写入 Specifies if ssh should never automatically add host keys to the ~/.ssh/known_hosts file, and refuses to connect to hosts whose host key has changed.
Host 字段 Host 字段配置了登录别名,这里需要注意的是,Host 是支持通配符的, * 代表 0~n 个非空白字符,? 代表一个非空白字符,! 表示例外通配
HostName 字段 指定远程主机名,可以直接使用 IP 地址。如果这个字段中包含 ‘%h’ ,则实际使用时会被命令行中的主机名替换
User 字段 指定登录用户名
IdentityFile 字段 指定密钥认证使用的私钥文件路径。默认为 ~/.ssh/id_rsa。这个字段可以指定多个密钥文件(以 , 分开),在连接的过程中会依次尝试这些密钥文件。和 HostName 字段一样,值也可以直接指定参数代替:
Port 字段 指定远程主机端口号,默认为 22 。
%h,远程主机名 %p,远程端口
SSH使用小技巧 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 ssh-keygen ssh-copy-id root@10.249.69.128 cd ~/.ssh/vim config StrictHostKeyChecking no CheckHostIP no Host 192.168.* HostName 10.249.69.128 User root Port 22 ssh root@192.168.8.0 vim ~/.ssh/config Host X HostName 10.251.252.53 User root Port 22 IdentityFile ~/.ssh/id_rsa Host xfljump HostName 10.249.69.128 User root Port 22 IdentityFile ~/.ssh/id_rsa ProxyCommand ssh X -W %h:%p Host xfljump HostName 10.249.69.128 User root ProxyJump root@10.251.252.53
https://liwanggui.com/posts/ssh-tips/ https://bugwz.com/2019/10/09/ssh-proxycommand/ https://blog.nediiii.com/ssh-note/ https://www.xiebruce.top/650.html https://deepzz.com/post/how-to-setup-ssh-config.html
SSH Socks5隧道代理和HTTP协议转换 ssh 命令除了登陆外还有三种代理功能:
正向代理(-L):相当于 iptable 的 port forwarding 反向代理(-R):相当于 frp 或者 ngrok socks5 代理(-D):相当于 ss/ssr
下面重点介绍动态转发 不管是本地转发还是远端转发,都需要一个具体的应用服务器的地址和端口号,要想访问其他机器的内容就得绑定很多条这样的转发命令, 通过动态转发就能省去这一个应用服务器的信息。
ssh -D
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 # ssh_config vim ~/.ssh/config StrictHostKeyChecking no CheckHostIP no ServerAliveInterval 10 ServerAliveCountMax 5 Host jump HostName 10.35.200.0 User tiger ProxyJump aowang@xxx Host pdi HostName 10.249.68.54 User root ProxyJump aowang@10.251.246.148 # ssh client socks5 ssh -ND 1080 pdi macOS GUI can also try `Core Tunnel` https://codinn.com/tunnel/ # client setup 1. Chrome use `SwitchyOmega` extension 2. Convert Socks5 to HTTP can use `gost` https://gost.run/ gost -L http://:8080 -F socks://127.0.0.1:1080 ## set http_proxy Add this script to ~/.bash_profile export http_proxy=socks5://127.0.0.1:1080 export https_proxy=socks5://127.0.0.1:1080 curl https://myip.wtf/json { "YourFuckingIPAddress": "128.106.228.155", "YourFuckingLocation": "Singapore", "YourFuckingHostname": "bb128-106-228-155.singnet.com.sg", "YourFuckingISP": "Singtel Fibre", "YourFuckingTorExit": false, "YourFuckingCity": "", "YourFuckingCountry": "Singapore", "YourFuckingCountryCode": "SG" } curl -x socks5://127.0.0.1:1080 http://wtfismyip.com/json
http://wlwang41.github.io/content/ops/ssh%E9%9A%A7%E9%81%93%E4%BB%A3%E7%90%86.html
参考
如果你还不了解ssh或者对ssh端口转发感兴趣,可以参考以下内容
SSH使用密钥登录并禁止口令登录实践 - https://wsgzao.github.io/post/ssh/
玩转 SSH 端口转发 - https://blog.fundebug.com/2017/04/24/ssh-port-forwarding/