原文地址:http://wooooe.com/2018/07/31/remote_forwarding/

ssh端口映射例子

因为公司的网络比较深所以经常需要跳转多次。所以这次做个记录

服务器结构

需求: 需要从your host跳到client中间隔了两层跳板机。

如果单纯用代理方法只能跳一层

所以如果用端口映射+代理方式就可以跳两层了

映射命令

1
ssh -g -f -NL 127.0.0.1:44010:172.16.3.14:22 -p 3391 jump_host1_username@222.222.222.222

意思就是将172.16.3.14的22端口映射到127.0.0.1的44010端口,222.222.222.222是中间的代理机,3391是222.222.222.222的ssh端口。

映射完成之后。执行

1
ssh -p 44010 jump_host2_username@127.0.0.1

就可以直接跳转到jump_host2上

ssh走代理方法

第一种:

1
ssh -o ProxyCommand="ssh -W %h:%p -p 3391 -q jump_host1_username@222.222.222.222" jump_host2_username@172.16.3.14

第二种:

需要在你当前用户目录下的.ssh目录下建一个config文件

1
2
3
4
Host 192.122.150.*
Port 22
User anyone
ProxyCommand ssh -p 3391 jump_host1_username@222.222.222.222 -W %h:%p

意思就是当你在当前这个用户进行ssh连接时凡是匹配到192.122.150的ip都会使用222.222.222.222的3391端口作代理.

ansible使用代理的方法

当你用playbook时可以直接写在hosts文件做全局变量

1
2
3
4
[web]
172.16.3.14 ansible_ssh_user=aaaa
[web:vars]
ansible_ssh_common_args='-o ProxyCommand="ssh -W %h:%p -p 3391 -q jump_host1_username@222.222.222.222"'

如果你想直接附加在命令行中,那么可以这么写

1
--ssh-common-args='-o ProxyCommand="ssh -W %h:%p -p 3391 -q jump_host2_username@222.222.222.222"'

如果你想调用ansible api走代理,那么可以这么写

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
Options = namedtuple('Options',
['connection',
'remote_user',
'ask_sudo_pass',
'verbosity',
'ack_pass',
'module_path',
'forks',
'become',
'become_method',
'become_user',
'ssh_common_args',
'check',
'listhosts',
'listtasks',
'listtags',
'syntax',
'sudo_user',
'sudo',
'diff'])
options = Options(connection='smart',
remote_user=None,
ack_pass=None,
sudo_user=None,
forks=5,
sudo=None,
ask_sudo_pass=False,
verbosity=5,
module_path=None,
become=None,
become_method=None,
become_user=None,
ssh_common_args=sshCommonArgs,
check=False,
diff=False,
listhosts=None,
listtasks=None,
listtags=None,
syntax=None)

你需要把参数传给sshCommonArgs,例如

1
ssh_common_args='-o ProxyCommand="ssh -W %h:%p -p 3391 jump_host1_username@222.222.222.222'

ansible tower设置

  1. 使用这种跳转方式,必须将settings->JOBS->ENABLE JOB ISOLATION设置为OFF状态
  2. 在Credentials中添加访问的私钥
  3. Inventories中添加Jumper server Host
  4. Inventories中添加要访问的Host,并添加ssh访问参数
    1
    ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -p 22 -q 100.129.71.4'
  5. 通过这些设置后,ansible就可以像访问普通主机一样访问目的Host了。

说明: