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实现内核级端口转发(高效稳定)
这是最推荐的方式,因为是内核层面的转发,性能损耗极低。
- 开启IP转发功能
Ubuntu默认关闭了IP转发,咱们先打开它:
- 编辑sysctl配置文件:
sudo nano /etc/sysctl.conf - 找到
net.ipv4.ip_forward=1这一行,把前面的注释符号#去掉 - 保存退出后,让配置生效:
sudo sysctl -p
- 添加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
- 保存规则防止重启失效
默认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更灵活,配合动态域名就能解决。
安装socat
sudo apt update && sudo apt install socat临时启动转发
假设你已经有了动态域名(比如my-home-domain.com),要转发到本地的587端口,执行:socat TCP-LISTEN:25,reuseaddr,fork TCP:my-home-domain.com:587
这个命令会在前台运行,关闭终端就停止了,适合测试用。设置开机自启
要让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




