代码:/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
- 您可以
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'
- 您可以将这些多个命令放入 shell 脚本中,向其中添加 shebang 行,将其标记为可执行,然后将其放入 中
/usr/bin/mysocatscript.sh
,然后在 中使用该脚本ExecStart
:
ExecStart=/usr/bin/mysocatscript.sh
这已经比 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
?在我看来,伪装/NAT 也会为您做同样的事情,但 CPU 使用率较低。