<?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/blog</link>
        <description>Doc Record Blog</description>
        <lastBuildDate>Sun, 19 Apr 2026 05:28:51 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-Hans</language>
        <item>
            <title><![CDATA[Welcome]]></title>
            <link>https://doc-record.iuin888vip.icu/blog/welcome</link>
            <guid>https://doc-record.iuin888vip.icu/blog/welcome</guid>
            <pubDate>Sun, 19 Apr 2026 05:28:51 GMT</pubDate>
            <description><![CDATA[Welcome to my blog! This is a sample post to verify the blog functionality.]]></description>
            <content:encoded><![CDATA[<p>Welcome to my blog! This is a sample post to verify the blog functionality.</p>
<p>This blog is powered 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 native Thread]]></title>
            <link>https://doc-record.iuin888vip.icu/blog/materiel/article/OutOfMemoryError_unable_to_create_new_native_Thread</link>
            <guid>https://doc-record.iuin888vip.icu/blog/materiel/article/OutOfMemoryError_unable_to_create_new_native_Thread</guid>
            <pubDate>Sun, 19 Apr 2026 05:28:51 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"># 使用此命令查看正在运行的线程数</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"># 要获取进程正在运行的线程数（可以使用 top 或 ps aux 获取进程 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"># 查找哪些进程正在创建线程</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"># 用户可以拥有的线程数量是有限制的。可以通过“最大用户进程数”行进行检查</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 文件提供系统范围内的线程数限制。 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"># 要更改限制（在本例中为 4096 个线程）：</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">-u</span><span class="token plain"> </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 列出所有 java 进程（只需在 shell 中执行 jps ）并使用每个 Ghost 进程的 kill -9 pid bash 命令分别杀死它们时，它就解决了。</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/blog/materiel/article/SSH远程端口转发配置指南_使用socat实现灵活的端口映射</link>
            <guid>https://doc-record.iuin888vip.icu/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/blog/materiel/article/arthas查看sql</link>
            <guid>https://doc-record.iuin888vip.icu/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/blog/materiel/article/postgresql表死锁问题的排查方式</link>
            <guid>https://doc-record.iuin888vip.icu/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/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/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/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/blog/materiel/article/一键更换Linux优质的软件源和docker源</link>
            <guid>https://doc-record.iuin888vip.icu/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/blog/docker/doc/article/docker镜像源</link>
            <guid>https://doc-record.iuin888vip.icu/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/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/blog/docker-compose-healthcheck</link>
            <guid>https://doc-record.iuin888vip.icu/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/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[Mihomo SSH Config Alias Support]]></title>
            <link>https://doc-record.iuin888vip.icu/blog/mihomo-ssh-alias</link>
            <guid>https://doc-record.iuin888vip.icu/blog/mihomo-ssh-alias</guid>
            <pubDate>Wed, 22 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[🔗 项目信息]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="-项目信息">🔗 项目信息<a href="https://doc-record.iuin888vip.icu/blog/mihomo-ssh-alias#-%E9%A1%B9%E7%9B%AE%E4%BF%A1%E6%81%AF" class="hash-link" aria-label="🔗 项目信息的直接链接" title="🔗 项目信息的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>Fork 仓库</strong>: <a href="https://github.com/iuin8/mihomo" target="_blank" rel="noopener noreferrer" class="">https://github.com/iuin8/mihomo</a></li>
<li class=""><strong>分支</strong>: (请确保查看包含 <code>ssh-config-alias</code> 功能的分支, 例如: <code>ssh_system_v1.19.17</code>)</li>
<li class=""><strong>核心文件</strong>: <code>adapter/outbound/ssh.go</code>, <code>adapter/outbound/ssh_system.go</code></li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="-需求背景">📖 需求背景<a href="https://doc-record.iuin888vip.icu/blog/mihomo-ssh-alias#-%E9%9C%80%E6%B1%82%E8%83%8C%E6%99%AF" class="hash-link" aria-label="📖 需求背景的直接链接" title="📖 需求背景的直接链接" translate="no">​</a></h2>
<p>在复杂的网络环境中，用户往往已经维护了一套完善的 SSH 配置文件 (<code>~/.ssh/config</code>)。这些配置可能包含：</p>
<ol>
<li class=""><strong>ProxyJump (跳板机)</strong>：需要通过一台或多台跳板机才能访问目标内网服务器。</li>
<li class=""><strong>ProxyCommand</strong>：使用第三方认证工具（如 Cloudflare Access, AWS SSM）建立连接。</li>
<li class=""><strong>IdentityFile</strong>：针对不同主机使用不同的密钥文件。</li>
<li class=""><strong>Host 别名</strong>：使用简短的别名代替长 IP 或域名。</li>
</ol>
<p>原有的 Mihomo SSH 适配器使用 Go 语言原生 SSH 库，无法直接利用这些系统级配置，导致用户必须把复杂的跳板逻辑手动转化为 Mihomo 的代理链（Dialer Proxy），配置繁琐且不支持部分高级指令（如特殊的 ProxyCommand）。</p>
<p><strong>目标</strong>：让 Mihomo 可以直接"借用"系统 SSH 客户端的能力，只需填一个主机别名（如 <code>my-server</code>），剩下的认证、跳转全交给系统 SSH 处理。</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="-功能特性">✨ 功能特性<a href="https://doc-record.iuin888vip.icu/blog/mihomo-ssh-alias#-%E5%8A%9F%E8%83%BD%E7%89%B9%E6%80%A7" class="hash-link" aria-label="✨ 功能特性的直接链接" title="✨ 功能特性的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-完整-ssh-config-支持">1. 完整 SSH Config 支持<a href="https://doc-record.iuin888vip.icu/blog/mihomo-ssh-alias#1-%E5%AE%8C%E6%95%B4-ssh-config-%E6%94%AF%E6%8C%81" class="hash-link" aria-label="1. 完整 SSH Config 支持的直接链接" title="1. 完整 SSH Config 支持的直接链接" translate="no">​</a></h3>
<p>通过调用系统 <code>ssh</code> 命令建立隧道，Mihomo 可以支持系统 SSH 客户端支持的所有指令：</p>
<ul>
<li class="">✅ <code>ProxyJump</code> / <code>JumpHost</code></li>
<li class="">✅ <code>ProxyCommand</code> (支持 cloudflared, nc 等)</li>
<li class="">✅ <code>IdentityFile</code>, <code>User</code>, <code>Port</code> 等自动读取</li>
<li class="">✅ <code>Match</code>, <code>Include</code> 等高级配置逻辑</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-智能用户切换-sudo--u">2. 智能用户切换 (<code>sudo -u</code>)<a href="https://doc-record.iuin888vip.icu/blog/mihomo-ssh-alias#2-%E6%99%BA%E8%83%BD%E7%94%A8%E6%88%B7%E5%88%87%E6%8D%A2-sudo--u" class="hash-link" aria-label="2-智能用户切换-sudo--u的直接链接" title="2-智能用户切换-sudo--u的直接链接" translate="no">​</a></h3>
<p>Mihomo 通常以 <strong>root</strong> 权限运行（为了 TUN 模式等），而用户的 SSH 配置位于普通用户目录下。本功能实现了：</p>
<ul>
<li class="">自动检测或指定实际用户。</li>
<li class="">使用 <code>sudo -u &lt;user&gt; -i</code> 切换身份执行 SSH。</li>
<li class=""><strong><code>-i</code> 参数</strong>确保加载用户的完整登录环境（<code>PATH</code>），保证 <code>cloudflared</code> 等命令可被找到。</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-零配置密钥">3. 零配置密钥<a href="https://doc-record.iuin888vip.icu/blog/mihomo-ssh-alias#3-%E9%9B%B6%E9%85%8D%E7%BD%AE%E5%AF%86%E9%92%A5" class="hash-link" aria-label="3. 零配置密钥的直接链接" title="3. 零配置密钥的直接链接" translate="no">​</a></h3>
<p>无需在 Mihomo 配置文件中填入私钥内容，它会自动读取 <code>~/.ssh/id_rsa</code> 或配置中指定的 <code>IdentityFile</code>。</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="-使用方式">🚀 使用方式<a href="https://doc-record.iuin888vip.icu/blog/mihomo-ssh-alias#-%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F" class="hash-link" aria-label="🚀 使用方式的直接链接" title="🚀 使用方式的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="参数说明">参数说明<a href="https://doc-record.iuin888vip.icu/blog/mihomo-ssh-alias#%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E" class="hash-link" aria-label="参数说明的直接链接" title="参数说明的直接链接" translate="no">​</a></h3>





























<table><thead><tr><th>字段</th><th>说明</th></tr></thead><tbody><tr><td><code>type</code></td><td>必须为 <code>ssh</code></td></tr><tr><td><code>server</code></td><td><strong>关键</strong>：填写 <code>~/.ssh/config</code> 中的 <code>Host</code> 别名</td></tr><tr><td><code>port</code></td><td><strong>注意</strong>：填写目标服务<strong>内部</strong>监听端口（通常是 <strong>22</strong>）。<br>⚠️ 不要填 <code>~/.ssh/config</code> 中的映射端口。</td></tr><tr><td><code>use-ssh-config-alias</code></td><td>设置为 <code>true</code> 开启此功能</td></tr><tr><td><code>ssh-user</code></td><td>指定本地执行 SSH 命令的用户名（你的 macOS/Linux 用户名）</td></tr></tbody></table>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="配置示例">配置示例<a href="https://doc-record.iuin888vip.icu/blog/mihomo-ssh-alias#%E9%85%8D%E7%BD%AE%E7%A4%BA%E4%BE%8B" class="hash-link" aria-label="配置示例的直接链接" title="配置示例的直接链接" translate="no">​</a></h3>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="场景-1基础跳板机-proxyjump">场景 1：基础跳板机 (ProxyJump)<a href="https://doc-record.iuin888vip.icu/blog/mihomo-ssh-alias#%E5%9C%BA%E6%99%AF-1%E5%9F%BA%E7%A1%80%E8%B7%B3%E6%9D%BF%E6%9C%BA-proxyjump" class="hash-link" aria-label="场景 1：基础跳板机 (ProxyJump)的直接链接" title="场景 1：基础跳板机 (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 bastion</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">Host internal-db</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  HostName 10.0.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 bastion  # 自动经过 bastion 跳转</span><br></span></code></pre></div></div>
<p><strong>Mihomo 配置</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"># 直接填别名</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"># 目标内部 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">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="场景-2cloudflare-access-proxycommand">场景 2：Cloudflare Access (ProxyCommand)<a href="https://doc-record.iuin888vip.icu/blog/mihomo-ssh-alias#%E5%9C%BA%E6%99%AF-2cloudflare-access-proxycommand" class="hash-link" aria-label="场景 2：Cloudflare Access (ProxyCommand)的直接链接" title="场景 2：Cloudflare Access (ProxyCommand)的直接链接" translate="no">​</a></h4>
<p><strong>SSH Config</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 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">  # 需要 cloudflared 命令在 PATH 中</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ProxyCommand cloudflared access ssh --hostname %h</span><br></span></code></pre></div></div>
<p><strong>Mihomo 配置</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="-原理简述">🛠 原理简述<a href="https://doc-record.iuin888vip.icu/blog/mihomo-ssh-alias#-%E5%8E%9F%E7%90%86%E7%AE%80%E8%BF%B0" class="hash-link" aria-label="🛠 原理简述的直接链接" title="🛠 原理简述的直接链接" translate="no">​</a></h2>
<p>Mihomo 收到连接请求后，会在底层执行类似以下的命令：</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>这条命令会建立一个标准输入/输出到目标 SSH 端口的 TCP 隧道。Mihomo 随后在这个隧道上进行自己的 SSH 协议握手，建立代理连接。</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ssh]]></title>
            <link>https://doc-record.iuin888vip.icu/blog/ssh-manual</link>
            <guid>https://doc-record.iuin888vip.icu/blog/ssh-manual</guid>
            <pubDate>Wed, 22 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[- SSH 隧道简明教程]]></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 隧道简明教程</a></p>
<ul>
<li class="">动态转发
<ul>
<li class="">请求地址为192.168.1.100:3000，则通过 SSH 转发的请求地址也是192.168.1.100:3000。</li>
<li class="">ssh -N -D localhost:2000 root@192.168.10.85</li>
<li class="">我们只需要在本地配置上 socks 代理，localhost:2000 即可把所有请求通过 ssh 2000 端口转发到 192.168.10.85 这台机器上去了。</li>
</ul>
</li>
<li class="">本地转发
<ul>
<li class="">我们需要在 ServerA 上执行以下命令开启 ssh 隧道：</li>
<li class="">ssh -N -L 8888:192.168.10.134:8888 root@192.168.10.85</li>
<li class="">执行后 serverA 上已经开始监听 8888 端口了，默认是在本地回环地址上，需要其他机器访问的话可以指定 ip 或者增加 -g 参数开启网关模式。</li>
</ul>
</li>
</ul>
</li>
<li class="">
<p>socks5 代理</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="">可以使用一个叫做Sockscap的软件，把应用扔进去就能以代理的方式上网了。（部分需要调用多个进程的应用可能不行）</li>
<li class="">如果你想把socks代理转换成http代理，可以用privoxy这个东东。</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"># 上传密钥~/.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.251</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 看是否联通</span><br></span></code></pre></div></div>
<ul>
<li class=""><a class="" href="https://doc-record.iuin888vip.icu/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[(免费版)有没想过起个容器就能打通整个内网呢? 使用容器打通受限网络: cpolar+ssh组合镜像以及sshuttle打通网络]]></title>
            <link>https://doc-record.iuin888vip.icu/blog/cpolar-ssh-container</link>
            <guid>https://doc-record.iuin888vip.icu/blog/cpolar-ssh-container</guid>
            <pubDate>Wed, 22 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[使用容器打通受限网络: cpolar+ssh组合镜像以及sshuttle实现打通任意环境所有内网服务(包括k8s)(web页面以及终端访问)]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>使用容器打通受限网络: cpolar+ssh组合镜像以及sshuttle实现打通任意环境所有内网服务(包括k8s)(web页面以及终端访问)</p>
</blockquote>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="前言">前言<a href="https://doc-record.iuin888vip.icu/blog/cpolar-ssh-container#%E5%89%8D%E8%A8%80" class="hash-link" aria-label="前言的直接链接" title="前言的直接链接" translate="no">​</a></h2>
<p>开发过程中总是能遇到需要访问其他公司内网的情况, 一般常规方案都是由其他公司提供vpn访问, 或者jumpserver进行内网服务器连接.</p>
<p>这时, 一般就会遇到几个痛点:
- 想要访问k8s中的容器服务, k8s内部域名无法直接使用
- 要装很多乱七八糟的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/blog/cpolar-ssh-container#%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/blog/cpolar-ssh-container#%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/cpolar-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"></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="第二步-编写docker-composeyml-方便构建和运行容器">第二步: 编写docker-compose.yml, 方便构建和运行容器<a href="https://doc-record.iuin888vip.icu/blog/cpolar-ssh-container#%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 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><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">    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">xxx</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><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="">编写用于挂载的cpolar配置文件
<ul>
<li class="">这个也可以考虑写死到Dockerfile中, 通过环境变量的方式去更新变量</li>
<li class="">需要配置更多的隧道, 再把它给挂载出来, 这样能够简化下基础流程</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="第三步-启动docker-compose-测试容器以及上传进行">第三步: 启动docker-compose, 测试容器以及上传进行<a href="https://doc-record.iuin888vip.icu/blog/cpolar-ssh-container#%E7%AC%AC%E4%B8%89%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>
<p>调整上一步中的环境变量, 主要是<code>CPOLAR_AUTH_TOKEN</code>, 需要到cpolar中注册个免费账号, 才能获取到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"># 构建镜像并启动容器</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 cpolar.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">  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 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"># 然后, 通过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"> cpolar.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/blog/cpolar-ssh-container#%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 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">## 推送镜像到仓库</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/cpolar-ssh:latest</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="简化后的docker-compose配置">简化后的docker-compose配置<a href="https://doc-record.iuin888vip.icu/blog/cpolar-ssh-container#%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配置即可, 当然, 如果没有将cpolar配置整合到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">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="配合sshuttle工具使用-方便访问网页">配合sshuttle工具使用, 方便访问网页<a href="https://doc-record.iuin888vip.icu/blog/cpolar-ssh-container#%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 --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 --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></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="最后的话">最后的话<a href="https://doc-record.iuin888vip.icu/blog/cpolar-ssh-container#%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="">密码连接相对没那么安全</li>
<li class="">使用到了<code>systemd</code>工具, 也就是docker-compose中必须使用<code>privileged: true</code>, 容器权限太高了</li>
<li class="">用的第三方的服务器(cpolar)做中转, 流量要经过别人的服务器</li>
</ul>
</li>
<li class="">
<p>下期目标</p>
<ul>
<li class="">ssh改为使用密钥方式登录, 禁用密码登录</li>
<li class="">容器服务管理工具不使用<code>systemd</code>, 而是改为更轻量的多服务管理工具<code>tini</code>
<ul>
<li class="">这样docker容器也不在需要配置<code>privileged: true</code>了</li>
</ul>
</li>
<li class="">内网穿透改为开源的<code>frp</code>, 当然, 这里就需要自己有一台公网的服务器去部署服务端了</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/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>, 可以在这里找到相关的全部配置代码</li>
</ul>
</li>
</ul>
<blockquote>
<p>想不到这么快就到说再见的时候了, 稍稍的期待一下吧, 下期再见👋</p>
</blockquote>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[(frps selfhost版)有没想过起个容器就能打通整个内网呢? 使用容器打通受限网络: frp+ssh组合镜像以及clash(mihomo)实现打通网络(full)]]></title>
            <link>https://doc-record.iuin888vip.icu/blog/frp-ssh-clash-full</link>
            <guid>https://doc-record.iuin888vip.icu/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/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/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/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/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/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/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/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/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/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/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/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/blog/frp-ssh-clash</link>
            <guid>https://doc-record.iuin888vip.icu/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/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/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/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/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/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/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/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/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/blog/frp-ssh-sshuttle</link>
            <guid>https://doc-record.iuin888vip.icu/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/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/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/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/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/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/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/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/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/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/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/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>
    </channel>
</rss>