精华内容
下载资源
问答
  • SSH 反向代理

    2019-03-29 09:48:00
    SSH反向代理 被控制端没有NAT或者没有静态公网IP,把本端一台服务器映射到外网给远端SSH进来,建立SSH反向隧道。 先映射本端机器到外网 nat server 2222to22 protocol TCP global 1.2.4.8 22 inside 10.10.10.10 ...

    SSH反向代理

    被控制端没有NAT或者没有静态公网IP,把本端一台服务器映射到外网给远端SSH进来,建立SSH反向隧道。

    先映射本端机器到外网

     nat server 2222to22 protocol TCP global 1.2.4.8 22 inside 10.10.10.10 22 no-reverse
     

    被控端发起连接

     ssh -fCNR 8822:localhost:22 root@1.2.4.8 -p 2222
     
     # -f     Requests ssh to go to background just before command execution
     # -C     Requests compression of all data
     # -N     Do not execute a remote command
     # -R     [bind_address:]对端port:host:hostport
               #Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side.

    本端检查连接

     ss -tunl |grep 8822
     # 连接被控端发起ssh连接监听的8822端口,转到被控端的22端口
     ssh root@127.0.0.1 -p 8822
     

     

    转载于:https://www.cnblogs.com/fatt/p/10619357.html

    展开全文
  • SSH反向代理

    2016-10-09 20:28:41
    应用场景相信很多同学会遇到这样的场景:公司的办公机器处于内网环境,家里的电脑也处于内网环境,有时公司有急事,人又不便立马赶去公司,这时SSH反向代理就能派上用场。下面介绍一种SSH反向代理解决方案,在Ubuntu...

    应用场景

    相信很多同学会遇到这样的场景:公司的办公机器处于内网环境,家里的电脑也处于内网环境,有时公司有急事,人又不便立马赶去公司,这时SSH反向代理就能派上用场。下面介绍一种SSH反向代理解决方案,在Ubuntu14.04 LTS环境中实验成功。

    机器情况

    机器号 IP 用户名 备注
    A A.A.A.A user_a 代理服务器,在外网,无法访问B/C
    B B.B.B.B user_b 目标服务器,在局域网,可以访问A
    C C.C.C.C user_c 可直接访问A,无法直接访问B

    期望目标

    C机器通过SSH访问B机器。

    准备工作

    • 在A/B/C机器上装SSH客户端
    • 在A/B机器上装SSH服务端,安装步骤sudo apt-get install openssh-server
    • 在B机器上安装autossh,安装步骤sudo apt-get install autossh

    解决方案

    利用ssh建立的隧道会超时关闭,而利用autossh,超时之后会自动重新建立SSH隧道。

    ->1. 建立B机器到A机器的反向代理【在B机器上操作】

    autossh -fCNR <port_A1>:localhost:22 user_a@A.A.A.A

    <port_A1>为A机器上的端口,用来与B机器上的22端口绑定。
    <port_A1>只能在A机器上进行本地访问。

    ->2. 建立A机器上的正向代理【在A机器上操作】

    autossh -fCNL '*:<port_A2>:localhost:<port_A1>' localhost

    <port_A2>为本地转发端口,用于和外网通信,并将数据转发到<port_A1>
    其中*标识接受任意机器的访问。

    ->3. 通过A机器SSH到B机器【在C机器上操作】

    ssh -p <port_A2> user_b@A.A.A.A

    开机启动

    为了使得B机器重启后,C机器仍然可以访问到B,可以给B机器设置开机启动SSH隧道,在B机器上进行如下操作:

    1. 生成公私钥对

    执行以下命令,一路回车即可,提示输入密码时,不要输入。

    su - user_b
    ssh-keygen -t 'rsa'
    1. 将公钥安装到A机器
    su - user_b
    ssh-copy-id -i ~/.ssh/id_rsa user_a@A.A.A.A
    1. 开机启动脚本

    编辑/etc/init.d/autossh_tunnel.sh,输入以下内容,并添加执行权限

    #!/bin/sh
    
    # A.A.A.A可以是其他B机器可以ping通的IP,用于验证网络准备好了
    until ping -nq -c3 A.A.A.A; do
        # waiting for network
        sleep 5
    done
    
    /usr/bin/autossh -fCNR <port_A1>:localhost:22 user_a@A.A.A.A -i ~/.ssh/id_rsa
    1. 添加开机启动

    编辑/etc/rc.local添加以下内容,在exit之前

    su - user_b -s /bin/bash /etc/init.d/autossh_tunnel.sh &

    autossh_tunnel.sh脚本中会一直等待网络,为了不影响rc.local中其他命令的执行,因此在后台执行了该脚本。

    SSH 参数解释

    -f 后台运行
    -C 允许压缩数据
    -N 不执行任何命令
    -R 将端口绑定到远程服务器,反向代理
    -L 将端口绑定到本地客户端,正向代理

    展开全文
  • ssh反向代理

    千次阅读 2019-10-07 15:57:35
      如果需要在外网远程登录到内网的主机,就需要反向代理,我们可以使用ssh的断口转发功能来实现反向代理,从而在外网登录到内网主机 说明 要实现反向代理,需要一台有公网ip的主机,为了描述方便,我们需要被远程...

      如果需要在外网远程登录到内网的主机,就需要反向代理,我们可以使用ssh的端口转发功能来实现反向代理,从而在外网登录到内网主机

    说明

    要实现反向代理,需要一台有公网ip的主机,为了描述方便,我们称需要远程登录的那台主机为内网主机,用于做代理的有公网ip的那台服务器为外网主机,此外的称为其他主机。我们想要实现的是其他主机能够远程登录到内网主机

    远程转发

    内网主机上使用ssh开启远程转发

    ssh -fNR <remote_bind_address>:<remote_port>:<local_bind_address>:<local_port> <username>@<remote_address>
    

    选项说明:

    1. <username>@<remote_address>用于登录远程主机

    2. -R指定将外网主机端口数据转发到本机,后面需要紧跟参数<remote_bind_address>:<remote_port>:<local_bind_address>:<local_port>

    3. 注意<remote_bind_address>只有在外网主机的ssh配置中启用了GatewayPorts才会生效,否则外网主机只会监听其回环地址的对应端口。另外,<*_bind_address>参数可以省略,默认为本地回环地址localhost/127.0.0.1

    4. -N指定ssh不执行任何命令

    5. -f指定ssh后台运行

    例子

    ssh -fNR 5022:localhost:22 root@121.121.121.121
    

    该例子中将外网主机5022端口数据转发到本机(内网主机)的22端口,省略了外网主机的绑定地址(bind_address),其默认为localhost

    内网主机开启ssh-server服务

    需要被反向代理的内网主机在上述<local_port>上开启ssh-server服务
    输入以下命令查看是否开启服务

     sudo netstat -tnlp |grep sshd
    

    选项说明:

    1. -t 表示查看tcp
    2. -l 表示查看监听端口
    3. -n 表示以数字方式显示端口号
    4. -p 表示显示监听对应端口的进程信息(pid/进程名)

    如果有输出结果表示ssh服务已经开启,下面的结果显示ssh在tcp的22号端口开启了服务;如果没有任何输出表示ssh服务没有开启。需要安装openssh-server或者启动sshd服务。

    january@january-PC:~$ sudo netstat -tnlp |grep sshd
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      2255/sshd           
    tcp6       0      0 :::22                   :::*                    LISTEN      2255/sshd    
    

    连接远程主机上的转发端口

    在外网主机上使用ssh连接到转发端口即可连接到内网主机

    ssh -p 5022 user@localhost
    

    到这一步只有外网主机上可以连接到内网主机,其他主机还是不能够通过外网主机的转发端口连接到内网主机,需要对外网主机的ssh服务进行配置。

    允许其他主机连接到外网主机的转发端口

    在外网主机的sshd配置文件中设置GatewayPortsyes,然后在内网主机上使用ssh开启远程转发时指定<remote_bind_address>*或者0.0.0.0或者省略即可。

    sshd的配置文件一般在/etc/ssh/sshd_config

    january@january-PC:/etc/ssh$ cat sshd_config |grep GatewayPorts
    #GatewayPorts no
    

    编辑sshd_config, 把这一项的注释去掉,no改成yes,然后重启sshd

    以下是sshd_config的manpage中相关的设置项,可以看到后面两个默认都是yes,无需专门设置

    GatewayPorts
    Specifies whether remote hosts are allowed to connect to ports forwarded for the client.  By default, sshd(8)
    binds remote port forwardings to the loopback address.  This prevents other remote hosts from connecting to for‐
    warded ports.  GatewayPorts can be used to specify that sshd should allow remote port forwardings to bind to non-
    loopback addresses, thus allowing other hosts to connect.  The argument may be no to force remote port forwardings
    to be available to the local host only, yes to force remote port forwardings to bind to the wildcard address, or
    clientspecified to allow the client to select the address to which the forwarding is bound.  The default is no.
    
     AllowAgentForwarding
     Specifies whether ssh-agent(1) forwarding is permitted.  The default is “yes”.  Note that
     disabling agent forwarding does not improve security unless users are also denied shell
     access, as they can always install their own forwarders.
     
      AllowTcpForwarding
     Specifies whether TCP forwarding is permitted.  The available options are “yes” or “all”
     to allow TCP forwarding, “no” to prevent all TCP forwarding, “local” to allow local (from
     the perspective of ssh(1)) forwarding only or “remote” to allow remote forwarding only.
     The default is “yes”.  Note that disabling TCP forwarding does not improve security
     unless users are also denied shell access, as they can always install their own for‐
     warders.
    

    额外的步骤

    如果外网主机使用的是云服务器(比如阿里云),还需要调节防火墙设置,把转发端口添加到防火墙白名单,否则其他主机无法连接到转发端口

    使用autossh解决ssh端口转发连接断开问题

    如果ssh因为某些原因断开了连接,代理服务就无法使用了。这时就需要使用autossh定时对转发端口进行检查,如果连接断开就重新启动ssh建立连接,从而保证服务的可用性。

    autossh -f -M <monitor port> <ssh options>
    

    选项说明:

    1. -f 表示让autossh后台运行(退出终端也会继续运行)
    2. -M <monitor_port>表示开启另外的端口转发(会占用本地monitor_portmonitor_port+1号端口以及远程主机的monitor_port号端口)用于检查ssh是否正常运行
    3. <ssh option>就是远程转发的那一小节中ssh使用的选项和参数,注意-f不会传给ssh

    例子

    january@january-pc:~$ autossh -M 12345 -NR 5022:localhost:22 root@121.121.121.121
    

    安全性和自动登录

    使用密钥方式登录可以获得更高的安全性并且不需要输入密码,因此推荐大家使用密钥登录。
    步骤如下:

    1. 使用ssh-keygen生成密钥对,包括一个id_rsaid_rsa.pub, 默认在~/.ssh文件夹里
    2. 使用ssh-copy-id user@ip将公钥(id_rsa.pub)复制到远程主机中(需要验证密码)或者手动将id_rsa.pub里的内容复制到远程主机的~/.ssh/authorized_keys文件中
    3. 然后就可以不用输密码登录了

    建议在远程主机的/etc/ssh/sshd_config文件中将PasswordAuthentication选项设置为no禁止直接使用口令(password)登录,以提高安全性,特别是在口令比较弱的时候。

    参考资料

    ssh

    sshd_config

    autossh

    展开全文
  • ssh 反向代理

    2021-02-01 18:53:19
    系统版本:Centos7 这篇文章主要介绍了如何利用SSH 反向隧道穿透NAT,并演示了如何维持一条稳定的SSH 隧道。...通俗地说:就是在机器A上做到B机器的反向代理;然后在B机器上做正向的代理实现本地端口的转

    系统版本:Centos7
    这篇文章主要介绍了如何利用SSH 反向隧道穿透NAT,并演示了如何维持一条稳定的SSH 隧道。

    1. 描述一下目前的机器状况,梳理梳理:

    机器 IP 用户名 备注
    A 10.21.32.106 gdut728 目标服务器,处于内网
    B 123.123.123.123 root 外网服务器,相当于桥梁的作用

    2. 解决方法:

    通俗地说:就是在机器A上做到B机器的反向代理;然后在B机器上做正向的代理实现本地端口的转发

    2.1 实现前的准备
    每台都要安装ssh的客户端。
    在这里我使用的是centos7,都自带ssh。如果是使用其他版本Linux,请手动Google一下咯。

    2.2 介绍一下使用到的ssh参数:

    反向代理
    ssh -fCNR

    正向代理
    ssh -fCNL

    -f 后台执行ssh指令
    -C 允许压缩数据
    -N 不执行远程指令
    -R 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
    -L 将本地机(客户机)的某个端口转发到远端指定机器的指定端口
    -p 指定远程主机的端口

    *大小写注意区分

    3. 首先在A上面操作:

    建立A机器到B机器的反向代理,具体指令为

    ssh -fCNR [B机器IP或省略]:[B机器端口]:[A机器的IP]:[A机器端口] [登陆B机器的用户名@服务器IP]

    在这里我使用了B机器的7280端口,以及A机器的22端口,按照上面的指令就是这样子的操作

    ssh -fCNR 7280:localhost:22 root@123.123.123.123

    检验是否已经启动了可以使用ps aux | grep ssh指令来查看:
    在这里插入图片描述

     

    在使用SSH反向代理的时候,可以从公网ssh localhost连接到内网。这样做需要先登录到公网服务器,因此对于只想要给其他人提供一个跳板的人来说,不希望别人能登录自己的服务器。所以就需要在反向代理的时候,将绑定的端口开放到公网,而非127.0.0.1。所以需要在sshd_config中设置GatewayPorts为yes

    首先,在VPS进行设置,修改/etc/ssh/sshd_config加入

    GatewayPorts yes

    这样就完了吗?当然没有,经过测试,我们是无法让这个代理保持一直在线的,SSH在一定时间没有任何的操作后就会自动的断开,那么我们同样再次修改配置文件:

    找到 ClientAliveInterval 0和ClientAliveCountMax 3并将注释符号(”#”)去掉, 将ClientAliveInterval对应的0改成60,ClientAliveInterval指定了服务器端向客户端请求消息的时间间隔, 默认是0,不发送. ClientAliveInterval 60表示每分钟发送一次, 然后客户端响应, 这样就保持长连接了. ClientAliveCountMax, 使用默认值3即可.ClientAliveCountMax表示服务器发出请求后客户端没有响应的次数达到一定值, 就自动断开. 这样的配置就能让一个SSH的配置保持长连接了,代理就能稳定的在线。

    GatewayPorts
    是否允许远程主机连接本地的转发端口。默认值是"no"。
    sshd(8) 默认将远程端口转发绑定到loopback地址。这样将阻止其它远程主机连接到转发端口。
    GatewayPorts 指令可以让 sshd 将远程端口转发绑定到非loopback地址,这样就可以允许远程主机连接了。
    "no"表示仅允许本地连接,"yes"表示强制将远程端口转发绑定到统配地址(wildcard address),

    ClientAliveCountMax
    sshd(8) 在未收到任何客户端回应前最多允许发送多少个"alive"消息。默认值是 3 。
    到达这个上限后,sshd(8) 将强制断开连接、关闭会话。
    需要注意的是,"alive"消息与 TCPKeepAlive 有很大差异。
    "alive"消息是通过加密连接发送的,因此不会被欺骗;而 TCPKeepAlive 却是可以被欺骗的。
    如果 ClientAliveInterval 被设为 15 并且将 ClientAliveCountMax 保持为默认值,
    那么无应答的客户端大约会在45秒后被强制断开。这个指令仅可以用于SSH-2协议。

    ClientAliveInterval
    设置一个以秒记的时长,如果超过这么长时间没有收到客户端的任何数据,
    sshd(8) 将通过安全通道向客户端发送一个"alive"消息,并等候应答。
    默认值 0 表示不发送"alive"消息。这个选项仅对SSH-2有效。

    4. 接着在B上面操作:

    建立B机器的正向代理,用来做转发,具体指令为

    ssh -fCNL [A机器IP或省略]:[A机器端口]:[B机器的IP]:[B机器端口] [登陆B机器的用户名@B机器的IP]
    按照第3那里输入的指令,这里的B机器的端口和上面的B机器的端口是一致的,端口1234的也是B机器的。

    ssh -fCNL *:1234:localhost:7280 localhost
    
    • 1

    检验是否已经启动了可以使用ps aux | grep ssh指令来查看:
    在这里插入图片描述

     

    netstat -anpt 


    在此1234端口为本地转发端口,负责和外网进行通信,并将数据转发的7280这个端口,实现了可以从其他机器访问的功能。同时,*号表示可以接受任何IP的访问。

    5. 展现奇迹的时候到了

    至此我们都配置好了AB机器,那么我们就可以从一部外网的电脑登陆到内网里面去啦。鉴于我目前的电脑在内网,而服务器都是外网的(也就是配置的B机器),所以可以通过B机器连接到我内网的A中,具体指令为:

    ssh -p1234 zhj@123.123.123.123

    在此-p参数为指定登陆的IP,我们在上面指定了1234端口为转发端口,故用1234端口登陆,然后gdut728是内网A机器的用户名,123.123.123.123为外网B机器的IP地址。
    在这里插入图片描述

    6. 这种反向代理的方式是不稳定的

    不幸的是这种ssh反向链接会因为超时而关闭,如果关闭了那从外网连通内网的通道就无法维持了,为此我们需要另外的方法来提供稳定的ssh反向代理隧道。

    6.1 ssh每次重连都需要键入密码,故在此首先设置免密码登陆到内网
    在内网的机器A上面执行:

    ssh-copy-id 外网用户名@外网IP
    按照之前我设定的端口,这个指令就是如下

    ssh-copy-id root@123.123.123.123

    在这里插入图片描述
    那以后这台内网的A机器ssh登陆我外网的B机器就可以免密码登陆啦~
    检验是否已经可以使用免密码登陆可以使用如下指令来检验:

    ssh root@123.123.123.123

     

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,925
精华内容 4,370
关键字:

ssh反向代理