通过网关登陆内网机器(Linux)

发布于:10/21/2019, 9:41:52 PM @孙博
技术分享 | 运维,iptables,ssh
许可协议:署名-非商业性使用(by-nc)

如果我们的机器都是部署在公网环境下,那么无论使用哪种工具都可以很轻松的登陆进去。但是为了内网环境的安全,在没有接入VPN的情况下,内网下的机器均是无法通过外网直接访问的,这时对于我们运维管理来说就会比较麻烦。

以阿里云VPC环境为例,虽然我们可以通过数据管理 DMS在WEB端登入内网机器,但这毕竟不够方便,没有哪个运维希望自己一直通过网页才能操作机器,所以我们需要想办法通过XShell等工具解决这个问题。

考虑到我们往往是有一台暴露在公网下的网关,所以我们可以将其当做跳板。一般有两种方案可以实现:

  1. 通过 iptables 配置端口转发。
  2. 通过 ssh 从网关机器间接登录。

iptables 转发

首先需要开启网关机器的转发功能,如已开启则无需再次设置。

vi /etc/sysctl.conf

# 确保文件中存在配置 net.ipv4.ip_forward=1
# 然后重载配置文件使转发功能生效

sysctl -p

然后通过 iptables 设置端口转发:

# iptables -t nat -A PREROUTING -p tcp -m tcp --dport [网关端口号] -j DNAT --to-destination [内网服务器IP]:[内网服务器端口号]

# 以下为例子
# 假设: (以下均为本文假设的地址,并无实际意义)
#     网关机器地址为 172.16.1.1 内网服务器地址为 172.16.1.10
#     网关公网地址为 34.56.78.90
#     网关监听端口为 1022 内网服务器SSH端口为 22

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 1022 -j DNAT --to-destination 172.16.1.10:22

通过以上简单步骤,就可以方便的通过XShell等工具使用SSH方式登陆34.56.78.90,当端口号为22时访问的就是网关本身,而当端口号为1022时即表示访问的是内网172.16.1.10的机器。

通过网关间接登录

利用端口转发可以将登陆信息保存在本地软件中,方便下次登录使用,但这种方式同时也意味着将内网中的机器开放了一个口子。为了保证内网环境的绝对安全,我们也可以尝试在登陆网关后,通过在网关机器上使用ssh命令,间接访问内网机器。

这种方式之所以更安全,就是因为我们访问内网机器时,我们使用的地址均为内网IP地址,与外部毫无关系。

ssh命令并不复杂,我们使用 ssh -h 可查看其参数。

usage: ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-E log_file] [-e escape_char]
           [-F configfile] [-I pkcs11] [-i identity_file]
           [-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec]
           [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address]
           [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]]
           [user@]hostname [command]

一个简单的登陆示例如下:

# 使用与当前机器相同的用户名登陆到远程机器 172.16.1.10
ssh 172.16.1.10

# 使用指定的用户名(如 foo) 登陆到远程机器 172.16.1.10
ssh foo@172.16.1.10

# 使用指定的用户名(如 foo) 登陆到远程机器 172.16.1.10 且远程机器ssh端口号为 10022
ssh -p 10022 foo@172.16.1.10

这些示例均为使用帐号+密码方式登陆,实际上帐号密码方式已经不够安全,我们在阿里云的机器往往也是使用密钥对登陆的,我们通过在XShell导入用户密钥可以便捷的完成密钥对的配置用来登陆,那么在网关机器上,我们又该如何配置?

其实也很简单,我们只需将.pem格式的私钥文件的内容上传到网关机器的本地文件夹中,如/var/keys/KEY.pem文件地址仅为示例,请自行决定文件位置。),我们使用密钥方式进行ssh登录时,使用的就是这个文件。文件上传后,那么我们再进行登录,示例将变成如下所示:

# 使用指定的用户名(如 foo) 登陆到远程机器 172.16.1.10 且远程机器ssh端口号为 10022,登陆时使用私钥文件 /var/keys/KEY.pem 代替密码
ssh -i /var/keys/KEY.pem -p 10022 foo@172.16.10.1

为了让自己的集群环境更加安全,建议大家使用第二种方法管理内网集群,对于想要使集群更进一步安全的用户来说,也可以深入了解一下堡垒机的概念。