<commit_before>2018-02-09 17:08
* 设置SSH反向隧道，使得在外面也可以访问处于NAT后面，内网里面的服务器(Windows/Linux均可)，同时使用AutoSSH保持SSH的稳定连接；做法参考https://linux.cn/article-5975-1.html，具体操作如下：
  * 外网服务器上的/etc/ssh/sshd_config末尾添加一行GatewayPorts yes，含义是让sshd允许外部其他机器共享SSH端口转发；这也是后面的反向通道建立的命令只建立了公网机器到内网机器之间的通道，但是外网客户机却也能访问这条反向通道的关键所在；
  *   在内网服务器上ssh -fN -R 10022:localhost:22 root@work2 -i ~/.ssh/vps.pem ,含义是把公网服务器41722端口的流量转发到本机的22端口,-i指定使用哪个公钥登录公网 服务器；
    *   root@work2是公网服务器的用户名和域名；请把公网机器的域名，私钥事先准备好，在hosts文件和~/.ssh目录，便于在命令行中引用；
    *   如果公网机器有域名的话直接使用域名即可，如果没有域名，建议在本机的hosts文件中预先设定好ip和一个自定义域名便于命令行使用；
    *   vps.pem是公网机器的SSH私钥，建议放在~/.ssh目录下，这是标准目录；
    *   -f这个参数含义是使得SSH反向通道成功建立后转入后台运行，-R就是反向通道的意思；
  *   现在可以登录到公网机器后ssh -p 10022 homeserver_user@localhost连接内网机器；
  * 上述方法要登录公网服务器，然后再次登录内网服务器；更好的方法是直接让外网服务器中继转发，命令如下：
      *   直接登录的解决方案参考http://arondight.me/2016/02/17/%E4%BD%BF%E7%94%A8SSH%E5%8F%8D%E5%90%91%E9%9A%A7%E9%81%93%E8%BF%9B%E8%A1%8C%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/
      从该文参考得出命令如下：
      ssh -p 22 -fN -R 10022:localhost:22 root@work2 -i ~/.ssh/gw724.pem
      * 这条autossh不但维持连接，而且让外网机器可以直接通过10022端口转发到ssh反向隧道另一端的内网机器.这里-M后面的端口号无所谓，是一个监视端口，只要是公网机器上一个未用端口就可以了：
      autossh -p 22 -M 10900 -fNR *:10022:localhost:22 root@work2 -i ~/.ssh/gw724.pem
      完毕以后外网通过ssh -p 10022 priUser@work2就可以直接ssh登录内网机器了，priUser是内网机器的用户名；
  *   然后把autossh添加到/etc/rc.local，保持系统重启时也会执行该命令；
    *   新版本Ubuntu没有rc.local了，自己在/etc建立一个，chmod +x，头部写上#!/bin/sh -x，这样如果执行不成功，会把失败消息写入/var/log/messages，我们看看就知道失败在哪里了；
    *   建立完成后，到/etc/rc3.d下面建立一个S99rc.local的软链接指向/etc/rc.local:ln -s /etc/rc.local S99rc.local,这里S意思是开机启动，99意思是最后一个可用级别，原则上只要大于存在的软链接的数字即可，用途是使得该脚本往往要用到的网络等等设备已经初始化完毕；
    *   建立完成了具有正常功能的rc.local以后，把以上两条启动SSH反向隧道的命令加入rc.local里面保证每次重启以后都能再次自动重建SSH反向隧道；
    *   存在的问题：我在一台机器上重启sshd服务以后反向隧道就没有再自动建立，但是另一台机器却可以，区别在哪里还有待于进一步实践。
    *   安全性考虑：可以考虑在公网服务器的防火墙上对于可以访问SSH反向隧道的IP段做适当的限制，限制只有自己所处的几个常用IP段可以访问这些端口；一般来说开放最多十个八个B类IP段的范围访问已经足以满足研发之类的临时性需求了；不用时直接撤销内网服务器的反向通道命令更好；
*   Windows机器也可以用同样的方法导出端口供外网访问。方法如下：
    *   首先通过putty建立到公网机器的正常ssh访问；
    *   在该SSH链接上添加SSH反向隧道，方法：“Connection-SSH-Tunnels”里面，把“Port forwarding”里面的2个选项都勾选，然后“Source Port”填写公网端口号10086，“Destination”填写"localhost:1439",下面选择“Remote”和“Auto”，点击“Add”，然后点击“Apply”即可。注意最好把这些设置保存一个配置，以后直接使用。
    *   打开putty，载入前面保存的配置，连接,端口映射就成立了。此时本机的1439端口开一个web服务器，然后从其他机器打开公网机器的域名和10086端口，就能访问你的内网Windows机器上刚开的Web服务器了；
    *   原则上其他网络服务，比如3389的远程桌面，1521的Oracle数据库等都可以通过这个方法临时导出外网访问；之所以说是临时，是因为这种反向隧道有一定的局限性。
*   SSH反向隧道的局限性：
    *   SSH协议本身不是设计为长期稳定保持连接的，很容易受到各种软硬件因素还有网络设备的影响而使得连接断开，所以往往需要各种其他辅助手段比如AutoSSH等来保持连接中断后自动重建；
    *   客户机系统重启，客户机SSH服务重启，客户机软件运行异常等各种手段都会中断SSH反向隧道，而自动化重建隧道往往很难，所以主要适用于临时性，需求变化频繁的网络端口开放用途；
    *   SSH反向隧道对于处于多重防火墙，NAT，或者各种虚拟机中的情形的内网服务器开放给外网访问很有用，但是也要小心，在企业网络中这样一个隧道可能被视为违反公司政策。所以主要适用于以下情形：
    *   对于日渐普遍的没有公网IP的家庭宽带来说，可以用这个方法将家庭内部机器开放出来方便自己在外面访问；
    *   对于研发过程中网络方面的试验性临时用途，需要从外部网络访问内部网络服务器的情形，而且随着研发过程需求变动频繁，不方便经常去麻烦公司网关设置和变动端口映射的时候；
*   总结：内网服务器上建立到公网服务器的反向隧道，同时内网服务器还执行一个autossh保持这个隧道的稳定性，就可以从外网登录公网服务器后将其作为跳板机登录内网服务器了；
<commit_msg>SSH反向隧道需求部分提前到开头了<commit_after>2018-02-09 17:08
*   SSH反向隧道对于处于多重防火墙，NAT，或者各种虚拟机中的情形的内网服务器开放给外网访问很有用，但是也要小心，在企业网络中这样一个隧道可能被视为违反公司政策。所以主要适用于以下情形：
    *   对于日渐普遍的没有公网IP的家庭宽带来说，可以用这个方法将家庭内部机器开放出来方便自己在外面访问；
    *   对于研发过程中网络方面的试验性临时用途，需要从外部网络访问内部网络服务器的情形，而且随着研发过程需求变动频繁，不方便经常去走流程等待公司网管设置端口映射的时候；
    *   设备处于多重NAT，网关，防火墙后面，网络环境复杂，很难设置端口映射使其能临时被外网访问的时候；
* 具体做法：设置SSH反向隧道，使得在外面也可以访问处于NAT后面，内网里面的服务器(Windows/Linux均可)，同时使用AutoSSH保持SSH的稳定连接；做法参考https://linux.cn/article-5975-1.html，具体操作如下：
  * 外网服务器最好是Linux的，便于以下的各种网络操作；
  * 内网机器Windows/Linux均可，不过如果是Windows机器，可能在操作灵活性上有一定损失，但是基本功能还是可以保证的；
  * 外网Linux服务器上的/etc/ssh/sshd_config末尾添加一行GatewayPorts yes，含义是让sshd允许外部其他机器共享SSH端口转发；这也是后面的反向通道建立的命令只建立了公网机器到内网机器之间的通道，但是外网客户机却也能访问这条反向通道的关键所在；
  *   在内网服务器上ssh -fN -R 10022:localhost:22 root@work2 -i ~/.ssh/vps.pem ,含义是把公网服务器41722端口的流量转发到本机的22端口,-i指定使用哪个公钥登录公网 服务器；
    *   root@work2是公网服务器的用户名和域名；请把公网机器的域名，私钥事先准备好，在hosts文件和~/.ssh目录，便于在命令行中引用；
    *   如果公网机器有域名的话直接使用域名即可，如果没有域名，建议在本机的hosts文件中预先设定好ip和一个自定义域名便于命令行使用；
    *   vps.pem是公网机器的SSH私钥，建议放在~/.ssh目录下，这是标准目录；
    *   -f这个参数含义是使得SSH反向通道成功建立后转入后台运行，-R就是反向通道的意思；
  *   现在可以登录到公网机器后ssh -p 10022 homeserver_user@localhost连接内网机器；
  * 上述方法要登录公网服务器，然后再次登录内网服务器；更好的方法是直接让外网服务器中继转发，命令如下：
      *   直接登录的解决方案参考http://arondight.me/2016/02/17/%E4%BD%BF%E7%94%A8SSH%E5%8F%8D%E5%90%91%E9%9A%A7%E9%81%93%E8%BF%9B%E8%A1%8C%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/
      从该文参考得出命令如下：
      ssh -p 22 -fN -R 10022:localhost:22 root@work2 -i ~/.ssh/gw724.pem
      * 这条autossh不但维持连接，而且让外网机器可以直接通过10022端口转发到ssh反向隧道另一端的内网机器.这里-M后面的端口号无所谓，是一个监视端口，只要是公网机器上一个未用端口就可以了：
      autossh -p 22 -M 10900 -fNR *:10022:localhost:22 root@work2 -i ~/.ssh/gw724.pem
      完毕以后外网通过ssh -p 10022 priUser@work2就可以直接ssh登录内网机器了，priUser是内网机器的用户名；
  *   然后把autossh添加到/etc/rc.local，保持系统重启时也会执行该命令；
    *   新版本Ubuntu没有rc.local了，自己在/etc建立一个，chmod +x，头部写上#!/bin/sh -x，这样如果执行不成功，会把失败消息写入/var/log/messages，我们看看就知道失败在哪里了；
    *   建立完成后，到/etc/rc3.d下面建立一个S99rc.local的软链接指向/etc/rc.local:ln -s /etc/rc.local S99rc.local,这里S意思是开机启动，99意思是最后一个可用级别，原则上只要大于存在的软链接的数字即可，用途是使得该脚本往往要用到的网络等等设备已经初始化完毕；
    *   建立完成了具有正常功能的rc.local以后，把以上两条启动SSH反向隧道的命令加入rc.local里面保证每次重启以后都能再次自动重建SSH反向隧道；
    *   存在的问题：我在一台机器上重启sshd服务以后反向隧道就没有再自动建立，但是另一台机器却可以，区别在哪里还有待于进一步实践。
    *   安全性考虑：可以考虑在公网服务器的防火墙上对于可以访问SSH反向隧道的IP段做适当的限制，限制只有自己所处的几个常用IP段可以访问这些端口；一般来说开放最多十个八个B类IP段的范围访问已经足以满足研发之类的临时性需求了；不用时直接撤销内网服务器的反向通道命令更好；
*   Windows机器也可以用同样的方法导出端口供外网访问。方法如下：
    *   首先通过putty建立到公网机器的正常ssh访问；
    *   在该SSH链接上添加SSH反向隧道，方法：“Connection-SSH-Tunnels”里面，把“Port forwarding”里面的2个选项都勾选，然后“Source Port”填写公网端口号10086，“Destination”填写"localhost:1439",下面选择“Remote”和“Auto”，点击“Add”，然后点击“Apply”即可。注意最好把这些设置保存一个配置，以后直接使用。
    *   打开putty，载入前面保存的配置，连接,端口映射就成立了。此时本机的1439端口开一个web服务器，然后从其他机器打开公网机器的域名和10086端口，就能访问你的内网Windows机器上刚开的Web服务器了；
    *   原则上其他网络服务，比如3389的远程桌面，1521的Oracle数据库等都可以通过这个方法临时导出外网访问；之所以说是临时，是因为这种反向隧道有一定的局限性。
*   SSH反向隧道的局限性：
    *   SSH协议本身不是设计为长期稳定保持连接的，很容易受到各种软硬件因素还有网络设备的影响而使得连接断开，所以往往需要各种其他辅助手段比如AutoSSH等来保持连接中断后自动重建；
    *   客户机系统重启，客户机SSH服务重启，客户机软件运行异常等各种手段都会中断SSH反向隧道，而自动化重建隧道往往很难，所以主要适用于临时性，需求变化频繁的网络端口开放用途；
*   总结：内网服务器上建立到公网服务器的反向隧道，同时内网服务器还执行一个autossh保持这个隧道的稳定性，就可以从外网登录公网服务器后将其作为跳板机登录内网服务器了；

{'fraction_non_alphanumeric': 0.10488599348534201, 'fraction_numerical': 0.05276872964169381, 'mean_word_length': 7.5055401662049865, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4143460', 'n_tokens_mistral': 5068, 'n_tokens_neox': 5725, 'n_words': 151}