当前位置: 首页 > 知识库问答 >
问题:

linux - ubuntu24.04如何通过systemd开机后将22端口转发到公网?

宁卓
2024-07-26

nat.sh文件内容如下

#!/bin/bash
local_ip=127.0.0.1
remote_ip=公网服务器ip
remote_port=22
remote_user=root
remote_password=服务器密码
target_port=("22:22222")
for item in ${target_port[@]};do
    array=(${item//:/ })
    the_local_port=${array[0]}
    the_remote_port=${array[1]}
    /usr/bin/ssh -o ServerAliveInterval=60 -o StrictHostKeyChecking=no -o ExitOnForwardFailure=yes -N -f -R $the_remote_port:$local_ip:$the_local_port $remote_user@$remote_ip -p $remote_port
done

我将公钥放到了公网服务器,所以不需要密码的。

我手动执行这个nat.sh是没问题的,一切正常,但是开机启动就报连接公网服务器无权限。

我的开机启动脚本内容如下

[Unit]
Description=nat
After=multi-user.target

[Service]
Type=simple
User=tom
ExecStart=/home/tom/nat.sh
Restart=always

[Install]
WantedBy=multi-user.target

错误日志

Jul 25 14:17:06 konka systemd[1]: Started nat.service - nat.
Jul 25 14:17:07 konka nat.sh[3002]: Permission denied, please try again.
Jul 25 14:17:07 konka nat.sh[3002]: Permission denied, please try again.
Jul 25 14:17:07 konka nat.sh[3002]: root@ip地址: Permission denied (publickey,password).
Jul 25 14:17:07 konka systemd[1]: nat.service: Main process exited, code=exited, status=255/EXCEPTION
Jul 25 14:17:07 konka systemd[1]: nat.service: Failed with result 'exit-code'.
Jul 25 14:17:07 konka systemd[1]: nat.service: Scheduled restart job, restart counter is at 5.
Jul 25 14:17:07 konka systemd[1]: nat.service: Start request repeated too quickly.
Jul 25 14:17:07 konka systemd[1]: nat.service: Failed with result 'exit-code'.
Jul 25 14:17:07 konka systemd[1]: Failed to start nat.service - nat.

共有3个答案

干高歌
2024-07-26

这不是报错都说了你的ssh认证失败了么?它尝试了public key和 password两种认证方案,认证失败了,所以ssh报错permission denied.

很明显你的脚本不是非交互式的,无法运行。

要么你用无密码的密钥认证方案实现非交互认证,要么sshpass传递你的密码实现非交互认证。

另外我觉得你的需求应该用 nftables (iptables的继任者) 实现是否更合理也更简单?

孔阳炎
2024-07-26

你这个nat.sh别放在/home/tom/,你放在 /usr/local/bin 下面,应该是这个目录没权限

何聪
2024-07-26

我猜应该是这样的:

脚本里面ssh的命令加了 -f ,这个参数会让ssh在连接成功之后保持在后台运行。

然后systemd配置文件中,指定了type=simple。这个simple通常是需要让你的程序在前台运行,主进程不退出的情况下才应该用这个模式。

ssh -f 之后,主进程会退出,这个时候simple模式下的service会被判定为进程已经结束,并且启动失败。

所以修复的方法有两种:
第一种,去掉ssh的-f参数,让它保持前台运行
第二种:修改service,设置type为fork

两种方式随便选一种操作一下就可以了。

 类似资料:
  • 问题内容: 我在Mac OSX上使用Docker。 我有一个带有打开的守护程序的容器,正在侦听port 。 虚拟机设置为将所有计算机端口流量转发到此容器端口。 我想将我的本地主机设置为将所有流量转发到计算机端口。 我的机器在 我已经使用Apache虚拟主机配置和Proxy将本地端口8080上的所有HTTP通信转发到了计算机。 对ssh做相同的正确方法是什么? 我认为它涉及到此处提到的SSH隧道传输

  • 问题内容: 我在公司中提供一个私有Docker容器,并希望我的同事能够在我们的内部网络中访问,问题是我的来宾操作系统是OSX,因此我只能使用192.168.99.100:3000访问我的应用程序来自docker机器的默认IP。 如何将docker-machine 3000端口转发到主机80端口? 问题答案: 目前,Docker Machine是在您计算机中VirtualBox下运行的虚拟机,因此要

  • 问题内容: 主机可以打开Docker容器访问端口吗?具体来说,我在主机上运行了MongoDB和RabbitMQ,我想在Docker容器中运行一个进程以侦听队列并(可选)写入数据库。 我知道我可以将端口从容器转发到主机(通过- p选项),并可以从Docker容器中连接到外部环境(即Internet),但我不想公开RabbitMQ和MongoDB端口从主持人到外界 编辑:一些澄清: 我必须执行此技巧才

  • 我希望通过ssh(端口22)隧道,然后端口转发3306访问数据库-SOAPUIgroovy。这是我到目前为止所拥有的,我无法成功运行此代码。 以下是我得到的错误: 组织。科德豪斯。非常棒。控制多重编译错误异常:启动失败:Script23。groovy:4:无法解析com类。jcraft公司。jsch公司。JSch@第4行,第1列。导入com。jcraft公司。jsch公司。JSch组织。科德豪斯。

  • 8.22下午3点开始,持续大概1个小时。 1. 自我介绍 2. 出于什么考虑报的后端开发岗位? 3. 现在手上有什么其他offer? 4. 你更倾向于哪个offer? 5. 讲一下教研室的项目,以及就此延申的几个问题 6. 本科和研究生期间实习过吗? 7. 旷视是做什么的了解吗? 8. 为什么考虑做后端开发而不是别的? 9. 未来规划 10. 说一下做的比赛 11. Java相关有没有了解比较深的

  • 问题内容: 我希望能够远程连接到公开了JMX的Java服务,但是该服务已被防火墙阻止。我尝试使用ssh本地端口转发,但是连接失败。看一下wireshark,看来当您尝试与jconsole连接时,它想在连接到受防火墙阻止的端口9999后通过一些临时端口进行连接。 有什么方法可以使jconsole仅通过9999连接或使用代理?是这篇文章仍然是最好的解决办法?还是我错过了什么? 问题答案: 有什么方法可

  • 我在 192.168.100.1:1080 上有一个代理,可以转发流量,我知道使用: 可以将 eth0 的流量转发到 192.168.100.1:1080,但是我使用 nftables 却无法实现,测试了 iptables-translate 等工具也不行。 我期望的结果是,将 eth0 的所有流量通过 192.168.100.1:1080 代理转发。 请问我如何通过 nftables 实现上述需