<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Doc Record Blog</title>
        <link>https://doc-record.iuin888vip.icu/en/blog</link>
        <description>Doc Record Blog</description>
        <lastBuildDate>Sun, 19 Apr 2026 05:43:12 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Welcome]]></title>
            <link>https://doc-record.iuin888vip.icu/en/blog/welcome</link>
            <guid>https://doc-record.iuin888vip.icu/en/blog/welcome</guid>
            <pubDate>Sun, 19 Apr 2026 05:43:12 GMT</pubDate>
            <description><![CDATA[Welcome to my blog! This is a sample post to verify the log function.]]></description>
            <content:encoded><![CDATA[<p>Welcome to my blog! This is a sample post to verify the log function.</p>
<p>This log is empowered by <a href="https://docusaurus.io/" target="_blank" rel="noopener noreferrer" class="">Docusaurus</a>.</p>]]></content:encoded>
            <category>hello</category>
            <category>Docusaurus</category>
        </item>
        <item>
            <title><![CDATA[java.lang.OutOfMemoryError : unable to create new nationale Thread]]></title>
            <link>https://doc-record.iuin888vip.icu/en/blog/materiel/article/OutOfMemoryError_unable_to_create_new_native_Thread</link>
            <guid>https://doc-record.iuin888vip.icu/en/blog/materiel/article/OutOfMemoryError_unable_to_create_new_native_Thread</guid>
            <pubDate>Sun, 19 Apr 2026 05:43:12 GMT</pubDate>
            <content:encoded><![CDATA[<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Use this command to view running threads</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ps</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-elfT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">wc</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-l</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ps</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-elfT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">grep</span><span class="token plain"> appName</span><span class="token operator" style="color:#393A34">|</span><span class="token function" style="color:#d73a49">wc</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-l</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># # to get the number of running threads (you can use top or ps to get process pid)：</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ps</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">PROCESS_PID</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-lfT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">wc</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-l</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># of which processes are creating threads</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ps</span><span class="token plain"> huH</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># The number of threads that users can own are limited. Check</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">ulimit</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># /proc/sys/kernel/threads-max file to supply the thread limit within the system. Root can change this value</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Change the limit (in this instance 4096 lines)：</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ulimit-u </span><span class="token number" style="color:#36acaa">4096</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># jps list all java processes (just solve.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">jps</span><br></span></code></pre></div></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[SSH 远程端口转发配置指南：使用 socat 实现灵活的端口映射]]></title>
            <link>https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH远程端口转发配置指南_使用socat实现灵活的端口映射</link>
            <guid>https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH远程端口转发配置指南_使用socat实现灵活的端口映射</guid>
            <pubDate>Sun, 19 Apr 2026 05:28:51 GMT</pubDate>
            <description><![CDATA[目录]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="目录">目录<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#%E7%9B%AE%E5%BD%95" class="hash-link" aria-label="目录的直接链接" title="目录的直接链接" translate="no">​</a></h2>
<ol>
<li class="">
<p><a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#%E6%A6%82%E8%BF%B0" class="">概述</a></p>
</li>
<li class="">
<p><a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#%E9%85%8D%E7%BD%AE%E8%AF%A6%E8%A7%A3" class="">配置详解</a></p>
</li>
<li class="">
<p><a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86" class="">工作原理</a></p>
</li>
<li class="">
<p><a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95" class="">使用方法</a></p>
</li>
<li class="">
<p><a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4" class="">故障排除</a></p>
</li>
<li class="">
<p><a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5" class="">最佳实践</a></p>
</li>
<li class="">
<p><a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#%E9%AB%98%E7%BA%A7%E9%85%8D%E7%BD%AE" class="">高级配置</a></p>
</li>
</ol>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="概述">概述<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#%E6%A6%82%E8%BF%B0" class="hash-link" aria-label="概述的直接链接" title="概述的直接链接" translate="no">​</a></h2>
<p>SSH 远程端口转发是一种强大的网络技术，允许您将远程服务器的端口转发到本地机器或其他目标地址。结合 socat 工具，您可以实现更灵活的端口映射和网络连接管理。</p>
<p>本文档详细介绍了如何配置和使用 SSH 远程端口转发，特别关注如何确保 socat 进程在 SSH 连接断开时自动终止，避免资源泄漏和端口占用问题。</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="配置详解">配置详解<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#%E9%85%8D%E7%BD%AE%E8%AF%A6%E8%A7%A3" class="hash-link" aria-label="配置详解的直接链接" title="配置详解的直接链接" translate="no">​</a></h2>
<p>以下是完整的 SSH 配置文件示例：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Host fa.remote.intranet.company</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;#x20; HostName 10.0.16.146</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;#x20; User root</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;#x20; IdentityFile \~/.ssh/id\_ed25519\_iu</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;#x20; RemoteForward 9094 127.0.0.1:9093</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;#x20; RemoteCommand bash -c "trap 'kill %%1' EXIT; socat TCP-LISTEN:9093,fork TCP:127.0.0.1:9094 &amp; exec bash"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;#x20; ForwardAgent yes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;#x20; RequestTTY yes</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="配置项解析">配置项解析<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#%E9%85%8D%E7%BD%AE%E9%A1%B9%E8%A7%A3%E6%9E%90" class="hash-link" aria-label="配置项解析的直接链接" title="配置项解析的直接链接" translate="no">​</a></h3>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-基本连接配置">1. 基本连接配置<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#1-%E5%9F%BA%E6%9C%AC%E8%BF%9E%E6%8E%A5%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="1. 基本连接配置的直接链接" title="1. 基本连接配置的直接链接" translate="no">​</a></h4>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Host fa.remote.intranet.company</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;#x20; HostName 10.0.16.146</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;#x20; User root</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;#x20; IdentityFile \~/.ssh/id\_ed25519\_iu</span><br></span></code></pre></div></div>
<ul>
<li class="">
<p><code>Host</code>：定义主机别名，方便后续引用</p>
</li>
<li class="">
<p><code>HostName</code>：远程服务器的实际 IP 地址或域名</p>
</li>
<li class="">
<p><code>User</code>：登录远程服务器使用的用户名</p>
</li>
<li class="">
<p><code>IdentityFile</code>：指定用于身份验证的 SSH 密钥文件</p>
</li>
</ul>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-端口转发配置">2. 端口转发配置<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#2-%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="2. 端口转发配置的直接链接" title="2. 端口转发配置的直接链接" translate="no">​</a></h4>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">RemoteForward 9094 127.0.0.1:9093</span><br></span></code></pre></div></div>
<p>这是核心配置项，实现远程端口转发：</p>
<ul>
<li class="">
<p><code>9094</code>：远程服务器上监听的端口</p>
</li>
<li class="">
<p><code>127.0.0.1:9093</code>：本地机器上的目标地址和端口</p>
</li>
</ul>
<p>效果：远程服务器的 9094 端口收到的所有连接都会被转发到本地机器的 9093 端口。</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-自动启动-socat">3. 自动启动 socat<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#3-%E8%87%AA%E5%8A%A8%E5%90%AF%E5%8A%A8-socat" class="hash-link" aria-label="3. 自动启动 socat的直接链接" title="3. 自动启动 socat的直接链接" translate="no">​</a></h4>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">RemoteCommand bash -c "trap 'kill %%1' EXIT; socat TCP-LISTEN:9093,fork TCP:127.0.0.1:9094 &amp; exec bash"</span><br></span></code></pre></div></div>
<p>这个复杂的命令实现了以下功能：</p>
<ul>
<li class="">
<p><code>bash -c "..."</code>：在远程服务器上执行 bash 命令</p>
</li>
<li class="">
<p><code>trap 'kill %%1' EXIT</code>：设置退出陷阱，当 shell 退出时终止 socat 进程</p>
</li>
<li class="">
<p><code>socat TCP-LISTEN:9093,fork TCP:127.0.0.1:9094</code>：启动 socat 进行端口转发</p>
<ul>
<li class="">
<p><code>TCP-LISTEN:9093</code>：在远程服务器的 9093 端口监听</p>
</li>
<li class="">
<p><code>fork</code>：为每个连接创建新的进程</p>
</li>
<li class="">
<p><code>TCP:127.0.0.1:9094</code>：转发到本地的 9094 端口</p>
</li>
</ul>
</li>
<li class="">
<p><code>&amp;</code>：在后台运行 socat</p>
</li>
<li class="">
<p><code>exec bash</code>：启动交互式 bash shell</p>
</li>
</ul>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="4-其他配置项">4. 其他配置项<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#4-%E5%85%B6%E4%BB%96%E9%85%8D%E7%BD%AE%E9%A1%B9" class="hash-link" aria-label="4. 其他配置项的直接链接" title="4. 其他配置项的直接链接" translate="no">​</a></h4>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ForwardAgent yes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RequestTTY yes</span><br></span></code></pre></div></div>
<ul>
<li class="">
<p><code>ForwardAgent yes</code>：启用 SSH 代理转发，允许在远程服务器上使用本地的 SSH 密钥</p>
</li>
<li class="">
<p><code>RequestTTY yes</code>：强制分配伪终端，确保获得交互式 shell</p>
</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="工作原理">工作原理<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86" class="hash-link" aria-label="工作原理的直接链接" title="工作原理的直接链接" translate="no">​</a></h2>
<p>整个配置的工作流程如下：</p>
<ol>
<li class=""><strong>SSH 连接建立</strong>：当您运行<code>ssh fa.remote.intranet.company</code>时，SSH 客户端会：</li>
</ol>
<ul>
<li class="">
<p>使用指定的密钥文件进行身份验证</p>
</li>
<li class="">
<p>在远程服务器上建立 9094 端口的转发</p>
</li>
<li class="">
<p>执行 RemoteCommand 中指定的命令</p>
</li>
</ul>
<ol>
<li class=""><strong>socat 启动</strong>：RemoteCommand 会：</li>
</ol>
<ul>
<li class="">
<p>设置退出陷阱</p>
</li>
<li class="">
<p>启动 socat 监听 9093 端口</p>
</li>
<li class="">
<p>启动交互式 bash shell</p>
</li>
</ul>
<ol>
<li class=""><strong>端口转发流程</strong>：</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">外部客户端 → 远程服务器:9093 → socat → 远程服务器:9094 → SSH转发 → 本地机器:9093</span><br></span></code></pre></div></div>
<ol>
<li class=""><strong>连接关闭</strong>：当您退出 bash shell 时：</li>
</ol>
<ul>
<li class="">
<p>trap 机制会捕获 EXIT 信号</p>
</li>
<li class="">
<p>终止 socat 进程</p>
</li>
<li class="">
<p>SSH 连接关闭</p>
</li>
<li class="">
<p>所有转发端口释放</p>
</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="使用方法">使用方法<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95" class="hash-link" aria-label="使用方法的直接链接" title="使用方法的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="基本使用">基本使用<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8" class="hash-link" aria-label="基本使用的直接链接" title="基本使用的直接链接" translate="no">​</a></h3>
<ol>
<li class=""><strong>编辑 SSH 配置文件</strong></li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">nano \~/.ssh/config</span><br></span></code></pre></div></div>
<p>添加上述配置内容。</p>
<ol>
<li class=""><strong>建立连接</strong></li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ssh fa.remote.intranet.company</span><br></span></code></pre></div></div>
<ol>
<li class=""><strong>验证配置</strong></li>
</ol>
<p>在远程服务器上执行：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ss -tunlp | grep 9093</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">\# 应该显示socat在监听9093端口</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ss -tunlp | grep 9094</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">\# 应该显示ssh在监听9094端口</span><br></span></code></pre></div></div>
<ol>
<li class=""><strong>测试端口转发</strong></li>
</ol>
<p>从另一台机器测试：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">curl http://10.0.16.146:9093</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="后台运行">后台运行<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#%E5%90%8E%E5%8F%B0%E8%BF%90%E8%A1%8C" class="hash-link" aria-label="后台运行的直接链接" title="后台运行的直接链接" translate="no">​</a></h3>
<p>如果您希望在后台运行端口转发，可以使用：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ssh -fN fa.remote.intranet.company</span><br></span></code></pre></div></div>
<ul>
<li class="">
<p><code>-f</code>：在后台运行</p>
</li>
<li class="">
<p><code>-N</code>：不执行远程命令</p>
</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="故障排除">故障排除<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4" class="hash-link" aria-label="故障排除的直接链接" title="故障排除的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="常见问题及解决方案">常见问题及解决方案<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E5%8F%8A%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88" class="hash-link" aria-label="常见问题及解决方案的直接链接" title="常见问题及解决方案的直接链接" translate="no">​</a></h3>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-端口占用错误">1. 端口占用错误<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#1-%E7%AB%AF%E5%8F%A3%E5%8D%A0%E7%94%A8%E9%94%99%E8%AF%AF" class="hash-link" aria-label="1. 端口占用错误的直接链接" title="1. 端口占用错误的直接链接" translate="no">​</a></h4>
<p><strong>症状</strong>：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Address already in use</span><br></span></code></pre></div></div>
<p><strong>解决方案</strong>：</p>
<p>检查并终止占用端口的进程：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">\# 在远程服务器上执行</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ss -tunlp | grep 9093</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kill -9 &lt;进程ID&gt;</span><br></span></code></pre></div></div>
<p>或者修改配置使用其他端口。</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-无法获得交互式-shell">2. 无法获得交互式 shell<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#2-%E6%97%A0%E6%B3%95%E8%8E%B7%E5%BE%97%E4%BA%A4%E4%BA%92%E5%BC%8F-shell" class="hash-link" aria-label="2. 无法获得交互式 shell的直接链接" title="2. 无法获得交互式 shell的直接链接" translate="no">​</a></h4>
<p><strong>症状</strong>：连接后直接退出或没有 bash 提示符</p>
<p><strong>解决方案</strong>：</p>
<p>确保配置中包含：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">RequestTTY yes</span><br></span></code></pre></div></div>
<p>或者在命令行中使用：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ssh -t fa.remote.intranet.company</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-socat-在-ssh-断开后仍然运行">3. socat 在 SSH 断开后仍然运行<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#3-socat-%E5%9C%A8-ssh-%E6%96%AD%E5%BC%80%E5%90%8E%E4%BB%8D%E7%84%B6%E8%BF%90%E8%A1%8C" class="hash-link" aria-label="3. socat 在 SSH 断开后仍然运行的直接链接" title="3. socat 在 SSH 断开后仍然运行的直接链接" translate="no">​</a></h4>
<p><strong>症状</strong>：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ps -ef | grep socat</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">\# 显示socat进程，父ID为1</span><br></span></code></pre></div></div>
<p><strong>解决方案</strong>：</p>
<p>手动终止进程：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pkill socat</span><br></span></code></pre></div></div>
<p>或者修改 RemoteCommand 确保 trap 正确工作：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">RemoteCommand bash -c "trap 'pkill socat' EXIT; socat TCP-LISTEN:9093,fork TCP:127.0.0.1:9094 &amp; exec bash"</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="最佳实践">最佳实践<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5" class="hash-link" aria-label="最佳实践的直接链接" title="最佳实践的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-使用不常用端口">1. 使用不常用端口<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#1-%E4%BD%BF%E7%94%A8%E4%B8%8D%E5%B8%B8%E7%94%A8%E7%AB%AF%E5%8F%A3" class="hash-link" aria-label="1. 使用不常用端口的直接链接" title="1. 使用不常用端口的直接链接" translate="no">​</a></h3>
<p>避免使用常见服务端口（如 80、443、22 等），减少冲突风险。</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-添加端口占用检查">2. 添加端口占用检查<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#2-%E6%B7%BB%E5%8A%A0%E7%AB%AF%E5%8F%A3%E5%8D%A0%E7%94%A8%E6%A3%80%E6%9F%A5" class="hash-link" aria-label="2. 添加端口占用检查的直接链接" title="2. 添加端口占用检查的直接链接" translate="no">​</a></h3>
<p>修改 RemoteCommand，添加端口占用检查：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">RemoteCommand bash -c "if ! ss -tunlp | grep -q 9093; then trap 'kill %%1' EXIT; socat TCP-LISTEN:9093,fork TCP:127.0.0.1:9094 &amp; fi; exec bash"</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-使用-autossh-保持连接">3. 使用 autossh 保持连接<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#3-%E4%BD%BF%E7%94%A8-autossh-%E4%BF%9D%E6%8C%81%E8%BF%9E%E6%8E%A5" class="hash-link" aria-label="3. 使用 autossh 保持连接的直接链接" title="3. 使用 autossh 保持连接的直接链接" translate="no">​</a></h3>
<p>对于需要长期运行的转发，使用 autossh：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" fa.remote.intranet.company</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="4-日志记录">4. 日志记录<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#4-%E6%97%A5%E5%BF%97%E8%AE%B0%E5%BD%95" class="hash-link" aria-label="4. 日志记录的直接链接" title="4. 日志记录的直接链接" translate="no">​</a></h3>
<p>添加日志记录以便故障排除：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">RemoteCommand bash -c "trap 'kill %%1' EXIT; socat -d -d TCP-LISTEN:9093,fork TCP:127.0.0.1:9094 &gt; /var/log/socat.log 2&gt;&amp;1 &amp; exec bash"</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="高级配置">高级配置<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#%E9%AB%98%E7%BA%A7%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="高级配置的直接链接" title="高级配置的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-多端口转发">1. 多端口转发<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#1-%E5%A4%9A%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91" class="hash-link" aria-label="1. 多端口转发的直接链接" title="1. 多端口转发的直接链接" translate="no">​</a></h3>
<p>您可以配置多个 RemoteForward：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">RemoteForward 9094 127.0.0.1:9093</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RemoteForward 9095 127.0.0.1:9094</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RemoteForward 9096 192.168.1.100:80</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-条件执行">2. 条件执行<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#2-%E6%9D%A1%E4%BB%B6%E6%89%A7%E8%A1%8C" class="hash-link" aria-label="2. 条件执行的直接链接" title="2. 条件执行的直接链接" translate="no">​</a></h3>
<p>根据本地环境变量决定是否启动转发：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Match exec "test -n \\"\$ENABLE\_FORWARD\\""</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&amp;#x20; RemoteForward 9094 127.0.0.1:9093</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-使用环境变量">3. 使用环境变量<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#3-%E4%BD%BF%E7%94%A8%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F" class="hash-link" aria-label="3. 使用环境变量的直接链接" title="3. 使用环境变量的直接链接" translate="no">​</a></h3>
<p>在 RemoteCommand 中使用环境变量：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">RemoteCommand bash -c "PORT=\${PORT:-9093}; trap 'kill %%1' EXIT; socat TCP-LISTEN:\\\$PORT,fork TCP:127.0.0.1:9094 &amp; exec bash"</span><br></span></code></pre></div></div>
<p>然后在连接时设置变量：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">PORT=9095 ssh fa.remote.intranet.company</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="总结">总结<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/SSH%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97_%E4%BD%BF%E7%94%A8socat%E5%AE%9E%E7%8E%B0%E7%81%B5%E6%B4%BB%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接" translate="no">​</a></h2>
<p>SSH 远程端口转发结合 socat 是一种强大的网络工具，能够实现灵活的端口映射和连接管理。通过本文档介绍的配置方法，您可以：</p>
<ol>
<li class="">
<p>建立可靠的远程端口转发</p>
</li>
<li class="">
<p>确保 socat 进程在 SSH 连接断开时自动终止</p>
</li>
<li class="">
<p>获得完整的交互式 shell 体验</p>
</li>
<li class="">
<p>避免常见的端口冲突和资源泄漏问题</p>
</li>
</ol>
<p>这种配置特别适用于需要从外部访问内部服务、构建安全隧道或实现复杂网络拓扑的场景。</p>
<hr>
<p><strong>更新时间</strong>：2025 年 12 月 6 日</p>
<p><strong>版本</strong>：1.0</p>
<p><strong>适用场景</strong>：SSH 端口转发、远程访问、网络隧道</p>
<blockquote>
<p>（注：文档部分内容可能由 AI 生成）</p>
</blockquote>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[arthas查看sql]]></title>
            <link>https://doc-record.iuin888vip.icu/en/blog/materiel/article/arthas查看sql</link>
            <guid>https://doc-record.iuin888vip.icu/en/blog/materiel/article/arthas查看sql</guid>
            <pubDate>Sun, 19 Apr 2026 05:28:51 GMT</pubDate>
            <description><![CDATA[参考文章]]></description>
            <content:encoded><![CDATA[<p><a href="http://codefun007.xyz/a/article_detail/2392.htm" target="_blank" rel="noopener noreferrer" class="">参考文章</a></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">watch</span><span class="token plain"> java.sql.Connection prepareStatement </span><span class="token string" style="color:#e3116c">'{params,throwExp}'</span><span class="token plain">    </span><span class="token parameter variable" style="color:#36acaa">-x</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">watch</span><span class="token plain"> java.sql.Statement executeQuery </span><span class="token string" style="color:#e3116c">'{params,throwExp}'</span><span class="token plain">    </span><span class="token parameter variable" style="color:#36acaa">-x</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">watch</span><span class="token plain"> org.apache.ibatis.mapping.BoundSql getSql </span><span class="token string" style="color:#e3116c">'{params,returnObj,throwExp}'</span><span class="token plain">    </span><span class="token parameter variable" style="color:#36acaa">-x</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<ul>
<li class="">temp</li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">watch</span><span class="token plain"> java.sql.Statement executeQuery </span><span class="token string" style="color:#e3116c">'{params,returnObj,throwExp}'</span><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-x</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">watch</span><span class="token plain"> java.sql.Statement executeQuery </span><span class="token string" style="color:#e3116c">'{params,returnObj,throwExp}'</span><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-x</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">watch</span><span class="token plain"> java.sql.Statement executeQuery </span><span class="token string" style="color:#e3116c">'{params,returnObj,throwExp}'</span><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-x</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 过滤某个表的sql</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">watch</span><span class="token plain"> java.sql.Statement executeQuery </span><span class="token string" style="color:#e3116c">'{params,returnObj,throwExp}'</span><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-x</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">grep</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-C</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"com_commodity_shop"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 看到的是jpa的非本地sql</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">watch</span><span class="token plain"> javax.persistence.EntityManager createQuery </span><span class="token string" style="color:#e3116c">'{params,returnObj,throwExp}'</span><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-x</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[postgresql表死锁问题的排查方式_PostgreSQL_脚本之家]]></title>
            <link>https://doc-record.iuin888vip.icu/en/blog/materiel/article/postgresql表死锁问题的排查方式</link>
            <guid>https://doc-record.iuin888vip.icu/en/blog/materiel/article/postgresql表死锁问题的排查方式</guid>
            <pubDate>Sun, 19 Apr 2026 05:28:51 GMT</pubDate>
            <description><![CDATA[## Excerpt]]></description>
            <content:encoded><![CDATA[<blockquote>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="excerpt">Excerpt<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/postgresql%E8%A1%A8%E6%AD%BB%E9%94%81%E9%97%AE%E9%A2%98%E7%9A%84%E6%8E%92%E6%9F%A5%E6%96%B9%E5%BC%8F#excerpt" class="hash-link" aria-label="Excerpt的直接链接" title="Excerpt的直接链接" translate="no">​</a></h2>
<p>这篇文章主要介绍了postgresql表死锁问题的排查方式，具有很好的参考价值，希望对大家有所帮助。一起跟随小编过来看看吧</p>
</blockquote>
<p>1.查询激活的执行中的sql,查看有哪些更新update的sql。</p>
<p>select *
from pg_stat_activity
where state = 'active';</p>
<p>2. 查询表中存在的锁</p>
<p>select a.locktype, a.database, a.pid, a.mode, a.relation, b.relname
from pg_locks a
join pg_class b on a.relation = b.oid
where lower(b.relname) = 'h5_game';</p>
<p>3. 杀掉死锁进程</p>
<p>select pg_terminate_backend(pid)
from pg_stat_activity
where state = 'active'
and pid != pg_backend_pid()
--and pid = 14172
and pid in (select a.pid
from pg_locks a
join pg_class b on a.relation = b.oid
where lower(b.relname) = 'news_content')</p>
<p>锁模式</p>
<p>/* NoLock is not a lock mode, but a flag value meaning "don't get a lock" */
#define NoLock                 0</p>
<p>#define AccessShareLock         1        /* SELECT <em>/
#define RowShareLock          2        /</em> SELECT FOR UPDATE/FOR SHARE <em>/
#define RowExclusiveLock        3        /</em> INSERT, UPDATE, DELETE <em>/
#define ShareUpdateExclusiveLock 4       /</em> VACUUM (non-FULL),ANALYZE, CREATE
* INDEX CONCURRENTLY <em>/
#define ShareLock                5        /</em> CREATE INDEX (WITHOUT CONCURRENTLY) <em>/
#define ShareRowExclusiveLock  6        /</em> like EXCLUSIVE MODE, but allows ROW
* SHARE <em>/
#define ExclusiveLock          7        /</em> blocks ROW SHARE/SELECT...FOR
* UPDATE <em>/
#define AccessExclusiveLock       8        /</em> ALTER TABLE, DROP TABLE, VACUUM
* FULL, and unqualified LOCK TABLE */</p>
<p><strong>补充：Postgresql死锁的处理</strong></p>
<p>背景：</p>
<p>对表进行所有操作都卡住，原因可能是更新表时导致这个表死锁了，开始进行排查</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="解决一查询pg_stat_activity有没有记录">解决一：查询pg_stat_activity有没有记录<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/postgresql%E8%A1%A8%E6%AD%BB%E9%94%81%E9%97%AE%E9%A2%98%E7%9A%84%E6%8E%92%E6%9F%A5%E6%96%B9%E5%BC%8F#%E8%A7%A3%E5%86%B3%E4%B8%80%E6%9F%A5%E8%AF%A2pg_stat_activity%E6%9C%89%E6%B2%A1%E6%9C%89%E8%AE%B0%E5%BD%95" class="hash-link" aria-label="解决一：查询pg_stat_activity有没有记录的直接链接" title="解决一：查询pg_stat_activity有没有记录的直接链接" translate="no">​</a></h3>
<p>pg版本10.2</p>
<p>select pid,query,* from pg_stat_activity where datname='死锁的数据库' and wait_event_type = 'Lock';
select pg_cancel_backend('死锁那条数据的pid值');##只能杀死select 语句, 对其他语句不生效
pg_terminate_backend('死锁那条数据的pid值');#select,drop等各种操作</p>
<p>执行后发现select和delete表时正常执行，但truncate和drop表时会一直运行，也不报错。</p>
<p>“drop table” 和 “truncate table” 需要申请排它锁"ACCESS EXCLUSIVE"， 执行这个命令卡住时，说明此时这张表上还有操作正在进行，比如查询等，</p>
<p>那么只有等待这个查询操作完成，“drop table” 或"truncate table"或者增加字段的SQL才能获取这张表上的 "ACCESS EXCLUSIVE"锁，操作才能进行下去。</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="解决二查询pg_locks是否有这个对象的锁">解决二：查询pg_locks是否有这个对象的锁<a href="https://doc-record.iuin888vip.icu/en/blog/materiel/article/postgresql%E8%A1%A8%E6%AD%BB%E9%94%81%E9%97%AE%E9%A2%98%E7%9A%84%E6%8E%92%E6%9F%A5%E6%96%B9%E5%BC%8F#%E8%A7%A3%E5%86%B3%E4%BA%8C%E6%9F%A5%E8%AF%A2pg_locks%E6%98%AF%E5%90%A6%E6%9C%89%E8%BF%99%E4%B8%AA%E5%AF%B9%E8%B1%A1%E7%9A%84%E9%94%81" class="hash-link" aria-label="解决二：查询pg_locks是否有这个对象的锁的直接链接" title="解决二：查询pg_locks是否有这个对象的锁的直接链接" translate="no">​</a></h3>
<p>select oid,relname from pg_class where relname='table name';
select locktype,pid,relation,mode,granted,* from pg_locks where relation= '上面查询出来的oid';
select pg_terminate_backend('进程ID');</p>
<p>问题解决！！！</p>
<p>坑：一开始不知道pg_cancel_backend(‘死锁那条数据的pid值');##只能杀死select 语句, 对其他语句不生效，杀了进程查询发现还存在，反复杀反复存在，换了pg_terminate_backend(‘进程ID')问题就解决了。</p>
<p>以上为个人经验，希望能给大家一个参考，也希望大家多多支持脚本之家。如有错误或未考虑完全的地方，望不吝赐教。</p>
<p>原文链接：<a href="https://blog.csdn.net/fsstyle/article/details/87917720" target="_blank" rel="noopener noreferrer" class="">https://blog.csdn.net/fsstyle/article/details/87917720</a></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[一键更换Linux优质的软件源和docker源]]></title>
            <link>https://doc-record.iuin888vip.icu/en/blog/materiel/article/一键更换Linux优质的软件源和docker源</link>
            <guid>https://doc-record.iuin888vip.icu/en/blog/materiel/article/一键更换Linux优质的软件源和docker源</guid>
            <pubDate>Sun, 19 Apr 2026 05:28:51 GMT</pubDate>
            <description><![CDATA[参考文章]]></description>
            <content:encoded><![CDATA[<p><a href="https://mp.weixin.qq.com/s/XlluE2SDzyNjTjg-_kRdyw" target="_blank" rel="noopener noreferrer" class="">参考文章</a></p>
<p><a href="https://linuxmirrors.cn/" target="_blank" rel="noopener noreferrer" class="">镜像地址</a></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 是用root命令执行</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 软件源一键更换</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">bash</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-sSL</span><span class="token plain"> https://linuxmirrors.cn/main.sh</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Docker 一键安装</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">bash</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-sSL</span><span class="token plain"> https://linuxmirrors.cn/docker.sh</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[docker/doc/article/docker镜像源]]></title>
            <link>https://doc-record.iuin888vip.icu/en/blog/docker/doc/article/docker镜像源</link>
            <guid>https://doc-record.iuin888vip.icu/en/blog/docker/doc/article/docker镜像源</guid>
            <pubDate>Sun, 19 Apr 2026 05:28:51 GMT</pubDate>
            <description><![CDATA[---]]></description>
            <content:encoded><![CDATA[<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="title-docker镜像源date-2024-05-22slug-docker-mirror-source">title: docker镜像源
date: 2024-05-22
slug: docker-mirror-source<a href="https://doc-record.iuin888vip.icu/en/blog/docker/doc/article/docker%E9%95%9C%E5%83%8F%E6%BA%90#title-docker%E9%95%9C%E5%83%8F%E6%BA%90date-2024-05-22slug-docker-mirror-source" class="hash-link" aria-label="title: docker镜像源
date: 2024-05-22
slug: docker-mirror-source的直接链接" title="title: docker镜像源
date: 2024-05-22
slug: docker-mirror-source的直接链接" translate="no">​</a></h2>
<h1>docker镜像源</h1>
<p><a href="https://developer.aliyun.com/article/653081" target="_blank" rel="noopener noreferrer" class="">参考文章</a></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Docker 官方中国区</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># https://registry.docker-cn.com</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 网易</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># http://hub-mirror.c.163.com</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ustc</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># https://docker.mirrors.ustc.edu.cn</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 测试镜像源</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> run </span><span class="token parameter variable" style="color:#36acaa">--rm</span><span class="token plain"> hello-world --registry-mirror</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">https://registry.docker-cn.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> run </span><span class="token parameter variable" style="color:#36acaa">--rm</span><span class="token plain"> hello-world --registry-mirror</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">http://hub-mirror.c.163.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> run </span><span class="token parameter variable" style="color:#36acaa">--rm</span><span class="token plain"> hello-world --registry-mirror</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">https://docker.mirrors.ustc.edu.cn</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> run </span><span class="token parameter variable" style="color:#36acaa">--rm</span><span class="token plain"> node:14.21.1-slim --registry-mirror</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">https://registry.docker-cn.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> run </span><span class="token parameter variable" style="color:#36acaa">--rm</span><span class="token plain"> node:14.21.1-slim --registry-mirror</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">http://hub-mirror.c.163.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> run </span><span class="token parameter variable" style="color:#36acaa">--rm</span><span class="token plain"> node:14.21.1-slim --registry-mirror</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">https://docker.mirrors.ustc.edu.cn</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<ul>
<li class="">最新可用的docker镜像源
<ul>
<li class="">docker.fxxk.dedyn.io
<ul>
<li class="">顺便研究下Cloudflare Workers的工作原理, 感觉挺有用的</li>
<li class=""><a href="https://blog.cmliussss.com/p/CF-Workers-docker.io/" target="_blank" rel="noopener noreferrer" class="">相关博客</a></li>
</ul>
</li>
<li class="">自己部署的docker镜像源
<ul>
<li class=""><a href="https://cf-workers-docker-io-ac6.pages.dev/" target="_blank" rel="noopener noreferrer" class="">docker镜像源</a></li>
</ul>
</li>
</ul>
</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[docker-compose服务间依赖通过自定义健康检查实现顺序启动]]></title>
            <link>https://doc-record.iuin888vip.icu/en/blog/docker-compose-healthcheck</link>
            <guid>https://doc-record.iuin888vip.icu/en/blog/docker-compose-healthcheck</guid>
            <pubDate>Wed, 22 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Docker Compose中的condition service_healthy来确保依赖的服务已经健康启动。]]></description>
            <content:encoded><![CDATA[<p>Docker Compose中的<code>condition: service_healthy</code>配置是用来判断依赖的服务是否健康的。当一个服务依赖于另一个服务时，可以使用<code>depends_on</code>和<code>condition: service_healthy</code>来确保依赖的服务已经健康启动。</p>
<p>下面是关于如何判断服务是否健康的一些相关内容：</p>
<ol>
<li class="">
<p>健康检查命令：在Dockerfile或docker container run命令中，可以使用<code>HEALTHCHECK</code>来定义容器的健康检查命令<a href="https://blog.csdn.net/weixin_48447848/article/details/122632562" target="_blank" rel="noopener noreferrer" class="">[1]</a>。健康检查命令可以是任何能够返回0或非0退出代码的命令，例如使用<code>curl</code>命令检查服务是否可访问。</p>
</li>
<li class="">
<p>健康检查参数：健康检查命令可以使用一些参数来配置检查的间隔、超时和重试次数等。常用的健康检查参数包括：</p>
<ul>
<li class=""><code>--interval</code>：指定检查的间隔时间，默认为30秒。</li>
<li class=""><code>--timeout</code>：指定每次检查的超时时间，默认为30秒。</li>
<li class=""><code>--retries</code>：指定连续失败的次数后将服务标记为不健康，默认为3次。</li>
<li class=""><code>--start-period</code>：指定容器启动后等待健康检查开始的时间，默认为0秒。</li>
</ul>
</li>
<li class="">
<p><code>condition: service_healthy</code>配置：在Docker Compose中，可以使用<code>condition: service_healthy</code>来指定依赖的服务是否健康。当依赖的服务的健康状态为健康时，才会启动当前的服务。这样可以确保依赖的服务已经成功启动并且可用。</p>
</li>
</ol>
<p>下面是一个示例的docker-compose.yml文件，演示了如何使用健康检查和<code>condition: service_healthy</code>来判断服务是否健康并依次启动：</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"3.8"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">services</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">flask</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">build</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">context</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ./flask</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">dockerfile</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Dockerfile</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flask</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">demo</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> REDIS_HOST=redis</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">server</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> REDIS_PASS=$</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">REDIS_PASSWORD</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">healthcheck</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">test</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"CMD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"curl"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"-f"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"http://localhost:5000"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">interval</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 30s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">timeout</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 3s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">retries</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">start_period</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 40s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">depends_on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">redis-server</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">condition</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> service_healthy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> backend</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> frontend</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">redis-server</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> redis</span><br></span></code></pre></div></div>
<p>在上述示例中，flask服务依赖于redis-server服务。flask服务的健康检查命令是使用<code>curl</code>命令检查<code>http://localhost:5000</code>是否可访问。只有当redis-server服务的健康状态为健康时，flask服务才会启动。</p>
<hr>
<p>Learn more:</p>
<ol>
<li class=""><a href="https://blog.csdn.net/weixin_48447848/article/details/122632562" target="_blank" rel="noopener noreferrer" class="">【Docker系列】Docker Compose 服务依赖和健康检查_docker-compose healthcheck-CSDN博客</a></li>
<li class=""><a href="https://blog.csdn.net/xujiamin0022016/article/details/123642210" target="_blank" rel="noopener noreferrer" class="">[docker]-docker-compose通过healthcheck判断容器状态并依次启动_docker-compose healthcheck-CSDN博客</a></li>
<li class=""><a href="https://juejin.cn/post/7250374485567619131" target="_blank" rel="noopener noreferrer" class="">Docker compose 服务依赖关系及健康检查 - 掘金</a></li>
</ol>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="参考内容">参考内容<a href="https://doc-record.iuin888vip.icu/en/blog/docker-compose-healthcheck#%E5%8F%82%E8%80%83%E5%86%85%E5%AE%B9" class="hash-link" aria-label="参考内容的直接链接" title="参考内容的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/nocodb/nocodb/blob/develop/docker-compose/pg/docker-compose.yml" target="_blank" rel="noopener noreferrer" class="">nocodb部署yml</a></li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ssh]]></title>
            <link>https://doc-record.iuin888vip.icu/en/blog/ssh-manual</link>
            <guid>https://doc-record.iuin888vip.icu/en/blog/ssh-manual</guid>
            <pubDate>Wed, 22 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[- SSH Tunnel Concise Tutorial]]></description>
            <content:encoded><![CDATA[<ul>
<li class="">
<p><a href="https://www.lixueduan.com/posts/linux/07-ssh-tunnel/" target="_blank" rel="noopener noreferrer" class="">SSH Tunnel Concise Tutorial</a></p>
<ul>
<li class="">Dynamic Forward
<ul>
<li class="">The request address is 192.168.1.100:300, and the request address transmitted via SSH is 192.168.1.100:3000.</li>
<li class="">ssh -N -D localhost: 2000 root@192.168.10.85</li>
<li class="">We need only socks proxy on local configuration, localhost:2000 to forward all requests to the 192.168.10.85 machine via the ssh 2000 port.</li>
</ul>
</li>
<li class="">Local Forward
<ul>
<li class="">We need to execute the following command on ServerA to enable ssh tunnel：</li>
<li class="">ssh -N - L 888: 192.168.10.134:8888 root@192.168.10.85</li>
<li class="">After execution server A has started listening to the 8888 port. By default it is on a local ring address, it can specify an ip or add -g parameters to open gateway mode.</li>
</ul>
</li>
</ul>
</li>
<li class="">
<p>socks5 proxy</p>
</li>
<li class="">
<p><a href="https://wlwang41.github.io/content/ops/ssh%E9%9A%A7%E9%81%93%E4%BB%A3%E7%90%86.html" target="_blank" rel="noopener noreferrer" class="">参考文章</a></p>
</li>
<li class="">
<p><a href="https://blog.bug-maker.com/archives/47.html" target="_blank" rel="noopener noreferrer" class="">参考文章1</a></p>
</li>
<li class="">
<p><a href="https://www.cnblogs.com/memphise/articles/6420019.html" target="_blank" rel="noopener noreferrer" class="">参考文章2</a></p>
<ul>
<li class="">You can use a software called Sockscap. Throw an app and get it online.(apps that partially require calling multiple processes may not work anyway)</li>
<li class="">If you want to convert the socks proxy to an http-proxy, you can use the east.</li>
</ul>
</li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Upload Key ~/.ssh/id_ed25519_iu</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">chmod</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">400</span><span class="token plain"> ~/.ssh/id_ed25519_iu</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ~/.ssh/config</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Host mac.intranet.company</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  HostName </span><span class="token number" style="color:#36acaa">10.0</span><span class="token plain">.1. </span><span class="token number" style="color:#36acaa">51</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  User iuin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  IdentityFile ~/.ssh/id_ed25519_iu</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># PasswordAuthentication 123456</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ssh mac.intranet.company see whether or not to be set up</span><br></span></code></pre></div></div>
<ul>
<li class=""><a class="" href="https://doc-record.iuin888vip.icu/en/blog/ssh%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86">ssh动态代理</a></li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 登录服务器10.0.1.233</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 后台启动ssh动态转发</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ssh</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-o</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">GatewayPorts</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">yes </span><span class="token parameter variable" style="color:#36acaa">-D</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2000</span><span class="token plain"> mac.intranet.company </span><span class="token parameter variable" style="color:#36acaa">-NTfCg</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 在本机中配置socks代理, 网络流量则会通过ssh转发到服务器上, 然后在访问互联网</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 配置地址: 10.0.1.233:2000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># PS: 可以配合clash一起使用, 实现通过ssh让中间机器去连接指定或多个VPN, 本机不连多余的VPN(其实是不想下载一堆的VPN相关软件), 只用clash就能透传流量过去</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">port: </span><span class="token number" style="color:#36acaa">7890</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">socks-port: </span><span class="token number" style="color:#36acaa">7891</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">allow-lan: </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mode: Rule</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">log-level: info</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">external-controller: </span><span class="token number" style="color:#36acaa">127.0</span><span class="token plain">.0.1:9090</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">proxies:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - name: iuin_bpDev_mac</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    type: socks5</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    server: </span><span class="token number" style="color:#36acaa">10.0</span><span class="token plain">.1.233</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    port: </span><span class="token number" style="color:#36acaa">2000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">proxy-groups:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - name: ssh_g</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    type: </span><span class="token keyword" style="color:#00009f">select</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    proxies:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      - iuin_bpDev_mac</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">rules:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># 乐橘nacos所在服务器</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> - IP-CIDR,10.0.10.180/32,ssh_g</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> - DOMAIN-SUFFIX,yelomall.cn,ssh_g</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span></code></pre></div></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Mihomo SSH Config Alias Support]]></title>
            <link>https://doc-record.iuin888vip.icu/en/blog/Mihomo-ssh-alias</link>
            <guid>https://doc-record.iuin888vip.icu/en/blog/Mihomo-ssh-alias</guid>
            <pubDate>Wed, 22 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[🔗 Project Info]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="-project-info">🔗 Project Info<a href="https://doc-record.iuin888vip.icu/en/blog/Mihomo-ssh-alias#-project-info" class="hash-link" aria-label="🔗 Project Info的直接链接" title="🔗 Project Info的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>Fork Repository</strong>: <a href="https://github.com/iuin8/mihomo" target="_blank" rel="noopener noreferrer" class="">https://github.com/iuin8/mihomo</a></li>
<li class=""><strong>Branch</strong>: (Make sure to see branches that contain the <code>ssh-config-alias</code> function, e.g. <code>ssh_system_v1.19.17</code>)</li>
<li class=""><strong>Core file</strong>: <code>adapter/outbound/ssh.go</code>, <code>adapter/outbound/ssh_system.go</code></li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="-needs-background">📖 Needs background<a href="https://doc-record.iuin888vip.icu/en/blog/Mihomo-ssh-alias#-needs-background" class="hash-link" aria-label="📖 Needs background的直接链接" title="📖 Needs background的直接链接" translate="no">​</a></h2>
<p>In a complex network environment, users often maintain a full set of SSH profiles (<code>~/.ssh/config</code>).These configurations may contain：</p>
<ol>
<li class=""><strong>ProxyJump (dashboard)</strong>：requires one or more skippers to access the target inner web server.</li>
<li class=""><strong>ProxyCommand</strong>：uses third-party authentication tools (e.g. Cloudflare Access, AWS SSM).</li>
<li class=""><strong>IdentityFile</strong>：uses different key files for different hosts.</li>
<li class=""><strong>Host alias</strong>：uses short aliases instead of long IP or domain names.</li>
</ol>
<p>The original Mihomo SSH adapter uses the Go language native SSH library and cannot use these system level configurations directly, resulting in the user having to manually convert complex springboard logic to the Dialer Proxy chain. The configuration is onerous and does not support some advanced instructions (such as the special ProxyCommand).</p>
<p><strong>Target</strong>：allows Mihomo to "loan" system SSH client directly, simply fill in a host alias (e.g. <code>my-server</code>), the remaining authentication, skip to system SSH handling.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="-features">✨ Features<a href="https://doc-record.iuin888vip.icu/en/blog/Mihomo-ssh-alias#-features" class="hash-link" aria-label="✨ Features的直接链接" title="✨ Features的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="full-ssh-config-support">Full SSH Config support<a href="https://doc-record.iuin888vip.icu/en/blog/Mihomo-ssh-alias#full-ssh-config-support" class="hash-link" aria-label="Full SSH Config support的直接链接" title="Full SSH Config support的直接链接" translate="no">​</a></h3>
<p>Build tunnels by calling the system <code>ssh</code> command, Mihomo can support all instructions： that support SSH clients</p>
<ul>
<li class="">✅ <code>ProxyJump</code> / <code>JumpHost</code></li>
<li class="">✅ <code>ProxyCommand</code> (support cloudfled, nc etc.)</li>
<li class="">✅ <code>IdentityFile</code>, <code>User</code>, <code>Port</code> and so on</li>
<li class="">✅ advanced configuration logic like <code>Match</code>, <code>Include</code></li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-smart-user-switching-sudo--u">2. Smart user switching (<code>sudo -u</code>)<a href="https://doc-record.iuin888vip.icu/en/blog/Mihomo-ssh-alias#2-smart-user-switching-sudo--u" class="hash-link" aria-label="2-smart-user-switching-sudo--u的直接链接" title="2-smart-user-switching-sudo--u的直接链接" translate="no">​</a></h3>
<p>Mihomo usually runs with <strong>root</strong> permissions (for TUN mode and so on) while the user's SSH configuration is located in the regular user directory.This feature implements：</p>
<ul>
<li class="">Automatically detect or specify actual users.</li>
<li class="">Use <code>sudo -u &lt;user&gt; -i</code> to switch identity to perform SSH.</li>
<li class="">**-i<code> parameters** ensure that the complete login environment of the user (</code>PATH<code>), ensures that the </code>cloudflared` command can be found.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="zero-configuration-key">Zero configuration key<a href="https://doc-record.iuin888vip.icu/en/blog/Mihomo-ssh-alias#zero-configuration-key" class="hash-link" aria-label="Zero configuration key的直接链接" title="Zero configuration key的直接链接" translate="no">​</a></h3>
<p>There is no need to fill the private key content in the Mihomo configuration file. It will automatically read <code>~/.ssh/id_rsa</code> or the <code>IdentityFile</code> specified in the configuration.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="-usage-method">🚀 Usage method<a href="https://doc-record.iuin888vip.icu/en/blog/Mihomo-ssh-alias#-usage-method" class="hash-link" aria-label="🚀 Usage method的直接链接" title="🚀 Usage method的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="parameter-description">Parameter Description<a href="https://doc-record.iuin888vip.icu/en/blog/Mihomo-ssh-alias#parameter-description" class="hash-link" aria-label="Parameter Description的直接链接" title="Parameter Description的直接链接" translate="no">​</a></h3>





























<table><thead><tr><th>Fields</th><th>Note</th></tr></thead><tbody><tr><td><code>type</code></td><td>must be <code>ssh</code></td></tr><tr><td><code>server</code></td><td><strong>Key</strong>：Fill <code>Host</code> in ~/.ssh/config`</td></tr><tr><td><code>port</code></td><td><strong>Note</strong>：fills the target service<strong>inner</strong> listening ports (usually <strong>22</strong>).<br>⚠️ Don't fill the map port in <code>~/.ssh/config</code>.</td></tr><tr><td><code>use-ssh-config-alias</code></td><td>Set to <code>true</code> to enable this feature</td></tr><tr><td><code>ssh-user</code></td><td>Specify the username of the local SSH command (your macOS/Linux username)</td></tr></tbody></table>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="configuration-example">Configuration Example<a href="https://doc-record.iuin888vip.icu/en/blog/Mihomo-ssh-alias#configuration-example" class="hash-link" aria-label="Configuration Example的直接链接" title="Configuration Example的直接链接" translate="no">​</a></h3>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="scene-1base-jump-proxyjump">Scene 1：Base Jump (ProxyJump)<a href="https://doc-record.iuin888vip.icu/en/blog/Mihomo-ssh-alias#scene-1base-jump-proxyjump" class="hash-link" aria-label="Scene 1：Base Jump (ProxyJump)的直接链接" title="Scene 1：Base Jump (ProxyJump)的直接链接" translate="no">​</a></h4>
<p><strong>SSH Config (<code>~/.ssh/config</code>)</strong>:</p>
<div class="language-ssh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-ssh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Host base</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  HostName 1.2.3.4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  User admin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Post internal-db</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  HostName 10.0.5</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  User root</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ProxyJump base # automatic bastion jump forward</span><br></span></code></pre></div></div>
<p><strong>Mihomo Configuration</strong>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">proxies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Internal-DB-SSH"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ssh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">server</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"internal-db"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Direct Alias</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">22</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Internal SSH port</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">use-ssh-config-alias</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ssh-user</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"your-username"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">#</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="scene-2cloudflare-access-proxycommand">Scene 2：Cloudflare Access (ProxyCommand)<a href="https://doc-record.iuin888vip.icu/en/blog/Mihomo-ssh-alias#scene-2cloudflare-access-proxycommand" class="hash-link" aria-label="Scene 2：Cloudflare Access (ProxyCommand)的直接链接" title="Scene 2：Cloudflare Access (ProxyCommand)的直接链接" translate="no">​</a></h4>
<p>*<em>SSH Config</em>:</p>
<div class="language-ssh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-ssh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Host my-cf-server</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  HostName ssh.example.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  User root</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  # Requires cloudfled command in PATH</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ProxyCommand cloudflowed access ssh --hostname %h</span><br></span></code></pre></div></div>
<p><strong>Mihomo Configuration</strong>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">proxies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CF-SSH"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ssh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">server</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"my-cf-server"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">22</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">use-ssh-config-alias</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ssh-user</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"your-username"</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="️-summary-of-rationale">🛠️ Summary of rationale<a href="https://doc-record.iuin888vip.icu/en/blog/Mihomo-ssh-alias#%EF%B8%8F-summary-of-rationale" class="hash-link" aria-label="🛠️ Summary of rationale的直接链接" title="🛠️ Summary of rationale的直接链接" translate="no">​</a></h2>
<p>Mihomo will perform a command similar to： at the bottom after receiving a connection request</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-u</span><span class="token plain"> your-username </span><span class="token parameter variable" style="color:#36acaa">-i</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">ssh</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-W</span><span class="token plain"> localhost:22 my-host-alias</span><br></span></code></pre></div></div>
<p>This command creates a TCP tunnel for standard input/output to a target SSH port.Mihomo then handshake his own SSH protocol on this tunnel, and set up proxy connections.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[(frps selfhost版)有没想过起个容器就能打通整个内网呢? 使用容器打通受限网络: frp+ssh组合镜像以及clash(mihomo)实现打通网络(full)]]></title>
            <link>https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash-full</link>
            <guid>https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash-full</guid>
            <pubDate>Wed, 22 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[使用容器打通受限网络: frp+ssh组合镜像以及clash(mihomo)实现打通任意环境所有内网服务(包括k8s)(web页面以及终端访问)]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>使用容器打通受限网络: frp+ssh组合镜像以及clash(mihomo)实现打通任意环境所有内网服务(包括k8s)(web页面以及终端访问)
这里还有个需要提到的是, 因为我的科学上网环境是用的clash(mihomo)软件, 所以这里就用clash(mihomo)来实现打通各种内网
这样我就可以只需要一个代理软件就行了</p>
</blockquote>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="前言">前言<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash-full#%E5%89%8D%E8%A8%80" class="hash-link" aria-label="前言的直接链接" title="前言的直接链接" translate="no">​</a></h2>
<p>开发过程中总是能遇到需要访问其他公司内网的情况, 一般常规方案都是由其他公司提供vpn访问, 或者jumpserver进行内网服务器连接.</p>
<p>这时, 一般就会遇到几个痛点:
- 想要访问k8s中的容器服务, k8s内部域名<code>svc.cluster.local</code>无法直接使用
- 要装很多乱七八糟的vpn软件, 不同公司用的vpn可能就不一样, 有的vpn甚至像流氓软件一样, 有各种限制
- 有的公司不提供vpn或jumpserver, 只能去现场
- 家里网络和公司网络不互通的问题(在公司想访问家里的一些服务, 或在家想访问公司的一些服务等)</p>
<p>然而, 打通网络后, 都有哪些好处呢?
- 自己本地电脑不在需要安转太多的vpn软件了
- 所能触碰到的每台内网服务器, 都能成为你在何时何地都能访问或当做跳板机的工具
- 内网才能打开的页面, 随时都能打开了
- 网页系统应用能用浏览器打开了
- nacos能用浏览器打开了
- 内网才能访问的服务器, 随时都能访问了
- 数据库能通过idea或者DBeaver可视化连接了</p>
<blockquote>
<p>也就是说, 打通了网络, 也就打通了ssh访问, ssh能到达的地方, 都能将自己的本地电脑拉入到同一网络中进行互通操作</p>
</blockquote>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="前提">前提<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash-full#%E5%89%8D%E6%8F%90" class="hash-link" aria-label="前提的直接链接" title="前提的直接链接" translate="no">​</a></h2>
<p>需要有机会把容器起起来, 一般有以下几种方式, 选一个方便去操作的就行, 当容器起来之后, 网络就打通了, 虚拟机等过渡工具就可以删掉了, 不需要了
- 通过jumpserver页面登录
- 自己本身就安转了vpn
- 找安装了vpn的同事
- 专门找台机用于安装各种乱七八糟的vpn也行
- 当然起个虚拟机去安转也行</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="第一步-编写dockerfile-用于制作镜像">第一步: 编写Dockerfile, 用于制作镜像<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash-full#%E7%AC%AC%E4%B8%80%E6%AD%A5-%E7%BC%96%E5%86%99dockerfile-%E7%94%A8%E4%BA%8E%E5%88%B6%E4%BD%9C%E9%95%9C%E5%83%8F" class="hash-link" aria-label="第一步: 编写Dockerfile, 用于制作镜像的直接链接" title="第一步: 编写Dockerfile, 用于制作镜像的直接链接" translate="no">​</a></h2>
<p>随便找台Linux系统, 或者自己电脑也行(就是麻烦点, 可能构建镜像时, 需要指定构建平台等), 我这里选择用x86架构的centos系统, 然后, 找个合适的目录, 例如: <code>/www/container/frp-ssh</code></p>
<ul>
<li class="">创建<code>Dockerfile</code>文件</li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># vim Dockerfile</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">FROM debian:trixie-slim</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WORKDIR /www</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 安装必要的软件包</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN </span><span class="token function" style="color:#d73a49">apt-get</span><span class="token plain"> update </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">apt-get</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-y</span><span class="token plain"> openssh-server openssh-client </span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> locales gettext tini </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">apt-get</span><span class="token plain"> clean </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">rm</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-rf</span><span class="token plain"> /var/lib/apt/lists/*</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 生成并配置 locale</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN </span><span class="token function" style="color:#d73a49">sed</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-i</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'/en_US.UTF-8/s/^# //g'</span><span class="token plain"> /etc/locale.gen </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    locale-gen </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    update-locale </span><span class="token assign-left variable environment constant" style="color:#36acaa">LANG</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">en_US.UTF-8 </span><span class="token assign-left variable environment constant" style="color:#36acaa">LC_ALL</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">en_US.UTF-8</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 设置环境变量</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ENV </span><span class="token assign-left variable environment constant" style="color:#36acaa">LANG</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">en_US.UTF-8 </span><span class="token assign-left variable environment constant" style="color:#36acaa">LC_ALL</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">en_US.UTF-8 </span><span class="token assign-left variable environment constant" style="color:#36acaa">LANGUAGE</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">en_US.UTF-8</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 解压frp</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">COPY ./frp_0.62.1_linux_amd64.tar.gz ./frp_0.62.1_linux_amd64.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN </span><span class="token function" style="color:#d73a49">tar</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-xzf</span><span class="token plain"> ./frp_0.62.1_linux_amd64.tar.gz </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">mv</span><span class="token plain"> frp_0.62.1_linux_amd64 frp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 创建包装服务</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN </span><span class="token function" style="color:#d73a49">tee</span><span class="token plain"> /www/frp/frpc.toml </span><span class="token operator" style="color:#393A34">&lt;&lt;-</span><span class="token string" style="color:#e3116c">'EOF'</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">serverAddr = ${serverAddr}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">serverPort = ${serverPort}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">[[${client_title}]]</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">name = ${client_name}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">type = ${client_type}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">${secretKey_stcp_line}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">${localIP_proxies_line}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">${localPort_proxies_line}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">${serverName_visitors_line}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">${bindAddr_visitors_line}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">${bindPort_visitors_line}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">${remotePort_proxies_tcp_line}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">EOF</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 创建初始化脚本</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN </span><span class="token function" style="color:#d73a49">tee</span><span class="token plain"> /entrypoint.sh </span><span class="token operator" style="color:#393A34">&lt;&lt;-</span><span class="token string" style="color:#e3116c">'EOF'</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">#!/bin/sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"># 替换环境变量的值</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">envsubst &lt; /www/frp/frpc.toml &gt; /tmp/frpc.toml.tmp &amp;&amp; mv /tmp/frpc.toml.tmp /www/frp/frpc.toml</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"># 确保目录存在</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">[ ! -d "/var/run/sshd" ] &amp;&amp; mkdir -p /var/run/sshd</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"># 启动 SSH（后台运行）</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">/usr/sbin/sshd -D &amp;</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"># 启动 FRPC</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">/www/frp/frpc -c /www/frp/frpc.toml</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"># 保持容器运行</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">wait</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">EOF</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN </span><span class="token function" style="color:#d73a49">chmod</span><span class="token plain"> +x /entrypoint.sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 暴露 SSH 端口</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">EXPOSE </span><span class="token number" style="color:#36acaa">22</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 使用 tini 作为 PID 1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ENTRYPOINT </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"/usr/bin/tini"</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">"--"</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">"/entrypoint.sh"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="第二步-编写docker-composeyml-方便构建和运行容器">第二步: 编写docker-compose.yml, 方便构建和运行容器<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash-full#%E7%AC%AC%E4%BA%8C%E6%AD%A5-%E7%BC%96%E5%86%99docker-composeyml-%E6%96%B9%E4%BE%BF%E6%9E%84%E5%BB%BA%E5%92%8C%E8%BF%90%E8%A1%8C%E5%AE%B9%E5%99%A8" class="hash-link" aria-label="第二步: 编写docker-compose.yml, 方便构建和运行容器的直接链接" title="第二步: 编写docker-compose.yml, 方便构建和运行容器的直接链接" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># vim docker-compose.yml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">services:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  dev-jumpbox:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    build:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      context: </span><span class="token builtin class-name">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      dockerfile: Dockerfile</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    container_name: dev-jumpbox</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    environment:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      TZ: </span><span class="token string" style="color:#e3116c">"Asia/Shanghai"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># 配置服务端的IP</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      serverAddr: </span><span class="token string" style="color:#e3116c">'"129.204.8.8"'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      client_title: proxies</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      serverPort: </span><span class="token number" style="color:#36acaa">7000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># 名称随便给, 不重复就行</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      client_name: </span><span class="token string" style="color:#e3116c">'"dev-jumpbox-6666"'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      client_type: </span><span class="token string" style="color:#e3116c">'"tcp"'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      localIP_proxies_line: </span><span class="token assign-left variable" style="color:#36acaa">localIP</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"127.0.0.1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      localPort_proxies_line: </span><span class="token assign-left variable" style="color:#36acaa">localPort</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">22</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># 配置云服务器中开放的端口, 随便开放一个都行, 用于远程连接ssh</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      remotePort_proxies_tcp_line: </span><span class="token assign-left variable" style="color:#36acaa">remotePort</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">6666</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    extra_hosts:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      - </span><span class="token string" style="color:#e3116c">"me.host:host-gateway"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    restart: unless-stopped</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    volumes:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      - ./.ssh/authorized_keys:/root/.ssh/authorized_keys</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 以上环境变量, 除了备注的内容, 其他的都可以保持不动就行</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># authorized_keys的内容示例</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ssh-ed25519 xxxxx xxx</span><br></span></code></pre></div></div>
<ul>
<li class="">authorized_keys的内容示例</li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 在本地电脑中执行, 打印公钥</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">cat</span><span class="token plain"> ~/.ssh/id_ed25519.pub</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 复制打印的公钥内容, 需要写入到`./.ssh/authorized_keys`, 这个文件是需要挂载到容器中的文件</span><br></span></code></pre></div></div>
<ul>
<li class="">关于卷(volumes)的说明</li>
</ul>
<p>这里的卷也可以不挂载, 也可以通过进入容器中执行命令去写入<code>authorized_keys</code>文件中</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 使用挂载券方式时, 这一步可省略</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ssh-ed25519 xxxxx xxx'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> /root/.ssh/authorized_keys</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="第三步-需要一台有公网ip的云服务器2c2g1m就差不多了-我的镜像是debian">第三步: 需要一台有公网IP的云服务器(2c2g1m就差不多了, 我的镜像是Debian)<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash-full#%E7%AC%AC%E4%B8%89%E6%AD%A5-%E9%9C%80%E8%A6%81%E4%B8%80%E5%8F%B0%E6%9C%89%E5%85%AC%E7%BD%91ip%E7%9A%84%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A82c2g1m%E5%B0%B1%E5%B7%AE%E4%B8%8D%E5%A4%9A%E4%BA%86-%E6%88%91%E7%9A%84%E9%95%9C%E5%83%8F%E6%98%AFdebian" class="hash-link" aria-label="第三步: 需要一台有公网IP的云服务器(2c2g1m就差不多了, 我的镜像是Debian)的直接链接" title="第三步: 需要一台有公网IP的云服务器(2c2g1m就差不多了, 我的镜像是Debian)的直接链接" translate="no">​</a></h2>
<p><a href="https://gofrp.org/zh-cn/docs/setup/systemd/" target="_blank" rel="noopener noreferrer" class="">frp官网安装地址</a>
<a href="https://github.com/fatedier/frp/releases/tag/v0.62.1" target="_blank" rel="noopener noreferrer" class="">frp官方GitHub下载地址</a></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 下载下来解压</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">tar</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-xzf</span><span class="token plain"> ./frp_0.62.1_linux_amd64.tar.gz </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">mv</span><span class="token plain"> frp_0.62.1_linux_amd64 frp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 进入解压后的目录, 启动frp服务端, 设置开机自启</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> frp </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> systemctl start frps </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> systemctl </span><span class="token builtin class-name">enable</span><span class="token plain"> frps</span><br></span></code></pre></div></div>
<p>然后, 开放下端口, 例如: 开放端口:6666, 用于远程连接ssh</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="第四步-启动docker-compose-测试容器以及上传进行">第四步: 启动docker-compose, 测试容器以及上传进行<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash-full#%E7%AC%AC%E5%9B%9B%E6%AD%A5-%E5%90%AF%E5%8A%A8docker-compose-%E6%B5%8B%E8%AF%95%E5%AE%B9%E5%99%A8%E4%BB%A5%E5%8F%8A%E4%B8%8A%E4%BC%A0%E8%BF%9B%E8%A1%8C" class="hash-link" aria-label="第四步: 启动docker-compose, 测试容器以及上传进行的直接链接" title="第四步: 启动docker-compose, 测试容器以及上传进行的直接链接" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 构建镜像并启动容器</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker-compose</span><span class="token plain"> up </span><span class="token parameter variable" style="color:#36acaa">-d</span><br></span></code></pre></div></div>
<ul>
<li class="">使用ssh远程连接下, 试试效果</li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 上传公钥, 开启免密登录, 这一步也是顺便检查了是否能够正常通过内网穿透ssh到容器中</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ssh-copy-id root@129.204.8.8 </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">6666</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-i</span><span class="token plain"> ~/.ssh/id_ed25519</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 然后, 通过ssh免密登录</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ssh</span><span class="token plain"> root@129.204.8.8 </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">6666</span><br></span></code></pre></div></div>
<blockquote>
<p>到这就已经基本完成了在任何地方都能联通ssh了, 接下来的就是简化配置, 以及高级应用了</p>
</blockquote>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="上传镜像到阿里云-简化启动容器的配置">上传镜像到阿里云, 简化启动容器的配置<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash-full#%E4%B8%8A%E4%BC%A0%E9%95%9C%E5%83%8F%E5%88%B0%E9%98%BF%E9%87%8C%E4%BA%91-%E7%AE%80%E5%8C%96%E5%90%AF%E5%8A%A8%E5%AE%B9%E5%99%A8%E7%9A%84%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="上传镜像到阿里云, 简化启动容器的配置的直接链接" title="上传镜像到阿里云, 简化启动容器的配置的直接链接" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 登录</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> login </span><span class="token parameter variable" style="color:#36acaa">--username</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">xxx@qq.com registry.cn-hangzhou.aliyuncs.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">## 标记本地镜像并指向目标仓库（ip:port/image_name:tag，该格式为标记版本号）</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> tag dev-jumpbox registry.cn-hangzhou.aliyuncs.com/xxx/dev-jumpbox:frpc-ssh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">## 推送镜像到仓库</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> push registry.cn-hangzhou.aliyuncs.com/xxx/dev-jumpbox:frpc-ssh</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="简化后的docker-compose配置">简化后的docker-compose配置<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash-full#%E7%AE%80%E5%8C%96%E5%90%8E%E7%9A%84docker-compose%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="简化后的docker-compose配置的直接链接" title="简化后的docker-compose配置的直接链接" translate="no">​</a></h2>
<p>简化后, 就只需要docker-compose配置即可, 当然, 如果没有将<code>authorized_keys</code>配置整合到Dockerfile中的情况下, 还是需要挂载配置的</p>
<p><a href="https://iuin8.github.io/doc-record/docker/dev_utls/dev-container/remote-ssh/frp/tcpmux/v6.1.1/doc" target="_blank" rel="noopener noreferrer" class="">参考详情链接</a></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">services:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  dev-jumpbox:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    image: registry.cn-hangzhou.aliyuncs.com/iuin/dev-jumpbox:tcpmux-v6.1.1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    container_name: dev-jumpbox</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    environment:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      TZ: </span><span class="token string" style="color:#e3116c">"Asia/Shanghai"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      serverAddr: </span><span class="token string" style="color:#e3116c">'"183.11.11.11"'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      serverPort: </span><span class="token number" style="color:#36acaa">11100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      auth_token: </span><span class="token string" style="color:#e3116c">'"xx-jumpbox-ssh"'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      client_name: </span><span class="token string" style="color:#e3116c">'"container.prod.xxx.customer"'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      customDomains: </span><span class="token string" style="color:#e3116c">'["container.prod.xxx.customer"]'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    restart: unless-stopped</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="配合clashmihomo工具使用-方便访问网页">配合clash(mihomo)工具使用, 方便访问网页<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash-full#%E9%85%8D%E5%90%88clashmihomo%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8-%E6%96%B9%E4%BE%BF%E8%AE%BF%E9%97%AE%E7%BD%91%E9%A1%B5" class="hash-link" aria-label="配合clash(mihomo)工具使用, 方便访问网页的直接链接" title="配合clash(mihomo)工具使用, 方便访问网页的直接链接" translate="no">​</a></h2>
<p>这里, 我们借助clash(mihomo)工具, 通过ssh将流量代理转发到容器中, 实现像访问局域网一样访问容器那边的对应内网上的网页</p>
<ul>
<li class=""><a href="https://www.clashverge.dev/guide/quickstart.html" target="_blank" rel="noopener noreferrer" class="">clash(mihomo)的github地址</a></li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 代理流量(script.js[这里用了全局脚本的方式, 兼容自己的原有的订阅, 不影响原有的订阅, 只做扩展])</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">config, profileName</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  const extra </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    proxies: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        name: </span><span class="token string" style="color:#e3116c">"company_container"</span><span class="token plain">,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        type: </span><span class="token string" style="color:#e3116c">"ssh"</span><span class="token plain">,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        server: </span><span class="token string" style="color:#e3116c">"183.11.11.11"</span><span class="token plain">,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        port: </span><span class="token number" style="color:#36acaa">11111</span><span class="token plain">,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        username: </span><span class="token string" style="color:#e3116c">"root"</span><span class="token plain">,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"private-key"</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"./.ssh/id_ed25519_iu"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    proxyGroups: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        name: </span><span class="token string" style="color:#e3116c">"company_g"</span><span class="token plain">,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        type: </span><span class="token string" style="color:#e3116c">"select"</span><span class="token plain">,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        proxies: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"DIRECT"</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">"company_container"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    rules: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"IP-CIDR,10.0.11.0/24,company_g"</span><span class="token plain">,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"DOMAIN-SUFFIX,company.com,company_g"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">Array.isArray</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">config.proxies</span><span class="token punctuation" style="color:#393A34">))</span><span class="token plain"> config.proxies </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">const p of extra.proxies</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">p </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> p.name </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token plain">config.proxies.some</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x </span><span class="token operator" style="color:#393A34">=</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> x </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> x.name </span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> p.name</span><span class="token punctuation" style="color:#393A34">))</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      config.proxies.unshift</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">p</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">Array.isArray</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"proxy-groups"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">))</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"proxy-groups"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">const g of extra.proxyGroups</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin class-name">let</span><span class="token plain"> existing </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"proxy-groups"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">.find</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x </span><span class="token operator" style="color:#393A34">=</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> x </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> x.name </span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> g.name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">existing</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"proxy-groups"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">.unshift</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> name: g.name, type: g.type, proxies: Array.isArray</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">g.proxies</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> ? </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">.g.proxies</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">Array.isArray</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">existing.proxies</span><span class="token punctuation" style="color:#393A34">))</span><span class="token plain"> existing.proxies </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">const pn of g.proxies </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">existing.proxies.includes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pn</span><span class="token punctuation" style="color:#393A34">))</span><span class="token plain"> existing.proxies.unshift</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pn</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">Array.isArray</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">config.rules</span><span class="token punctuation" style="color:#393A34">))</span><span class="token plain"> config.rules </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">const r of extra.rules</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">config.rules.includes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">r</span><span class="token punctuation" style="color:#393A34">))</span><span class="token plain"> config.rules.unshift</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">r</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token builtin class-name">return</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<div class="language-yml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 单独订阅配置(ssh.yml)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">proxies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> company_container</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ssh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">server</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 183.11.11.11</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">11111</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">username</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> root</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">private-key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ./.ssh/id_ed25519_iu</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">proxy-groups</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> company_g</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> select</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">proxies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> company_container</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">rules</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IP-CIDR,10.0.11.0/24,company_g"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DOMAIN-SUFFIX,company.com,company_g"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="k8s中使用-打通命名空间中的网络">k8s中使用, 打通命名空间中的网络<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash-full#k8s%E4%B8%AD%E4%BD%BF%E7%94%A8-%E6%89%93%E9%80%9A%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E4%B8%AD%E7%9A%84%E7%BD%91%E7%BB%9C" class="hash-link" aria-label="k8s中使用, 打通命名空间中的网络的直接链接" title="k8s中使用, 打通命名空间中的网络的直接链接" translate="no">​</a></h2>
<div class="language-yml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">## k8s等(有内部DNS功能的系统)用法</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 其他配置省略</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">rules</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IP-CIDR,10.0.11.0/24,company_g"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IP-CIDR,100.20.0.0/16,company_g"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IP-CIDR,100.19.0.0/16,company_g"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DOMAIN-SUFFIX,svc.cluster.local,company_g"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DOMAIN-SUFFIX,company.com,company_g"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<ul>
<li class="">说明: 这里挂载了三个网段
<ul>
<li class="">其中, 第一个网段是需要代理其他正常流量的网段</li>
<li class="">第二和第三个网段, 则是命名空间中的容器使用的网段
<ul>
<li class="">作用是, 让我们能通过k8s内部域名访问, k8s中容器提供的服务
<ul>
<li class="">即通过<code>svc.cluster.local</code>k8s中内部域名访问</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="最后的话">最后的话<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash-full#%E6%9C%80%E5%90%8E%E7%9A%84%E8%AF%9D" class="hash-link" aria-label="最后的话的直接链接" title="最后的话的直接链接" translate="no">​</a></h2>
<p>到这就基本完成了我们的目标了, 能够正常像在一个局域网中一样, 访问网页以及连接数据库等了</p>
<ul>
<li class="">更多内容
<ul>
<li class=""><a href="https://iuin8.github.io/doc-record/docs/docker/dev_utls/dev-container/remote-ssh/frp/article/frp+ssh%E7%BB%84%E5%90%88%E9%95%9C%E5%83%8F%E4%BB%A5%E5%8F%8Aclash%E6%89%93%E9%80%9A%E7%BD%91%E7%BB%9C.md" target="_blank" rel="noopener noreferrer" class="">这篇文章对应的GitHub博客文档地址</a></li>
</ul>
</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[(frps selfhost版)有没想过起个容器就能打通整个内网呢? 使用容器打通受限网络: frp+ssh组合镜像以及clash(mihomo)实现打通网络]]></title>
            <link>https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash</link>
            <guid>https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash</guid>
            <pubDate>Wed, 22 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[使用容器打通受限网络: frp+ssh组合镜像以及clash(mihomo)实现打通任意环境所有内网服务(包括k8s)(web页面以及终端访问)]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>使用容器打通受限网络: frp+ssh组合镜像以及clash(mihomo)实现打通任意环境所有内网服务(包括k8s)(web页面以及终端访问)
这里还有个需要提到的是, 因为我的科学上网环境是用的clash(mihomo)软件, 所以这里就用clash(mihomo)来实现打通各种内网
这样我就可以只需要一个代理软件就行了</p>
</blockquote>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="前言">前言<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash#%E5%89%8D%E8%A8%80" class="hash-link" aria-label="前言的直接链接" title="前言的直接链接" translate="no">​</a></h2>
<p>开发过程中总是能遇到需要访问其他公司内网的情况, 一般常规方案都是由其他公司提供vpn访问, 或者jumpserver进行内网服务器连接.</p>
<p>这时, 一般就会遇到几个痛点:
- 想要访问k8s中的容器服务, k8s内部域名<code>svc.cluster.local</code>无法直接使用
- 要装很多乱七八糟的vpn软件, 不同公司用的vpn可能就不一样, 有的vpn甚至像流氓软件一样, 有各种限制
- 有的公司不提供vpn或jumpserver, 只能去现场
- 家里网络和公司网络不互通的问题(在公司想访问家里的一些服务, 或在家想访问公司的一些服务等)</p>
<p>然而, 打通网络后, 都有哪些好处呢?
- 自己本地电脑不在需要安转太多的vpn软件了
- 所能触碰到的每台内网服务器, 都能成为你在何时何地都能访问或当做跳板机的工具
- 内网才能打开的页面, 随时都能打开了
- 网页系统应用能用浏览器打开了
- nacos能用浏览器打开了
- 内网才能访问的服务器, 随时都能访问了
- 数据库能通过idea或者DBeaver可视化连接了</p>
<blockquote>
<p>也就是说, 打通了网络, 也就打通了ssh访问, ssh能到达的地方, 都能将自己的本地电脑拉入到同一网络中进行互通操作</p>
</blockquote>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="前提">前提<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash#%E5%89%8D%E6%8F%90" class="hash-link" aria-label="前提的直接链接" title="前提的直接链接" translate="no">​</a></h2>
<p>需要有机会把容器起起来, 一般有以下几种方式, 选一个方便去操作的就行, 当容器起来之后, 网络就打通了, 虚拟机等过渡工具就可以删掉了, 不需要了
- 通过jumpserver页面登录
- 自己本身就安转了vpn
- 找安装了vpn的同事
- 专门找台机用于安装各种乱七八糟的vpn也行
- 当然起个虚拟机去安转也行</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="编写docker-composeyml服务端">编写docker-compose.yml(服务端)<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash#%E7%BC%96%E5%86%99docker-composeyml%E6%9C%8D%E5%8A%A1%E7%AB%AF" class="hash-link" aria-label="编写docker-compose.yml(服务端)的直接链接" title="编写docker-compose.yml(服务端)的直接链接" translate="no">​</a></h2>
<blockquote>
<p>这里的服务端, 就是你有公网IP的云服务器, 我这里用的是Debian, 你可以根据自己的情况, 选择合适的镜像</p>
</blockquote>
<div class="language-yml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># vi /www/dev-jumpbox/server/docker-compose.yml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">services</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">frps-ssh</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> registry.cn</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">hangzhou.aliyuncs.com/iuin/frps</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">ssh</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">tcpmux</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">network_mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> host</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> TZ="Asia/Shanghai"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> auth_token="xxx"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> bindPort=18000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> tcpmuxHTTPConnectPort=12222</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">restart</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">stopped</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 构建镜像并启动容器</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker-compose</span><span class="token plain"> up </span><span class="token parameter variable" style="color:#36acaa">-d</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="编写docker-composeyml客户端">编写docker-compose.yml(客户端)<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash#%E7%BC%96%E5%86%99docker-composeyml%E5%AE%A2%E6%88%B7%E7%AB%AF" class="hash-link" aria-label="编写docker-compose.yml(客户端)的直接链接" title="编写docker-compose.yml(客户端)的直接链接" translate="no">​</a></h2>
<p>共用端口的方式, <a href="https://gofrp.org/zh-cn/docs/examples/multiple-ssh-over-same-port/" target="_blank" rel="noopener noreferrer" class="">参考文章</a></p>
<p>PS: 自定义域名需要配合<code>proxycommand</code>代理使用<code>ssh -o 'proxycommand socat - PROXY:x.x.x.x:%h:%p,proxyport=5002' test@machine-a.example.com</code></p>
<div class="language-yml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># vi /www/dev-jumpbox/client/docker-compose.yml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">services</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">dev-jumpbox</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> registry.cn</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">hangzhou.aliyuncs.com/iuin/dev</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">jumpbox</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">tcpmux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">v6.1.1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">container_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> dev</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">jumpbox</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">TZ</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Asia/Shanghai"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">serverAddr</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'"55.44.33.33"'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">serverPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">18000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">auth_token</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'"jumpboxs-ssh"'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">client_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'"jumpboxc-ssh-fa"'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">customDomains</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'["fa.intranet.company"]'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># 需要先创建这个文件, 不然会自动创建为文件夹</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ./.ssh/authorized_keys</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/root/.ssh/authorized_keys</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">ro</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">restart</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">stopped</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>不想要多配置个<code>proxycommand</code>的话, 用下面的方式会简单点, 但需要独占端口</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">services:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  dev-jumpbox:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    image: registry.cn-hangzhou.aliyuncs.com/iuin/dev-jumpbox:frpc-ssh-v6.1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    container_name: dev-jumpbox</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    environment:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      TZ: </span><span class="token string" style="color:#e3116c">"Asia/Shanghai"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      serverAddr: </span><span class="token string" style="color:#e3116c">'"55.44.33.33"'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      client_title: proxies</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      serverPort: </span><span class="token number" style="color:#36acaa">18000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      auth_token_line: auth.token </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"jumpboxs-ssh"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      client_name: </span><span class="token string" style="color:#e3116c">'"fa.intranet.company"'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      client_type: </span><span class="token string" style="color:#e3116c">'"tcp"'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      localIP_proxies_line: </span><span class="token assign-left variable" style="color:#36acaa">localIP</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"127.0.0.1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      localPort_proxies_line: </span><span class="token assign-left variable" style="color:#36acaa">localPort</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">22</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># 独占端口方式, 需要外网防火墙开放这个端口</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      remotePort_proxies_tcp_line: </span><span class="token assign-left variable" style="color:#36acaa">remotePort</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">12202</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    extra_hosts:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      - </span><span class="token string" style="color:#e3116c">"container.host:host-gateway"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    volumes:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># 需要先创建这个文件, 不然会自动创建为文件夹</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      - ./.ssh/authorized_keys:/root/.ssh/authorized_keys:ro</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    restart: unless-stopped</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 构建镜像并启动容器</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker-compose</span><span class="token plain"> up </span><span class="token parameter variable" style="color:#36acaa">-d</span><br></span></code></pre></div></div>
<ul>
<li class="">关于卷(volumes)的说明</li>
</ul>
<p>这里的卷也可以不挂载, 也可以通过进入容器中执行命令去写入<code>authorized_keys</code>文件中, 不过容器重启后, 会丢失写入的内容</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 在本地电脑中执行, 打印公钥</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">cat</span><span class="token plain"> ~/.ssh/id_ed25519.pub</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 复制打印的公钥内容, 需要写入到`./.ssh/authorized_keys`, 这个文件是需要挂载到容器中的文件</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 全路径: /www/dev-jumpbox/client/.ssh/authorized_keys(注意: 别跟宿主机的authorized_keys文件搞混了)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 这里也可以由dev-jumpbox容器去管理ssh公私钥, 把宿主机生成好的公私钥, 挂载到容器中, 然后在容器中执行命令去写入authorized_keys文件中, 最后把私钥给到clash(mihomo)工具使用</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 如果clash用户想用自己的私钥的话, 那就在生成私钥的时候, 选择将公私钥生成到clash配置目录下, 然后在clash配置文件中, 引用自己的私钥文件即可(clash verge rev只支持读取根目录下的私钥文件)</span><br></span></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 在客户端宿主机或者容器中执行, 写入公钥到authorized_keys文件中</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ssh-ed25519 xxxxx xxx'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> ./.ssh/authorized_keys</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="第四步-启动docker-compose-测试容器以及上传进行">第四步: 启动docker-compose, 测试容器以及上传进行<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash#%E7%AC%AC%E5%9B%9B%E6%AD%A5-%E5%90%AF%E5%8A%A8docker-compose-%E6%B5%8B%E8%AF%95%E5%AE%B9%E5%99%A8%E4%BB%A5%E5%8F%8A%E4%B8%8A%E4%BC%A0%E8%BF%9B%E8%A1%8C" class="hash-link" aria-label="第四步: 启动docker-compose, 测试容器以及上传进行的直接链接" title="第四步: 启动docker-compose, 测试容器以及上传进行的直接链接" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 构建镜像并启动容器</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker-compose</span><span class="token plain"> up </span><span class="token parameter variable" style="color:#36acaa">-d</span><br></span></code></pre></div></div>
<ul>
<li class="">使用ssh远程连接下, 试试效果</li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 上传公钥, 开启免密登录, 这一步也是顺便检查了是否能够正常通过内网穿透ssh到容器中</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ssh-copy-id root@129.204.8.8 </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">12222</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-i</span><span class="token plain"> ~/.ssh/id_ed25519</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 然后, 通过ssh免密登录</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ssh</span><span class="token plain"> root@129.204.8.8 </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">12222</span><br></span></code></pre></div></div>
<p><a href="https://iuin8.github.io/doc-record/docker/dev_utls/dev-container/remote-ssh/frp/tcpmux/v6.1.1/doc" target="_blank" rel="noopener noreferrer" class="">参考详情链接</a></p>
<blockquote>
<p>到这就已经基本完成了在任何地方都能联通ssh了, 接下来的就是高级应用了, 配合clash(mihomo)工具, 实现网络流量代理到内容容器中</p>
</blockquote>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="配合clashmihomo工具使用-方便访问网页">配合clash(mihomo)工具使用, 方便访问网页<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash#%E9%85%8D%E5%90%88clashmihomo%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8-%E6%96%B9%E4%BE%BF%E8%AE%BF%E9%97%AE%E7%BD%91%E9%A1%B5" class="hash-link" aria-label="配合clash(mihomo)工具使用, 方便访问网页的直接链接" title="配合clash(mihomo)工具使用, 方便访问网页的直接链接" translate="no">​</a></h2>
<p>这里, 我们借助clash(mihomo)工具, 通过ssh将流量代理转发到容器中, 实现像访问局域网一样访问容器那边的对应内网上的网页</p>
<ul>
<li class=""><a href="https://www.clashverge.dev/guide/quickstart.html" target="_blank" rel="noopener noreferrer" class="">clash(mihomo)的github地址</a></li>
</ul>
<div class="language-JavaScript language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// 代理流量(script.js[这里用了全局脚本的方式, 兼容自己的原有的订阅, 不影响原有的订阅, 只做扩展])</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">config</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> profileName</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> privateKeyContent </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">-----BEGIN OPENSSH PRIVATE KEY-----</span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">b3BlbnNzaC1rZxxxABAAAAMwAAA</span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">QyNTUxOQAAAxxxAAAIgIqewcCKn</span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">HAAAAAtxxxDYC8YhlRDIhM+GUeg</span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">-----END OPENSSH PRIVATE KEY-----</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> extra </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">proxies</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"company_container"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ssh"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">server</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"183.11.11.11"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">port</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">11111</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">username</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"root"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// 用密钥的情况下, 这里需要把密钥复制到软件配置目录下的.ssh目录中, 才能正常使用</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// "private-key": "./.ssh/id_ed25519_iu"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string-property property" style="color:#36acaa">"private-key"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> privateKeyContent</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">proxyGroups</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"company_g"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"select"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">proxies</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"DIRECT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"company_container"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"IP-CIDR,10.0.11.0/24,company_g"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"DOMAIN-SUFFIX,company.com,company_g"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">Array</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isArray</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">proxies</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">proxies </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> p </span><span class="token keyword" style="color:#00009f">of</span><span class="token plain"> extra</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">proxies</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">p </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> p</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">name </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">proxies</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">some</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">x</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> x </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> x</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">name </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> p</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">proxies</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">unshift</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">p</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">Array</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isArray</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"proxy-groups"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"proxy-groups"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> g </span><span class="token keyword" style="color:#00009f">of</span><span class="token plain"> extra</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">proxyGroups</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> existing </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"proxy-groups"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">find</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">x</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> x </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> x</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">name </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> g</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">existing</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"proxy-groups"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">unshift</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> g</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> g</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">type</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">proxies</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Array</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isArray</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">g</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">proxies</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token operator" style="color:#393A34">...</span><span class="token plain">g</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">proxies</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">Array</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isArray</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">existing</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">proxies</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> existing</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">proxies </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> pn </span><span class="token keyword" style="color:#00009f">of</span><span class="token plain"> g</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">proxies </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">existing</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">proxies</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">includes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pn</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> existing</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">proxies</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">unshift</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pn</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">Array</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isArray</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rules</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rules </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> r </span><span class="token keyword" style="color:#00009f">of</span><span class="token plain"> extra</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rules</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rules</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">includes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">r</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rules</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">unshift</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">r</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<div class="language-yml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 单独订阅配置(ssh.yml)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">proxies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> company_container</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ssh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">server</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 183.11.11.11</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">11111</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">username</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> root</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 用密钥的情况下, 这里需要把密钥复制到软件配置目录下的.ssh目录中, 才能正常使用</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># private-key: ./.ssh/id_ed25519_iu</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">private-key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      -----BEGIN OPENSSH PRIVATE KEY-----</span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      b3BlbnNzaC1rZxxxABAAAAMwAAA</span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      QyNTUxOQAAAxxxAAAIgIqewcCKn</span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      HAAAAAtxxxDYC8YhlRDIhM+GUeg</span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      -----END OPENSSH PRIVATE KEY-----</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">proxy-groups</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> company_g</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> select</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">proxies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> company_container</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">rules</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IP-CIDR,10.0.11.0/24,company_g"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DOMAIN-SUFFIX,company.com,company_g"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="k8s中使用-打通命名空间中的网络">k8s中使用, 打通命名空间中的网络<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash#k8s%E4%B8%AD%E4%BD%BF%E7%94%A8-%E6%89%93%E9%80%9A%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E4%B8%AD%E7%9A%84%E7%BD%91%E7%BB%9C" class="hash-link" aria-label="k8s中使用, 打通命名空间中的网络的直接链接" title="k8s中使用, 打通命名空间中的网络的直接链接" translate="no">​</a></h2>
<div class="language-yml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">## k8s等(有内部DNS功能的系统)用法</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 其他配置省略</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">rules</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IP-CIDR,10.0.11.0/24,company_g"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IP-CIDR,100.20.0.0/16,company_g"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IP-CIDR,100.19.0.0/16,company_g"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DOMAIN-SUFFIX,svc.cluster.local,company_g"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DOMAIN-SUFFIX,company.com,company_g"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<ul>
<li class="">说明: 这里挂载了三个网段
<ul>
<li class="">其中, 第一个网段是需要代理其他正常流量的网段</li>
<li class="">第二和第三个网段, 则是命名空间中的容器使用的网段
<ul>
<li class="">作用是, 让我们能通过k8s内部域名访问, k8s中容器提供的服务
<ul>
<li class="">即通过<code>svc.cluster.local</code>k8s中内部域名访问</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="最后的话">最后的话<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-clash#%E6%9C%80%E5%90%8E%E7%9A%84%E8%AF%9D" class="hash-link" aria-label="最后的话的直接链接" title="最后的话的直接链接" translate="no">​</a></h2>
<p>到这就基本完成了我们的目标了, 能够正常像在一个局域网中一样, 访问网页以及连接数据库等了</p>
<blockquote>
<p>要是有什么问题, 欢迎留言交流</p>
</blockquote>
<ul>
<li class="">更多内容
<ul>
<li class=""><a href="https://iuin8.github.io/doc-record/docs/docker/dev_utls/dev-container/remote-ssh/frp/article/frp+ssh%E7%BB%84%E5%90%88%E9%95%9C%E5%83%8F%E4%BB%A5%E5%8F%8Aclash%E6%89%93%E9%80%9A%E7%BD%91%E7%BB%9C.md" target="_blank" rel="noopener noreferrer" class="">这篇文章对应的GitHub博客文档地址</a></li>
</ul>
</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[(frps selfhost版)有没想过起个容器就能打通整个内网呢? 使用容器打通受限网络: frp+ssh组合镜像以及sshuttle打通网络]]></title>
            <link>https://doc-record.iuin888vip.icu/en/blog/frp-ssh-sshuttle</link>
            <guid>https://doc-record.iuin888vip.icu/en/blog/frp-ssh-sshuttle</guid>
            <pubDate>Wed, 22 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[使用容器打通受限网络: frp+ssh组合镜像以及sshuttle实现打通任意环境所有内网服务(包括k8s)(web页面以及终端访问)]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>使用容器打通受限网络: frp+ssh组合镜像以及sshuttle实现打通任意环境所有内网服务(包括k8s)(web页面以及终端访问)</p>
</blockquote>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="前言">前言<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-sshuttle#%E5%89%8D%E8%A8%80" class="hash-link" aria-label="前言的直接链接" title="前言的直接链接" translate="no">​</a></h2>
<p>开发过程中总是能遇到需要访问其他公司内网的情况, 一般常规方案都是由其他公司提供vpn访问, 或者jumpserver进行内网服务器连接.</p>
<p>这时, 一般就会遇到几个痛点:
- 想要访问k8s中的容器服务, k8s内部域名<code>svc.cluster.local</code>无法直接使用
- 要装很多乱七八糟的vpn软件, 不同公司用的vpn可能就不一样, 有的vpn甚至像流氓软件一样, 有各种限制
- 有的公司不提供vpn或jumpserver, 只能去现场
- 家里网络和公司网络不互通的问题(在公司想访问家里的一些服务, 或在家想访问公司的一些服务等)</p>
<p>然而, 打通网络后, 都有哪些好处呢?
- 自己本地电脑不在需要安转太多的vpn软件了
- 所能触碰到的每台内网服务器, 都能成为你在何时何地都能访问或当做跳板机的工具
- 内网才能打开的页面, 随时都能打开了
- 网页系统应用能用浏览器打开了
- nacos能用浏览器打开了
- 内网才能访问的服务器, 随时都能访问了
- 数据库能通过idea或者DBeaver可视化连接了</p>
<blockquote>
<p>也就是说, 打通了网络, 也就打通了ssh访问, ssh能到达的地方, 都能将自己的本地电脑拉入到同一网络中进行互通操作</p>
</blockquote>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="前提">前提<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-sshuttle#%E5%89%8D%E6%8F%90" class="hash-link" aria-label="前提的直接链接" title="前提的直接链接" translate="no">​</a></h2>
<p>需要有机会把容器起起来, 一般有以下几种方式, 选一个方便去操作的就行, 当容器起来之后, 网络就打通了, 虚拟机等过渡工具就可以删掉了, 不需要了
- 通过jumpserver页面登录
- 自己本身就安转了vpn
- 找安装了vpn的同事
- 专门找台机用于安装各种乱七八糟的vpn也行
- 当然起个虚拟机去安转也行</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="第一步-编写dockerfile-用于制作镜像">第一步: 编写Dockerfile, 用于制作镜像<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-sshuttle#%E7%AC%AC%E4%B8%80%E6%AD%A5-%E7%BC%96%E5%86%99dockerfile-%E7%94%A8%E4%BA%8E%E5%88%B6%E4%BD%9C%E9%95%9C%E5%83%8F" class="hash-link" aria-label="第一步: 编写Dockerfile, 用于制作镜像的直接链接" title="第一步: 编写Dockerfile, 用于制作镜像的直接链接" translate="no">​</a></h2>
<p>随便找台Linux系统, 或者自己电脑也行(就是麻烦点, 可能构建镜像时, 需要指定构建平台等), 我这里选择用x86架构的centos系统, 然后, 找个合适的目录, 例如: <code>/www/container/frp-ssh</code></p>
<ul>
<li class="">创建<code>Dockerfile</code>文件</li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># vim Dockerfile</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">FROM debian:trixie-slim</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WORKDIR /www</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 安装必要的软件包</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN </span><span class="token function" style="color:#d73a49">apt-get</span><span class="token plain"> update </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">apt-get</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-y</span><span class="token plain"> openssh-server openssh-client </span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> locales gettext tini </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">apt-get</span><span class="token plain"> clean </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">rm</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-rf</span><span class="token plain"> /var/lib/apt/lists/*</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 生成并配置 locale</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN </span><span class="token function" style="color:#d73a49">sed</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-i</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'/en_US.UTF-8/s/^# //g'</span><span class="token plain"> /etc/locale.gen </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    locale-gen </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    update-locale </span><span class="token assign-left variable environment constant" style="color:#36acaa">LANG</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">en_US.UTF-8 </span><span class="token assign-left variable environment constant" style="color:#36acaa">LC_ALL</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">en_US.UTF-8</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 设置环境变量</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ENV </span><span class="token assign-left variable environment constant" style="color:#36acaa">LANG</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">en_US.UTF-8 </span><span class="token assign-left variable environment constant" style="color:#36acaa">LC_ALL</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">en_US.UTF-8 </span><span class="token assign-left variable environment constant" style="color:#36acaa">LANGUAGE</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">en_US.UTF-8</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 解压frp</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">COPY ./frp_0.62.1_linux_amd64.tar.gz ./frp_0.62.1_linux_amd64.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN </span><span class="token function" style="color:#d73a49">tar</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-xzf</span><span class="token plain"> ./frp_0.62.1_linux_amd64.tar.gz </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">mv</span><span class="token plain"> frp_0.62.1_linux_amd64 frp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 创建包装服务</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN </span><span class="token function" style="color:#d73a49">tee</span><span class="token plain"> /www/frp/frpc.toml </span><span class="token operator" style="color:#393A34">&lt;&lt;-</span><span class="token string" style="color:#e3116c">'EOF'</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">serverAddr = ${serverAddr}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">serverPort = ${serverPort}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">[[${client_title}]]</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">name = ${client_name}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">type = ${client_type}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">${secretKey_stcp_line}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">${localIP_proxies_line}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">${localPort_proxies_line}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">${serverName_visitors_line}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">${bindAddr_visitors_line}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">${bindPort_visitors_line}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">${remotePort_proxies_tcp_line}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">EOF</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 创建初始化脚本</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN </span><span class="token function" style="color:#d73a49">tee</span><span class="token plain"> /entrypoint.sh </span><span class="token operator" style="color:#393A34">&lt;&lt;-</span><span class="token string" style="color:#e3116c">'EOF'</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">#!/bin/sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"># 替换环境变量的值</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">envsubst &lt; /www/frp/frpc.toml &gt; /tmp/frpc.toml.tmp &amp;&amp; mv /tmp/frpc.toml.tmp /www/frp/frpc.toml</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"># 确保目录存在</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">[ ! -d "/var/run/sshd" ] &amp;&amp; mkdir -p /var/run/sshd</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"># 启动 SSH（后台运行）</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">/usr/sbin/sshd -D &amp;</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"># 启动 FRPC</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">/www/frp/frpc -c /www/frp/frpc.toml</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"># 保持容器运行</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">wait</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">EOF</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN </span><span class="token function" style="color:#d73a49">chmod</span><span class="token plain"> +x /entrypoint.sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 暴露 SSH 端口</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">EXPOSE </span><span class="token number" style="color:#36acaa">22</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 使用 tini 作为 PID 1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ENTRYPOINT </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"/usr/bin/tini"</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">"--"</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">"/entrypoint.sh"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="第二步-编写docker-composeyml-方便构建和运行容器">第二步: 编写docker-compose.yml, 方便构建和运行容器<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-sshuttle#%E7%AC%AC%E4%BA%8C%E6%AD%A5-%E7%BC%96%E5%86%99docker-composeyml-%E6%96%B9%E4%BE%BF%E6%9E%84%E5%BB%BA%E5%92%8C%E8%BF%90%E8%A1%8C%E5%AE%B9%E5%99%A8" class="hash-link" aria-label="第二步: 编写docker-compose.yml, 方便构建和运行容器的直接链接" title="第二步: 编写docker-compose.yml, 方便构建和运行容器的直接链接" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># vim docker-compose.yml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">services:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  dev-jumpbox:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    build:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      context: </span><span class="token builtin class-name">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      dockerfile: Dockerfile</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    container_name: dev-jumpbox</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    environment:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      TZ: </span><span class="token string" style="color:#e3116c">"Asia/Shanghai"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># 配置服务端的IP</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      serverAddr: </span><span class="token string" style="color:#e3116c">'"129.204.8.8"'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      client_title: proxies</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      serverPort: </span><span class="token number" style="color:#36acaa">7000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># 名称随便给, 不重复就行</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      client_name: </span><span class="token string" style="color:#e3116c">'"dev-jumpbox-6666"'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      client_type: </span><span class="token string" style="color:#e3116c">'"tcp"'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      localIP_proxies_line: </span><span class="token assign-left variable" style="color:#36acaa">localIP</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"127.0.0.1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      localPort_proxies_line: </span><span class="token assign-left variable" style="color:#36acaa">localPort</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">22</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># 配置云服务器中开放的端口, 随便开放一个都行, 用于远程连接ssh</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      remotePort_proxies_tcp_line: </span><span class="token assign-left variable" style="color:#36acaa">remotePort</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">6666</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    extra_hosts:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      - </span><span class="token string" style="color:#e3116c">"me.host:host-gateway"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    restart: unless-stopped</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    volumes:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      - ./.ssh/authorized_keys:/root/.ssh/authorized_keys</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 以上环境变量, 除了备注的内容, 其他的都可以保持不动就行</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># authorized_keys的内容示例</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ssh-ed25519 xxxxx xxx</span><br></span></code></pre></div></div>
<ul>
<li class="">authorized_keys的内容示例</li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 在本地电脑中执行, 打印公钥</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">cat</span><span class="token plain"> ~/.ssh/id_ed25519.pub</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 复制打印的公钥内容, 需要写入到`./.ssh/authorized_keys`, 这个文件是需要挂载到容器中的文件</span><br></span></code></pre></div></div>
<ul>
<li class="">关于卷(volumes)的说明</li>
</ul>
<p>这里的卷也可以不挂载, 也可以通过进入容器中执行命令去写入<code>authorized_keys</code>文件中</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 使用挂载券方式时, 这一步可省略</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ssh-ed25519 xxxxx xxx'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> /root/.ssh/authorized_keys</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="第三步-需要一台有公网ip的云服务器2c2g1m就差不多了-我的镜像是debian">第三步: 需要一台有公网IP的云服务器(2c2g1m就差不多了, 我的镜像是Debian)<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-sshuttle#%E7%AC%AC%E4%B8%89%E6%AD%A5-%E9%9C%80%E8%A6%81%E4%B8%80%E5%8F%B0%E6%9C%89%E5%85%AC%E7%BD%91ip%E7%9A%84%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A82c2g1m%E5%B0%B1%E5%B7%AE%E4%B8%8D%E5%A4%9A%E4%BA%86-%E6%88%91%E7%9A%84%E9%95%9C%E5%83%8F%E6%98%AFdebian" class="hash-link" aria-label="第三步: 需要一台有公网IP的云服务器(2c2g1m就差不多了, 我的镜像是Debian)的直接链接" title="第三步: 需要一台有公网IP的云服务器(2c2g1m就差不多了, 我的镜像是Debian)的直接链接" translate="no">​</a></h2>
<p><a href="https://gofrp.org/zh-cn/docs/setup/systemd/" target="_blank" rel="noopener noreferrer" class="">frp官网安装地址</a>
<a href="https://github.com/fatedier/frp/releases/tag/v0.62.1" target="_blank" rel="noopener noreferrer" class="">frp官方GitHub下载地址</a></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 下载下来解压</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">tar</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-xzf</span><span class="token plain"> ./frp_0.62.1_linux_amd64.tar.gz </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">mv</span><span class="token plain"> frp_0.62.1_linux_amd64 frp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 进入解压后的目录, 启动frp服务端, 设置开机自启</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> frp </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> systemctl start frps </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> systemctl </span><span class="token builtin class-name">enable</span><span class="token plain"> frps</span><br></span></code></pre></div></div>
<p>然后, 开放下端口, 例如: 开放端口:6666, 用于远程连接ssh</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="第四步-启动docker-compose-测试容器以及上传进行">第四步: 启动docker-compose, 测试容器以及上传进行<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-sshuttle#%E7%AC%AC%E5%9B%9B%E6%AD%A5-%E5%90%AF%E5%8A%A8docker-compose-%E6%B5%8B%E8%AF%95%E5%AE%B9%E5%99%A8%E4%BB%A5%E5%8F%8A%E4%B8%8A%E4%BC%A0%E8%BF%9B%E8%A1%8C" class="hash-link" aria-label="第四步: 启动docker-compose, 测试容器以及上传进行的直接链接" title="第四步: 启动docker-compose, 测试容器以及上传进行的直接链接" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 构建镜像并启动容器</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker-compose</span><span class="token plain"> up </span><span class="token parameter variable" style="color:#36acaa">-d</span><br></span></code></pre></div></div>
<ul>
<li class="">使用ssh远程连接下, 试试效果</li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># vim ~/.ssh/config</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Host frpc.internet.company</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  HostName </span><span class="token number" style="color:#36acaa">129.204</span><span class="token plain">.8.8</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  User root</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Port </span><span class="token number" style="color:#36acaa">6666</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  IdentityFile ~/.ssh/id_ed25519</span><br></span></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 上传公钥, 开启免密登录, 这一步也是顺便检查了是否能够正常通过内网穿透ssh到容器中</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ssh-copy-id frpc.internet.company </span><span class="token parameter variable" style="color:#36acaa">-i</span><span class="token plain"> ~/.ssh/id_ed25519</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 然后, 通过ssh免密登录</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ssh</span><span class="token plain"> frpc.internet.company</span><br></span></code></pre></div></div>
<blockquote>
<p>到这就已经基本完成了在任何地方都能联通ssh了, 接下来的就是简化配置, 以及高级应用了</p>
</blockquote>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="上传镜像到阿里云-简化启动容器的配置">上传镜像到阿里云, 简化启动容器的配置<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-sshuttle#%E4%B8%8A%E4%BC%A0%E9%95%9C%E5%83%8F%E5%88%B0%E9%98%BF%E9%87%8C%E4%BA%91-%E7%AE%80%E5%8C%96%E5%90%AF%E5%8A%A8%E5%AE%B9%E5%99%A8%E7%9A%84%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="上传镜像到阿里云, 简化启动容器的配置的直接链接" title="上传镜像到阿里云, 简化启动容器的配置的直接链接" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 登录</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> login </span><span class="token parameter variable" style="color:#36acaa">--username</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">xxx@qq.com registry.cn-hangzhou.aliyuncs.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">## 标记本地镜像并指向目标仓库（ip:port/image_name:tag，该格式为标记版本号）</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> tag dev-jumpbox registry.cn-hangzhou.aliyuncs.com/xxx/dev-jumpbox:frpc-ssh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">## 推送镜像到仓库</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> push registry.cn-hangzhou.aliyuncs.com/xxx/dev-jumpbox:frpc-ssh</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="简化后的docker-compose配置">简化后的docker-compose配置<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-sshuttle#%E7%AE%80%E5%8C%96%E5%90%8E%E7%9A%84docker-compose%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="简化后的docker-compose配置的直接链接" title="简化后的docker-compose配置的直接链接" translate="no">​</a></h2>
<p>简化后, 就只需要docker-compose配置即可, 当然, 如果没有将<code>authorized_keys</code>配置整合到Dockerfile中的情况下, 还是需要挂载配置的</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">services:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  dev-jumpbox:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    image: registry.cn-hangzhou.aliyuncs.com/iuin/dev-jumpbox:frpc-ssh-v5</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    container_name: dev-jumpbox</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    environment:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      TZ: </span><span class="token string" style="color:#e3116c">"Asia/Shanghai"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># 配置服务端的IP</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      serverAddr: </span><span class="token string" style="color:#e3116c">'"129.204.8.8"'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      client_title: proxies</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      serverPort: </span><span class="token number" style="color:#36acaa">7000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># 名称随便给, 不重复就行</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      client_name: </span><span class="token string" style="color:#e3116c">'"dev-jumpbox-6666"'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      client_type: </span><span class="token string" style="color:#e3116c">'"tcp"'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      localIP_proxies_line: </span><span class="token assign-left variable" style="color:#36acaa">localIP</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"127.0.0.1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      localPort_proxies_line: </span><span class="token assign-left variable" style="color:#36acaa">localPort</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">22</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># 配置云服务器中开放的端口, 随便开放一个都行, 用于远程连接ssh</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      remotePort_proxies_tcp_line: </span><span class="token assign-left variable" style="color:#36acaa">remotePort</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">6666</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    extra_hosts:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      - </span><span class="token string" style="color:#e3116c">"me.host:host-gateway"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    restart: unless-stopped</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="配合sshuttle工具使用-方便访问网页">配合sshuttle工具使用, 方便访问网页<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-sshuttle#%E9%85%8D%E5%90%88sshuttle%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8-%E6%96%B9%E4%BE%BF%E8%AE%BF%E9%97%AE%E7%BD%91%E9%A1%B5" class="hash-link" aria-label="配合sshuttle工具使用, 方便访问网页的直接链接" title="配合sshuttle工具使用, 方便访问网页的直接链接" translate="no">​</a></h2>
<p>这里, 我们借助sshuttle工具, 通过ssh将流量代理转发到容器中, 实现像访问局域网一样访问容器那边的对应内网上的网页</p>
<ul>
<li class=""><a href="https://github.com/sshuttle/sshuttle" target="_blank" rel="noopener noreferrer" class="">sshuttle的github地址</a></li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 安装(macos)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">brew </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> sshuttle</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 代理流量</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sshuttle </span><span class="token parameter variable" style="color:#36acaa">--dns</span><span class="token plain"> --auto-hosts --auto-nets </span><span class="token parameter variable" style="color:#36acaa">-D</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-r</span><span class="token plain"> cpolar.internet.company </span><span class="token number" style="color:#36acaa">10.0</span><span class="token plain">.10.0/24</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="k8s中使用-打通命名空间中的网络">k8s中使用, 打通命名空间中的网络<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-sshuttle#k8s%E4%B8%AD%E4%BD%BF%E7%94%A8-%E6%89%93%E9%80%9A%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E4%B8%AD%E7%9A%84%E7%BD%91%E7%BB%9C" class="hash-link" aria-label="k8s中使用, 打通命名空间中的网络的直接链接" title="k8s中使用, 打通命名空间中的网络的直接链接" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">## k8s等(有内部DNS功能的系统)用法</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sshuttle </span><span class="token parameter variable" style="color:#36acaa">--dns</span><span class="token plain"> --auto-hosts --auto-nets </span><span class="token parameter variable" style="color:#36acaa">-D</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-r</span><span class="token plain"> cpolar.internet.company </span><span class="token number" style="color:#36acaa">10.0</span><span class="token plain">.10.0/24  </span><span class="token number" style="color:#36acaa">100.20</span><span class="token plain">.0.0/16 </span><span class="token number" style="color:#36acaa">100.19</span><span class="token plain">.0.0/16</span><br></span></code></pre></div></div>
<ul>
<li class="">说明: 这里挂载了三个网段
<ul>
<li class="">其中, 第一个网段是需要代理流量的网段
<ul>
<li class="">例如, 在k8s中启动了这个容器, 用于打通命名空间内部网络</li>
</ul>
</li>
<li class="">第二和第三个网段, 则是命名空间中的容器使用的网段
<ul>
<li class="">作用是, 让我们能通过k8s内部域名访问, k8s中容器提供的服务
<ul>
<li class="">即我们通过<code>svc.cluster.local</code>k8s中内部域名访问时
<ul>
<li class="">sshuttle --dns配置会将这个内部域名通过第一个网段去查询内部dns, 去获取内部IP, 然后本地电脑去访问这个IP</li>
<li class="">最后, 正因为获取到的是k8s容器的内部IP, 所以第二和第三网段流量也需要代理</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="最后的话">最后的话<a href="https://doc-record.iuin888vip.icu/en/blog/frp-ssh-sshuttle#%E6%9C%80%E5%90%8E%E7%9A%84%E8%AF%9D" class="hash-link" aria-label="最后的话的直接链接" title="最后的话的直接链接" translate="no">​</a></h2>
<p>到这就基本完成了我们的目标了, 能够正常像在一个局域网中一样, 访问网页以及连接数据库等了</p>
<ul>
<li class="">
<p>下期目标</p>
<ul>
<li class="">实现p2p连接</li>
</ul>
</li>
<li class="">
<p>更多内容</p>
<ul>
<li class=""><a href="https://183461750.github.io/doc-record/docker/dev_utls/dev-container/remote-ssh/frp/article/doc" target="_blank" rel="noopener noreferrer" class="">这篇文章对应的博客文档</a></li>
<li class=""><a href="https://github.com/183461750/doc-record/blob/main/docs/docker/dev_utls/dev-container/remote-ssh/frp/v5/doc.md" target="_blank" rel="noopener noreferrer" class="">对应的GitHub仓库</a>, 可以在这里找到相关的全部配置代码</li>
</ul>
</li>
</ul>
<blockquote>
<p>想不到这么快就到说再见的时候了, 稍稍的期待一下吧, 下期再见👋</p>
</blockquote>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Can you access the entire Intranet (free version) with a container? Use Container to connect restricted networks: cpolar+ssh portfolio images, and sshuttley to open the network]]></title>
            <link>https://doc-record.iuin888vip.icu/en/blog/cpolar-ssh-container</link>
            <guid>https://doc-record.iuin888vip.icu/en/blog/cpolar-ssh-container</guid>
            <pubDate>Wed, 22 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Use Container for Restricted Networks: cpolar+ssh Portfolios and sshuttle to enable all inner network services (including k8s) in any environment (webpages and terminal access)]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>Use Container for Restricted Networks: cpolar+ssh Portfolios and sshuttle to enable all inner network services (including k8s) in any environment (webpages and terminal access)</p>
</blockquote>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="preface">Preface<a href="https://doc-record.iuin888vip.icu/en/blog/cpolar-ssh-container#preface" class="hash-link" aria-label="Preface的直接链接" title="Preface的直接链接" translate="no">​</a></h2>
<p>There is always a need for access to other company intranets during the development process, usually through vpn from other companies, or jumpserver connections.</p>
<p>A few pain points are usually encountered at this time:
- want to access the container services in k8s, k8s internal domain cannot use
- to install many bad vpn software, vpn may be different from one company to another, some vpn may even be like rogue software, there are various restrictions
- some companies do not offer vpn or jumpserverer, can only go on site
- problems with which the network is not interoperable with the company network (some services in which the company wishes to visit home, or some of the company's services at home, etc.)</p>
<p>However, what are the benefits of being connected to the network?
- Your own local computer does not need to accommodate too many vpn software for
- every inner server that can be touched, becomes a tool for you when and where you can access or act as a springboard
- the inner web to open the page,
- Web system app can open
- Nacos with browser on server
- Intranet access
- Database is connected via idea or DBeaver.</p>
<blockquote>
<p>This means that you have access to the network and ssh access where ssh can arrive, you can pull your own local computer into the same network for interoperability</p>
</blockquote>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="prerequisite">Prerequisite<a href="https://doc-record.iuin888vip.icu/en/blog/cpolar-ssh-container#prerequisite" class="hash-link" aria-label="Prerequisite的直接链接" title="Prerequisite的直接链接" translate="no">​</a></h2>
<p>需要有机会把容器起起来, 一般有以下几种方式, 选一个方便去操作的就行, 当容器起来之后, 网络就打通了, 虚拟机等过渡工具就可以删掉了, 不需要了
- 通过jumpserver页面登录
- 自己本身就安转了vpn
- 找安装了vpn的同事
- 专门找台机用于安装各种乱七八糟的vpn也行
- 当然起个虚拟机去安转也行</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-1-writing-dockerfile-used-to-make-image">Step 1: Writing Dockerfile, used to make image<a href="https://doc-record.iuin888vip.icu/en/blog/cpolar-ssh-container#step-1-writing-dockerfile-used-to-make-image" class="hash-link" aria-label="Step 1: Writing Dockerfile, used to make image的直接链接" title="Step 1: Writing Dockerfile, used to make image的直接链接" translate="no">​</a></h2>
<p>I'll find a Linux system, or your own computer (troubleshoots, possible mirrors, need to specify a platform, etc.). Here I choose to use the x86 architectural centos system, and then find a suitable directory such as: <code>/container/cpolar-ssh</code></p>
<ul>
<li class="">Create a <code>Dockerfile</code> file</li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># vim Dockerfile</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 使用官方 CentOS 基础镜像(PS: latest版拉取openssh-server依赖报错)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># FROM centos:centos7.9.2009</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">FROM registry.cn-hangzhou.aliyuncs.com/iuin/centos:latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ENV https_proxy=http://192.168.0.121:7890 http_proxy=http://192.168.0.121:7890 all_proxy=socks5://192.168.0.121:7890</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN </span><span class="token function" style="color:#d73a49">sed</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-i</span><span class="token plain"> s/mirror.centos.org/vault.centos.org/g /etc/yum.repos.d/*.repo </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">sed</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-i</span><span class="token plain"> s/^</span><span class="token comment" style="color:#999988;font-style:italic">#.*baseurl=http/baseurl=http/g /etc/yum.repos.d/*.repo &amp;&amp; \</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">sed</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-i</span><span class="token plain"> s/^mirrorlist</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">http/</span><span class="token comment" style="color:#999988;font-style:italic">#mirrorlist=http/g /etc/yum.repos.d/*.repo &amp;&amp; \</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    yum </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-y</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-O</span><span class="token plain"> /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 安装必要的软件包</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN yum update </span><span class="token parameter variable" style="color:#36acaa">-y</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> yum </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-y</span><span class="token plain"> openssh-server openssh-clients </span><span class="token function" style="color:#d73a49">passwd</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> yum clean all</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 设置 root 密码, 修改 SSH 配置文件允许密码登录和 root 登录</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN </span><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"root:password"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> chpasswd </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">sed</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-i</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g'</span><span class="token plain"> /etc/ssh/sshd_config </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">sed</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-i</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'s/#PasswordAuthentication no/PasswordAuthentication yes/g'</span><span class="token plain"> /etc/ssh/sshd_config </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    /usr/sbin/sshd-keygen</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN </span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-L</span><span class="token plain"> https://www.cpolar.com/static/downloads/install-release-cpolar.sh </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">bash</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">COPY cpolar.yml /usr/local/etc/cpolar/cpolar.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 开启服务后, /usr/sbin/init命令会自动帮忙启动服务</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN systemctl </span><span class="token builtin class-name">enable</span><span class="token plain"> cpolar.service</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 创建启动脚本</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN </span><span class="token function" style="color:#d73a49">tee</span><span class="token plain"> /usr/local/bin/start-cpolar.sh </span><span class="token operator" style="color:#393A34">&lt;&lt;-</span><span class="token string" style="color:#e3116c">'EOF'</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">#!/bin/bash</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">cpolar authtoken ${CPOLAR_AUTH_TOKEN}</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">EOF</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN </span><span class="token function" style="color:#d73a49">chmod</span><span class="token plain"> +x /usr/local/bin/start-cpolar.sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 创建包装服务</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN </span><span class="token function" style="color:#d73a49">tee</span><span class="token plain"> /etc/systemd/system/cpolar-wrapper.service </span><span class="token operator" style="color:#393A34">&lt;&lt;-</span><span class="token string" style="color:#e3116c">'EOF'</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">[Unit]</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">Description=Cpolar Wrapper Service</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"># After=network.target</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">After=cpolar.service</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">[Service]</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">Type=simple</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">ExecStart=/usr/local/bin/start-cpolar.sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">Restart=always</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">RestartSec=10</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">[Install]</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">WantedBy=multi-user.target</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">EOF</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 启用包装服务</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN systemctl </span><span class="token builtin class-name">enable</span><span class="token plain"> cpolar-wrapper.service</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 暴露 SSH 端口</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">EXPOSE </span><span class="token number" style="color:#36acaa">22</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 启动ssh和cpolar服务</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ENTRYPOINT [ "/usr/sbin/init" ]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 创建初始化脚本</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN </span><span class="token function" style="color:#d73a49">tee</span><span class="token plain"> /usr/local/bin/init-container.sh </span><span class="token operator" style="color:#393A34">&lt;&lt;-</span><span class="token string" style="color:#e3116c">'EOF'</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">#!/bin/bash</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"># 替换环境变量的值</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">sed -i "s/\${CPOLAR_AUTH_TOKEN}/$CPOLAR_AUTH_TOKEN/g" /usr/local/bin/start-cpolar.sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">sed -i "s/\${CPOLAR_CONTANER_SSH_NAME}/${CPOLAR_CONTANER_SSH_NAME:-contaner_ssh}/g" /usr/local/etc/cpolar/cpolar.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"># 启动 init</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">exec /usr/sbin/init</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">EOF</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN </span><span class="token function" style="color:#d73a49">chmod</span><span class="token plain"> +x /usr/local/bin/init-container.sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 使用初始化脚本作为入口点</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ENTRYPOINT </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"/usr/local/bin/init-container.sh"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-2-write-docker-composeyml-easy-to-build-and-run-containers">Step 2: Write docker-compose.yml, easy to build and run containers<a href="https://doc-record.iuin888vip.icu/en/blog/cpolar-ssh-container#step-2-write-docker-composeyml-easy-to-build-and-run-containers" class="hash-link" aria-label="Step 2: Write docker-compose.yml, easy to build and run containers的直接链接" title="Step 2: Write docker-compose.yml, easy to build and run containers的直接链接" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> docker-compose.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">services:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  cpolar-ssh:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    build:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      context:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      dockerfile: Dockerfile</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    environment:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      - </span><span class="token assign-left variable" style="color:#36acaa">TZ</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Asia/Shanghai"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      - </span><span class="token assign-left variable" style="color:#36acaa">CPOLAR_AUTH_TOKEN</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">xx</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      - </span><span class="token assign-left variable" style="color:#36acaa">CPOLAR_CONTANER_SSH_NAME</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">coner_ssh_1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    restore: unless-stopped</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    primited: </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    volumes:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      - cpolar.yml:/usr/local/etc/cpolar/cpolar.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<ul>
<li class="">Write a cpolar profile to mount
<ul>
<li class="">This can also be considered to write to Dockerfile, update the variable by way of the environment variable</li>
<li class="">More tunnels need to be configured, then mount them out, thus simplifying the base process</li>
</ul>
</li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> cpolar.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">tunnels:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">${CPOLAR_CONTANER_SSH_NAME}</span><span class="token builtin class-name">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    proto: tcp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    addr: </span><span class="token string" style="color:#e3116c">"22"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    bind_tls: both</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    start_type: </span><span class="token builtin class-name">enable</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="step-3-start-docker-compose-test-container-and-upload">Step 3: Start docker-compose, test container, and upload<a href="https://doc-record.iuin888vip.icu/en/blog/cpolar-ssh-container#step-3-start-docker-compose-test-container-and-upload" class="hash-link" aria-label="Step 3: Start docker-compose, test container, and upload的直接链接" title="Step 3: Start docker-compose, test container, and upload的直接链接" translate="no">​</a></h2>
<p>Adjust the environment variable in the last step, mainly <code>CPOLAR_AUTH_TOKEN</code>, needs to register a free account in the polar to get token.</p>
<ul>
<li class=""><a href="https://www.cpolar.com/" target="_blank" rel="noopener noreferrer" class="">cpolar官网地址</a></li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Build mirrors and start container</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker-compose</span><span class="token plain"> up </span><span class="token parameter variable" style="color:#36acaa">-d</span><br></span></code></pre></div></div>
<ul>
<li class="">Try the effect using the ssh remote connection</li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># vim ~/.ssh/config</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Host polar.internet.company</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  HostName xxx.tcp.cpolar.top</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  User root</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Port </span><span class="token number" style="color:#36acaa">11111</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  IdentitFile ~/.ssh/id_ed25519</span><br></span></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Upload public key, enable decrypted login by passing through the Intranet to check if you can normally pass through the container to</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ssh-copy-id cpolar.internet.company </span><span class="token parameter variable" style="color:#36acaa">-i</span><span class="token plain"> ~/.ssh/id_ed25519</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># and then log in</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ssh</span><span class="token plain"> cpolar.internet.company</span><br></span></code></pre></div></div>
<blockquote>
<p>This is almost complete anywhere to connect, followed by simplified configuration, and advanced applications</p>
</blockquote>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="upload-a-mirror-to-aliyun-to-simplify-the-configuration-of-the-launch-container">Upload a mirror to Aliyun to simplify the configuration of the launch container<a href="https://doc-record.iuin888vip.icu/en/blog/cpolar-ssh-container#upload-a-mirror-to-aliyun-to-simplify-the-configuration-of-the-launch-container" class="hash-link" aria-label="Upload a mirror to Aliyun to simplify the configuration of the launch container的直接链接" title="Upload a mirror to Aliyun to simplify the configuration of the launch container的直接链接" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Login to</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> logo </span><span class="token parameter variable" style="color:#36acaa">--username</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">xxx@qq.com registry.cn-hangzhou.aliyuncs.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">## Marks local mirrors and points to target repository (ip:port/image_name:tag, this format is the notation number)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> tag cpolar-ssh registry.cn-hangzhou.aliyuncs.com/xxx/cpolar-ssh:latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">## Push image to repository</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> push registry.cn-hangzhou.aliyuncs.com/xx/polar-ssh:latest</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="simplified-docker-compose-configuration">Simplified docker-compose configuration<a href="https://doc-record.iuin888vip.icu/en/blog/cpolar-ssh-container#simplified-docker-compose-configuration" class="hash-link" aria-label="Simplified docker-compose configuration的直接链接" title="Simplified docker-compose configuration的直接链接" translate="no">​</a></h2>
<p>Simplified will only require docker-compose. Of course, if the cpolar configuration is not integrated into Dockerfile, it will still need to mount the configuration</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">services:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  cpolar-ssh:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    image: registry.cn-hangzhou.aliyuncs.com/xxx/cpolar-ssh:latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    environment:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      - </span><span class="token assign-left variable" style="color:#36acaa">TZ</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Asia/Shanghai"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      - </span><span class="token assign-left variable" style="color:#36acaa">CPOLAR_AUTH_TOKEN</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">${CPOLAR_AUTH_TOKEN}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      - </span><span class="token assign-left variable" style="color:#36acaa">CPOLAR_CONTANER_SSH_NAME</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">contaner_ssh_1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    restart: unless-stopped</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    privileged: </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"> </span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="use-with-sshuttle-tool-to-facilitate-access-to-web-pages">Use with sshuttle tool to facilitate access to web pages<a href="https://doc-record.iuin888vip.icu/en/blog/cpolar-ssh-container#use-with-sshuttle-tool-to-facilitate-access-to-web-pages" class="hash-link" aria-label="Use with sshuttle tool to facilitate access to web pages的直接链接" title="Use with sshuttle tool to facilitate access to web pages的直接链接" translate="no">​</a></h2>
<p>Here we use the sshuttle tool to forward traffic proxies to containers via ssh, so that we want to access the corresponding web page on the container side of the local area network</p>
<ul>
<li class=""><a href="https://github.com/sshuttle/sshuttle" target="_blank" rel="noopener noreferrer" class="">sshuttle的github地址</a></li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Installation (macos)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">brew </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> sshuttle</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># proxy traffic</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sshuttle --sudoers-user fa </span><span class="token parameter variable" style="color:#36acaa">--dns</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--method</span><span class="token plain"> auto-hosts --auto-not-D </span><span class="token parameter variable" style="color:#36acaa">-r</span><span class="token plain"> cpolar.internet.company </span><span class="token number" style="color:#36acaa">10.0</span><span class="token plain">.0/24</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="last-applicable">Last applicable<a href="https://doc-record.iuin888vip.icu/en/blog/cpolar-ssh-container#last-applicable" class="hash-link" aria-label="Last applicable的直接链接" title="Last applicable的直接链接" translate="no">​</a></h2>
<p>By this time we have largely completed our initial objectives, have the same access as in a local area network, access pages and connect to databases, etc.</p>
<ul>
<li class="">
<p>Finally, there are still some problems with existing programmes</p>
<ul>
<li class="">Password connection is relatively less secure</li>
<li class=""><code>privileged: true</code> is used in the <code>systemd</code> tool, i.e. `docker-compose', the container is too high</li>
<li class="">The third party server (cpolar) is used to transit traffic through another person's server</li>
</ul>
</li>
<li class="">
<p>Next objective</p>
<ul>
<li class="">ssh login using key mode and disable password login</li>
<li class="">Container Service Management tool does not use <code>systemd</code>, but instead has a lighter multiservice management tool <code>tini</code>.
<ul>
<li class="">This docker container is not required to configure <code>privileged: true</code>.</li>
</ul>
</li>
<li class="">The Intranet penetrates into an open source <code>frp</code>, of course, it needs to have its own public server to deploy the server</li>
</ul>
</li>
<li class="">
<p>Related links</p>
<ul>
<li class=""><a href="https://183461750.github.io/doc-record/docker/dev_utls/dev-container/remote-ssh/cpolar/article/doc" target="_blank" rel="noopener noreferrer" class="">这篇文章对应的博客文档</a></li>
<li class=""><a href="https://github.com/183461750/doc-record/blob/main/docs/docker/dev_utls/dev-container/remote-ssh/cpolar/v3/simple/docker-compose.yml" target="_blank" rel="noopener noreferrer" class="">对应的GitHub仓库</a>, all relevant config codes can be found here</li>
</ul>
</li>
</ul>
<blockquote>
<p>I think it is time to say a little bit about it, see it next time: waving_hand:</p>
</blockquote>]]></content:encoded>
        </item>
    </channel>
</rss>