专栏总目录
一、准备测试程序
(一)用python写一个TCP服务器端程序
import socket
import threading
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('127.0.0.1', 9999))
s.listen(1000)
print('start listening')
def handler(conn):
data = conn.recv(1024)
print(data.decode())
while True:
conn, addr = s.accept()
if conn:
p = threading.thread(target= handler, args=(conn,))
p.start()
(二)设置该程序自动运行
按照ubuntu22 设置开机自动运行程序_ubuntu22开机自动运行命令-CSDN博客
操作,实现该程序 开机自动运行。
二、实现内网穿透
(一)拥有一个具有公网ip的云服务器
此处省略,回头更新。
(二)流量转发
在本地计算机,使用ssh远程转发,实现将本地服务,映射到云端服务器指定端口,实现内网穿透功能,即我们可以通过云端服务器的公网ip,将流量转发到内网服务器的端口。
该命令使用格式如下:
ssh -R 指定的公网IP服务器端口:本地地址:本地服务端口 用户名@公网ip服务器地址 -p 公网ip服务器ssh端口
例如:
公网服务器: 我的云服务器,即拥有公网IP地址的服务器地址为8.8.8.8;
ssh默认端口为22(未自己设置其他端)未设置公钥,仅使用密码登陆;
用户名为zero
内网服务器:应用程序开启在9999上侦听
实现目标:将【内网服务器】9999端口的服务,转发到【公网服务器】8899端口。实现【公网服务器】8899到【内网服务器】9999端口的联通。
可以写成如下形式:
ssh -R 8899:127.0.0.1:9999 zero@8.8.8.8 -p 22
上述命令的127.0.0.1:9999部分,也可以指定为当前内网的其它主机端口的服务,将指定内网主机端口上的服务内网穿透到云服务器指定端口上
执行后,按照提示输入密码即可。
在公网IP服务器段,使用netstat -pantu命令检查8899是否开启,检查内网服务器使用netstat -pantu命令检查是否已经成功开启了向8.8.8.8服务器的ssh隧道。
(三)开机自动实现建立上述隧道
1.安装工具
为了实现ssh登陆的交互,需要使用expect工具
安装该工具命令:
sudo apt-get install expect
2.编写expect脚本:
创建一个名为auto_ssh_tunnel_expect.sh
的脚本,并添加以下格式:
#!/usr/bin/expect -f
set timeout 60
# SSH 登录信息
set username "zero"
set password "your_password"
set host "8.8.8.8"
set port "22"
set local_port "9999"
set remote_port "8899"
# SSH -R 命令
spawn ssh -R $remote_port:127.0.0.1:$local_port $username@$host -p $port
# 期待密码提示并输入密码
expect {
"*assword:" {
send "$password\r"
}
}
# 保持SSH隧道开启
interact
3.设置脚本可执行权限:
在当前文件目录下,执行。
chmod +x auto_ssh_tunnel_expect.sh
4.测试脚本:
./auto_ssh_tunnel_expect.sh
如果一切正常,你的SSH隧道应该已经建立。
5.使用systemd
服务设置开机自启:
(1)创建一个新的systemd
服务文件:
sudo vi /etc/systemd/system/ssh-tunnel.service
(2)在systemd文件中添加以下内容:
请确保替换/path/to/auto_ssh_tunnel_expect.sh
为你的脚本实际路径
[Unit]
Description=SSH Reverse Tunnel Service
After=network.target
[Service]
User=your_username
ExecStart=/path/to/auto_ssh_tunnel_expect.sh
Restart=always
[Install]
WantedBy=multi-user.target
(3)开启并启动服务
sudo systemctl enable ssh-tunnel.service
sudo systemctl start ssh-tunnel.service
(4)检查服务状态以确保它正在运行:
sudo systemctl status ssh-tunnel.service