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

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.
阅读 1.2k
3 个回答

我猜应该是这样的:

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

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

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

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

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

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

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

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏