frp实现内网穿透访问内网多台Linux服务器
<p>本文主要记录笔者在使用frp实现内网穿透访问内网多台Linux服务器的全过程,包括公网服务器的配置、frp服务端、客户端的下载与配置,以及配置systmctl来实现系统级启停frp,并记录我遇到的一些问题。希望对大家有所帮助。</p><h2 id="一准备一台公网服务器">一、准备一台公网服务器</h2>
<p>笔者申请的是一台腾讯云服务器。</p>
<h3 id="1打开安全组相关端口">1、打开安全组相关端口</h3>
<ul>
<li>
<p>路径:控制台->安全组->修改规则->添加规则</p>
</li>
<li>
<p>来源:0.0.0.0/0</p>
</li>
<li>
<p>协议端口:</p>
</li>
</ul>
<pre><code>TCP:7000
TCP:6000
TCP:6001
TCP:6002
</code></pre>
<ul>
<li>策略:允许</li>
</ul>
<p><em>注意:入站和出站均需添加。</em></p>
<h3 id="2打开防火墙">2、打开防火墙</h3>
<pre><code class="language-shell"># 启用
sudo ufw enable
# 开放端口
sudo ufw allow 7000
sudo ufw allow 6000
sudo ufw allow 6001
sudo ufw allow 6002
# 查看状态
sudo ufw status
</code></pre>
<h2 id="二下载frp">二、下载frp</h2>
<p>分别下载frp到公网服务器和内网服务器:</p>
<pre><code class="language-shell">wget https://github.com/fatedier/frp/releases/download/v0.35.1/frp_0.35.1_linux_amd64.tar.gz
</code></pre>
<p>然后解压到<code>/usr/local</code>路径下</p>
<pre><code class="language-shell">mkdir /usr/local/frp_0.35.1
tar -zxvf frp_0.35.1_linux_amd64.tar.gz -C /usr/local/frp_0.35.1 --strip-components 1
</code></pre>
<p>解压后路径<code>/usr/local/frp_0.35.1</code>内容如下</p>
<pre><code class="language-shell">frpcfrpc_full.inifrpc.inifrpsfrps_full.inifrps.iniLICENSEsystemd
</code></pre>
<p><em>ps:<code>--strip-components 1 </code>表示跳过第一层目录进行解压</em></p>
<h2 id="三配置公网服务器frpsfrp服务端">三、配置公网服务器(frps:frp服务端)</h2>
<p>修改 frps.ini 文件,这里使用了最简化的配置,设置了 frp 服务器用户接收客户端连接的端口:</p>
<pre><code class="language-shell">vim /usr/local/frp_0.35.1/frps.ini
bind_port = 7000 # 这个是公网服务器的端口,我购买的是tecent云的服务器,其安全策略里面得设置开放此端口
</code></pre>
<h2 id="四配置内网服务器frpcfrp客户端">四、配置内网服务器(frpc:frp客户端)</h2>
<p>在需要被访问的内网机器上(SSH 服务通常监听在 22 端口)部署 frpc,修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为<code> x.x.x.x</code></p>
<p>且由于有三台内网机器同时以同一台公网机器作为跳板机,所以这三台内网机器的client名称需要不同,即<code>frpc.ini</code>中的<code></code>需要分别设置为<code></code>、<code></code>、<code></code>,以示区分。</p>
<p>且这里三台服务器的<code>remote_port</code>分别配置为<code>6000</code>、<code>6001</code>、<code>6002</code>。否则会出现端口被占用,导致无法正常连接到内网机器的情况。</p>
<p>内网机器1:</p>
<pre><code class="language-shell">vim /usr/local/frp_0.35.1/frpc.ini
server_addr = x.x.x.x
server_port = 7000 # 在公网开放的端口
# 这里是client的一个别名,命名为ssh1以和其他client区分
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000 # 这个是公网服务器的端口,安全策略里面也得设置开放此端口
</code></pre>
<p>内网机器2:</p>
<pre><code class="language-shell">vim /usr/local/frp_0.35.1/frpc.ini
server_addr = x.x.x.x
server_port = 7000 # 在公网开放的端口
# 这里是client的一个别名,命名为ssh1以和其他client区分
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6001 # 该端口需与其他内网机器所配置的端口不同
</code></pre>
<p>内网机器3:</p>
<pre><code class="language-shell">vim /usr/local/frp_0.35.1/frpc.ini
server_addr = x.x.x.x
server_port = 7000 # 在公网开放的端口
# 这里是client的一个别名,命名为ssh1以和其他client区分
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6002 # 该端口需与其他内网机器所配置的端口不同
</code></pre>
<p><code>local_ip </code>和<code>local_port</code>配置为本地需要暴露到公网的服务地址和端口。<code>remote_port </code>表示在<code> frp 服务端</code>监听的端口,访问此端口的流量将会被转发到本地服务对应的端口。</p>
<h2 id="五分别启动内网公网服务器frp">五、分别启动内网公网服务器FRP</h2>
<h3 id="1在公网服务器上启动frps服务端">1、在公网服务器上启动frps服务端</h3>
<p>为了方便调试,我们先启动终端版:</p>
<pre><code class="language-shell">cd /usr/local/frp_0.35.1/
./frps -c ./frps.ini
nohup ./frps -c ./frps.ini &
# 链接成功会出现如下内容
# 2021/02/04 00:09:17 frps uses config file: ./frps.ini
# 2021/02/04 00:09:17 frps tcp listen on 0.0.0.0:7000
# 2021/02/04 00:09:17 frps started successfully
</code></pre>
<p>生产使用中可使用如下命令在后台运行:</p>
<pre><code class="language-shell">nohup ./frps -c ./frps.ini > /dev/null 2>&1 &
</code></pre>
<h3 id="2在内网服务器中启动frpc客户端">2、在内网服务器中启动frpc客户端:</h3>
<p>公网服务器启动成功后,在内网服务器中启动frpc,为了方便调试,我们一样启动终端版:</p>
<pre><code class="language-shell">cd /usr/local/frp_0.35.1/
./frpc -c ./frpc.ini
nohup ./frpc -c ./frpc.ini &
# 链接成功会出现如下内容
# 2021/02/04 00:11:47 login to server success, get run id , server udp port
# 2021/02/04 00:11:47 proxy added:
# 2021/02/04 00:11:48 start proxy success
</code></pre>
<p>生产使用中可使用如下命令在后台运行:</p>
<pre><code class="language-shell">nohup ./frpc -c ./frpc.ini > /dev/null 2>&1 &
</code></pre>
<h2 id="六ssh登录服务器">六、ssh登录服务器</h2>
<p>如果配置成功,在进入本地服务器就相对容易了:</p>
<pre><code class="language-shell"># 标准的ssh命令如下
ssh -p 600x root@xx.xx.xx.xx(公网IP)
# XShell支持的ssh命令不标准,应该通过如下命令连接,这个命令才会弹出让你保存密钥的浮窗:
ssh root@xx.xx.xx.xx(公网IP) 6000
</code></pre>
<p>也可以配置XShell的连接如下<br>
<img src="https://img2020.cnblogs.com/blog/1001136/202102/1001136-20210204212953656-1900699021.png" alt="frp_xshell" loading="lazy"></p>
<h2 id="七关闭frp进程">七、关闭frp进程</h2>
<p>这里以frp客户端为例,frp服务端同理。</p>
<h3 id="1找到frp进程">1、找到frp进程</h3>
<pre><code class="language-shell">ps -aux|grep frp| grep -v grep
root 36000.10.1 1101889484 pts/0 Sl 15:04 0:00 ./frpc -c ./frpc.ini
</code></pre>
<p>进程号是<code>3600</code></p>
<h3 id="2kill该进程">2、kill该进程</h3>
<pre><code class="language-shell"># 命令格式:kill -9 <pid>
kill -9 3600
</code></pre>
<h2 id="八配置systemctl来控制frps">八、配置systemctl来控制frps</h2>
<h3 id="1创建frpsservice">1、创建frps.service</h3>
<pre><code class="language-shell">sudo vim /lib/systemd/system/frps.service
</code></pre>
<h3 id="2在frpsservice里添加以下内容">2、在frps.service里添加以下内容</h3>
<pre><code class="language-shell">
Description=frps service
After=network.target syslog.target
Wants=network.target
Type=simple
#启动服务的命令(此处写你的frps的实际安装目录)
ExecStart=/usr/local/frp_0.35.1/frps -c /usr/local/frp_0.35.1/frps.ini
WantedBy=multi-user.target
</code></pre>
<p><em>注意"ExecStart="之后的路径要填写你的frps安装路径(本文以安装到/usr/local/为例)</em></p>
<h2 id="3使用systemctl命令来控制frps">3、使用systemctl命令来控制frps</h2>
<p>启动frps</p>
<pre><code class="language-shell">sudo systemctl start frps
</code></pre>
<p>服务器开机自动启动frps</p>
<pre><code class="language-shell">sudo systemctl enable frps
</code></pre>
<p>重启frps</p>
<pre><code class="language-shell">sudo systemctl restart frps
</code></pre>
<p>停止frps</p>
<pre><code class="language-shell">sudo systemctl stop frps
</code></pre>
<p>查看日志</p>
<pre><code class="language-shell">sudo systemctl status frps
</code></pre>
<p>如下图所示,已可以通过systemctl来启动并查看frps的状态<br>
<img src="https://img2020.cnblogs.com/blog/1001136/202102/1001136-20210205100939216-880987913.png" alt="frp_systemctl" loading="lazy"></p>
<p>frpc的systemctl配置同理,具体如下小节所示。</p>
<h2 id="九配置systemctl来控制frpc">九、配置systemctl来控制frpc</h2>
<h3 id="1创建frpcservice">1、创建frpc.service</h3>
<pre><code class="language-shell">sudo vim /lib/systemd/system/frpc.service
</code></pre>
<h3 id="2在frpcservice里添加以下内容">2、在frpc.service里添加以下内容</h3>
<pre><code class="language-shell">
Description=frpc service
After=network.target syslog.target
Wants=network.target
Type=simple
#启动服务的命令(此处写你的frps的实际安装目录)
ExecStart=/usr/local/frp_0.35.1/frpc -c /usr/local/frp_0.35.1/frpc.ini
WantedBy=multi-user.target
</code></pre>
<p><em>注意"ExecStart="之后的路径要填写你的frpc安装路径(本文以安装到/usr/local/为例)</em></p>
<h2 id="3使用systemctl命令来控制frpc">3、使用systemctl命令来控制frpc</h2>
<p>启动frpc</p>
<pre><code class="language-shell">sudo systemctl start frpc
</code></pre>
<p>服务器开机自动启动frps</p>
<pre><code class="language-shell">sudo systemctl enable frpc
</code></pre>
<p>重启frps</p>
<pre><code class="language-shell">sudo systemctl restart frpc
</code></pre>
<p>停止frps</p>
<pre><code class="language-shell">sudo systemctl stop frpc
</code></pre>
<p>查看日志</p>
<pre><code class="language-shell">sudo systemctl status frpc
</code></pre>
<h2 id="十常见问题">十、常见问题</h2>
<p>如果连接不上,建议在命令行启动frp服务端、客户端后观察终端的输出,对报错、警告进行逐一分析。</p>
<h3 id="1token不匹配">1、token不匹配</h3>
<pre><code class="language-shell"># ./frpc -c ./frpc.ini
2020/06/24 15:35:02 token in login doesn't match token from configuration
2020/06/24 15:35:02 login to server failed: token in login doesn't match token from configuration
token in login doesn't match token from configuration
</code></pre>
<p>解决办法:</p>
<p>(1) 删除或注释掉frp客户端的frpc.ini文件中的<code>token = 12345678</code></p>
<p>(2) 重启frp客户端</p>
<h3 id="2ssh名被占用">2、名被占用</h3>
<pre><code class="language-shell">proxy name is already in use
</code></pre>
<p>解决办法:</p>
<p>frp客户端的<code>frpc.ini</code>文件中的<code></code>修改为<code></code>或其他你想要的命名,这只是一个别名而已,所以怎么命名都ok。</p>
<h2 id="参考">参考</h2>
<p>frp官方文档</p>
<p>Linux服务器所以Frp实现内网穿透(阿里云Ubuntu):主要参考其整体方案</p>
<p>frp后台运行和停止:主要参考xshell如何ssh命令行连接</p>
<p>0001_20190327_使用frp搭建内网穿透:主要参考其token不匹配的解决方案</p>
<p>frp -- proxy name is already in use:主要参考其被占用的解决方案</p>
<p>阿里云服务器实现 FRP 内网穿透:主要参考其多客户端配置</p>
<p>Linux安装配置Frp内网穿透教程:主要参考其systemctl配置</p>
</div>
<div id="MySignature" role="contentinfo">
<div id="div_digga" style="position: fixed; right: 20px; bottom: 30px">
<div class="diggit" style="height: 20px; background-image: none; color: #FFFFFF; background-color: #E33100; border: medium none; font-size: 9pt; font-weight: bold; text-decoration: none">
<span class="diggnum" style="color: #ffffff; font-size: 9pt">顶</span>
</div>
</div>
<div id="div_diggc" style="position: fixed; right: 80px; bottom: 30px">
<div class="diggit" style="height: 20px; background-image: none; color: #FFFFFF; background-color: #2DAEBF; border: medium none; font-weight: bold; text-decoration: none">
<span class="diggnum">Top</span>
</div>
</div>
<div id="div_diggc" style="position: fixed; right: 20px; bottom: 0">
<div class="diggit" style="height: 20px; background-image: none; color: #FFFFFF; background-color: #FFB515; border: medium none; font-weight: bold; text-decoration: none">
<span class="diggnum" style="color: #FFFFFF; font-size: 9pt">收藏</span>
</div>
</div>
<div id="div_diggb" style="position: fixed; right: 80px; bottom: 0">
<div class="diggit" style="height: 20px; background-image: none; color: #FFFFFF; background-color: green; border: medium none; font-weight: bold; text-decoration: none">
<span class="diggnum" style="color: #ffffff; font-size: 9pt">关注</span>
</div>
</div>
<div id="div_diggc" style="position: fixed; right: 140px; bottom: 0">
<div class="diggit" style="height: 20px; background-image: none; color: #FFFFFF; background-color: #EEEEEE; border: medium none; font-weight: bold; text-decoration: none">
<span class="diggnum" style="color: #FFFFFF; font-size: 9pt">评论</span>
</div>
</div><br><br>
来源:https://www.cnblogs.com/JasonCeng/p/14375087.html
頁:
[1]