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的22
ssh端口,用ssh登录进去调试
这时候,由于不能直接访问到remote,remote也不能直接访问到local,这是最复杂的情况,要借助一个在公网大家都能访问到的服务器做中继。
总的思路是,remote访问relay,在relay中开监听,把监听端口的请求,通过remote到relay的ssh通道,转回remote的目标端口上。 然后local访问relay的监听端口,就好像local在访问remote一样
调整relay的sshd配置,允许ssh转发端口监听在非127.0.0.1的地址
vi /etc/ssh/sshd_config GatewayPorts yes
relay访问remote建立ssh转发通道
在remote服务器运行
ssh -o StrictHostKeyChecking=no -fNR 10022:localhost:22 root@relay
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隧道了。