Daimon Blog

山在那里

NAT Cheatsheet

工作原因,经常要把内网的服务临时暴露出来。方便调试。这是记录我的常用操作。

假设

remote: 远程要管理的服务器 local: 本地服务器 relay: 中继服务器

场景一:remote在公网,要把监听在localhost的端口带到本地来调试

这是最简单的情况 在local运行

ssh -L <local port>:localhost:<remote port> root@remote

其中localhost可以换成其它服务器地址。 比如db一般在内网,可以通过这个remote服务器,把db服务器的商品带到本地来

场景二:remote在内网,local也在内网,想在local访问remote的22ssh端口,用ssh登录进去调试

这时候,由于不能直接访问到remote,remote也不能直接访问到local,这是最复杂的情况,要借助一个在公网大家都能访问到的服务器做中继。

总的思路是,remote访问relay,在relay中开监听,把监听端口的请求,通过remote到relay的ssh通道,转回remote的目标端口上。 然后local访问relay的监听端口,就好像local在访问remote一样

  1. 调整relay的sshd配置,允许ssh转发端口监听在非127.0.0.1的地址

    vi /etc/ssh/sshd_config
    
    GatewayPorts yes
    
  2. relay访问remote建立ssh转发通道

在remote服务器运行

ssh -o StrictHostKeyChecking=no -fNR 10022:localhost:22 root@relay
  1. local访问relay

    ssh -p 10022 root@relay
    

这时就可以了。 当然在具体操作中,会遇到一些具体问题。处理如下

Q1: 如何在remote运行第2步?remote是无法在公网访问的

A: 事先要做些准备工作。如在remote上,事先部署好salt-minion。这样就能确保任何时候,都能操作remote了

Q2: salt在remote执行的动作,需要交互怎么办,比如remote运行ssh的时候,需要输入密码

A: 做ssh的key信任。具体如下

在remote机器,用salt执行以下命令

ssh-keygen -q -t rsa -N "" -f /root/.ssh/id_rsa
cat /root/.ssh/id_rsa.pub

然后把这个pub key的内容,加入到relay服务器的~/.ssh/authorized_keys

这时就可以在remote服务器执行ssh,免交互建立ssh隧道了。

优秀参考文章

  1. https://tlanyan.me/ssh-tunnier-forward-port/

文章分类目录