前言

企业内部大部分服务器都只有内网,一般可以使用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程序可以从三个途径获取配置参数:

  1. 命令行选型,比如 -F configfile
  2. 用户配置文件,放置在 ~/.ssh/config
  3. 系统配置文件,放置在 /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
# cat ~/.ssh/config

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公钥
ssh-keygen
ssh-copy-id root@10.249.69.128

# 配置ssh config
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


# 使用ProxyCommand或者ProxyJump
vim ~/.ssh/config

# ProxyCommand
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

# ProxyJump
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/

文章目录
  1. 1. 前言
  2. 2. 更新历史
  3. 3. ssh_config的配置文件来源
  4. 4. ssh_config配置文件实例
  5. 5. SSH使用小技巧
  6. 6. SSH Socks5隧道代理和HTTP协议转换
  7. 7. 参考