You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ubuntu系统VPS将25端口SMTP请求转发至本地机器其他端口的实现方法

Ubuntu系统VPS将25端口SMTP请求转发至本地机器其他端口的实现方法

嘿,这个需求我之前帮朋友折腾过,Ubuntu VPS上实现SMTP端口转发其实没那么复杂,咱们一步步来搞定:

前提确认

  • 先确保你的VPS服务商没有封禁25端口(大部分正规VPS默认开放,但有些需要手动申请解封,你可以用telnet your-vps-ip 25测试,能连接就没问题)
  • 本地机器需要有公网可访问的IP(如果是内网机器,得在路由器上做端口映射,把目标端口比如587映射到本地机器的内网IP)
  • 本地机器的防火墙要允许目标端口(比如587)的TCP入站流量

方法一:用iptables实现内核级端口转发(高效稳定)

这是最推荐的方式,因为是内核层面的转发,性能损耗极低。

  1. 开启IP转发功能
    Ubuntu默认关闭了IP转发,咱们先打开它:
  • 编辑sysctl配置文件:sudo nano /etc/sysctl.conf
  • 找到net.ipv4.ip_forward=1这一行,把前面的注释符号#去掉
  • 保存退出后,让配置生效:sudo sysctl -p
  1. 添加iptables转发规则
    假设你的本地机器公网IP是123.45.67.89,要把VPS的25端口转发到本地的587端口(SMTP常用替代端口),执行以下命令:
  • 转发入站25端口流量到本地机器:
    sudo iptables -t nat -A PREROUTING -p tcp --dport 25 -j DNAT --to-destination 123.45.67.89:587
  • 配置返回流量的路由,确保本地机器的响应能回到VPS:
    sudo iptables -t nat -A POSTROUTING -p tcp -d 123.45.67.89 --dport 587 -j MASQUERADE
  1. 保存规则防止重启失效
    默认iptables规则重启后会丢失,咱们把它保存下来:
  • 先创建保存目录(如果没有的话):sudo mkdir -p /etc/iptables
  • 保存规则:sudo iptables-save > /etc/iptables/rules.v4
  • 安装iptables持久化工具,确保开机自动加载规则:
    sudo apt update && sudo apt install iptables-persistent
    安装过程中会提示是否保存现有规则,选Yes即可。

方法二:用socat实现灵活转发(适合动态IP场景)

如果你的本地机器是动态IP(比如家用宽带),iptables的静态规则会失效,这时候用socat更灵活,配合动态域名就能解决。

  1. 安装socat
    sudo apt update && sudo apt install socat

  2. 临时启动转发
    假设你已经有了动态域名(比如my-home-domain.com),要转发到本地的587端口,执行:
    socat TCP-LISTEN:25,reuseaddr,fork TCP:my-home-domain.com:587
    这个命令会在前台运行,关闭终端就停止了,适合测试用。

  3. 设置开机自启
    要让socat开机自动运行,咱们创建一个systemd服务:

  • 编辑服务文件:sudo nano /etc/systemd/system/socat-smtp-forward.service
  • 粘贴以下内容(记得替换成你的动态域名和目标端口):
[Unit]
Description=Socat SMTP Port Forwarder
After=network.target

[Service]
ExecStart=/usr/bin/socat TCP-LISTEN:25,reuseaddr,fork TCP:my-home-domain.com:587
Restart=always
User=root

[Install]
WantedBy=multi-user.target
  • 保存退出后,重新加载systemd配置:sudo systemctl daemon-reload
  • 启用并启动服务:sudo systemctl enable --now socat-smtp-forward.service
  • 可以用sudo systemctl status socat-smtp-forward.service检查服务状态。

测试与验证

完成配置后,咱们测试一下转发是否生效:

  • 在任意机器上执行telnet your-vps-ip 25,如果能看到本地SMTP服务的欢迎信息,说明转发成功了。
  • 也可以用nc -zv your-vps-ip 25来测试端口连通性。

注意事项

  • 安全问题:SMTP默认是明文传输,建议你在本地SMTP服务上配置TLS加密(比如用587端口加STARTTLS),避免邮件内容被窃取。
  • 端口冲突:确保VPS上的25端口没有被其他服务占用(比如postfix),如果有,先停止对应的服务:sudo systemctl stop postfix && sudo systemctl disable postfix
  • 动态IP更新:如果用socat配合动态域名,要确保动态域名的解析能实时更新IP,不然转发会失效。

备注:内容来源于stack exchange,提问作者dani

火山引擎 最新活动