评论

评论

代码:/etc/systemd/system/socat.service

[Unit]
Description="socat systemd"
[Service]
Type=simple
Restart=on-failure
RestartSec=10
User=ubuntu
ExecStart = /usr/bin/socat tcp-listen:1111,reuseaddr,fork tcp:localhost:5555
[Install]
WantedBy=multi-user.target

现在我想转发这些:

public_ip:1111 to localhost:5555
public_ip:2222 to localhost:6666
public_ip:3333 to localhost:7777

在单个 socat.service 文件中进行所有这些转发的格式是什么?如果没有办法做到这一点,我可以在 bash 文件中编写多个 socat 语句并将其放在 ExecStart 中吗?

答案1

  1. 您可以ExecStart通过在 shell 中运行命令来顺序运行多个命令:
ExecStart=sh -c '/usr/bin/socat tcp-listen:1111,reuseaddr,fork tcp:localhost:5555; /usr/bin/socat tcp-listen:2222,reuseaddr,fork tcp:localhost:6666;/usr/bin/socat tcp-listen:3333,reuseaddr tcp:localhost:7777'
  1. 您可以将这些多个命令放入 shell 脚本中,向其中添加 shebang 行,将其标记为可执行,然后将其放入 中/usr/bin/mysocatscript.sh,然后在 中使用该脚本ExecStart
ExecStart=/usr/bin/mysocatscript.sh

这已经比 1. 更好了,因为您可以编写脚本在其中一项失败时中止,或者提供更多信息。

  1. 你写一个模板单元文件,即以 结尾的单元文件@.service,我们称之为.然后你可以传递一个参数:/usr/lib/systemd/systenm/[email protected]%i
[Unit]
Description="socat single forwarding"
[Service]
Type=simple
Restart=on-failure
RestartSec=10
ExecStart=/bin/bash -c "inport=$(echo %i | cut -d: -f1); outport=$(echo %i | cut -d: -f2); /usr/bin/socat tcp-listen:${inport},reuseaddr tcp:localhost:${outport}"

现在,您只需启动 即可设置 socat 转发socat-forward@port_in:port_out,例如systemctl start socat-forward@1111:5555

然后您可以编写一个单元文件socat-connections.service

[Unit]
Description="socat custom forwardings"
[Service]
Type=simple
Restart=on-failure
RestartSec=60
Requires=socat-forward@1111:5555 socat-forward@2222:6666 socat-forward@3333:7777
[Install]
WantedBy=multi-user.target

显然,3. 是“最佳”选项:

  • 您实际上获得了可重用、可配置的服务。
  • 您可以根据需要向上或向下拉动各个转发。
  • 当您的 3 个 socat 调用之一失败时,只有该调用会重新启动,或报告为失败等。因此,systemctl status实际上会告诉您哪个转发不起作用!
  • 您可以通过一项服务设置和删除一组转发,并且
  • 实际上,您可以使依赖于您的转发的内容(例如,您的开发 Web 服务器、您的 SSH 服务器等)依赖于端口转发,以便仅设置所需的转发。

评论

  • ubuntu如果运行程序的用户是,而不是nobody,或者是守护程序用户,则可能表明您实际上不需要系统,而是用户服务
  • 很可能取决于之前建立的网络
  • 这真的是一个用例吗socat?在我看来,伪装/NA​​T 也会为您做同样的事情,但 CPU 使用率较低。

相关内容