服务仅侦听 127.0.0.1 端口 1025。如何允许本地网络上的任何计算机与此服务通信?

服务仅侦听 127.0.0.1 端口 1025。如何允许本地网络上的任何计算机与此服务通信?

首先我要说的是,我已经在互联网上进行了搜索,甚至包括我购买该软件的公司,而且已经 5 个月了!因此,我转向社区,因为我的眼睛和大脑因阅读和长时间的尝试而流血,却一无所获。简而言之,这可以吗,可以。显然我太愚蠢了,无法做到这一点,但至少我现在对 iptables 有大量的了解:-)

我的要求:我使用 protonmail 作为我的电子邮件。如果您不知道,它是如此安全,以至于您必须在每台需要发送/接收电子邮件的计算机上运行一个“桥接软件”。我只是想向我自己发送电子邮件,用于我的智能家居、摄像头、警报等。正如您可以想象的那样,我无法在 20 台设备上安装此软件,更不用说摄像头了!所以我需要一个运行这个软件的 Linux 服务器来充当电子邮件“中心”

我的网络是 192.168.10.0/24 没有 VLAN,没有复杂性(pfsense 作为我的路由器/防火墙)

我使用 mxlinux / debian 作为我的“电子邮件主机” 192.168.10.106 IMAP 正在侦听端口 1143 SMTP 正在侦听端口 1025

我想做的就是让我网络上的任何设备都可以使用 192.168.10.106 在端口 1025 上使用 SMTP 发送电子邮件。我以为这很容易..但是不,只是因为该死的软件只会侦听 127.0.0.1 !!!我无法将其更改为 0.0.0.0 等。

首先你应该知道我直接联系了 protonmail,因为它是一项付费电子邮件服务,他们实际上拥有知道他们在做什么并与你交谈的技术人员。然而,他们认为允许他们的服务监听 0.0.0.0 存在“安全风险”,因此代码不允许对此进行更改。我在“电子邮件服务器/192.168.10.106”上执行了以下操作

  1. 编辑/etc/sysctl.conf并取消注释#net.ipv4.ip_forward=1 前面的内容

  2. 更新iptables

    sudo iptables -t nat -A PREROUTING -i eth0 -p tcp -s 192.168.10.0/24 --dport 1025 -j DNAT --to-destination 127.0.0.1:1025 
    sudo iptables -t nat -A POSTROUTING -o lo -p tcp --dport 1025 -j SNAT --to-source 192.168.10.106
    sudo iptables -A FORWARD -i eth0 -o lo -p tcp --dport 1025 -j ACCEPT
    
  3. 让我的条目在重新启动时保存,它会询问我是否要保存上面的表格,我需要说是,所以我会:

    sudo apt install iptables-persistent
    
  4. 进入MX“防火墙配置”,关闭“公共、私人和办公室”,基本关闭防火墙

  5. 重新启动计算机

好的,现在列出重新启动后的情况,如下所示。我尝试从网络 192.168.10.50 上的 Windows 计算机进行 telnet,如您所见,我看到了数据包,但它不起作用:-( :-( :-( :-( :-( :-( :-( :- ( :-( :-( :-(

sudo iptables -t nat -L -n -v
Chain PREROUTING (policy ACCEPT 15748 packets, 1719K bytes)
 pkts bytes target     prot opt in     out     source               destination
    5   260 DNAT       tcp   --  eth0  *       192.168.10.0/24      0.0.0.0/0 tcp dpt:1025 to:127.0.0.1:1025

Chain INPUT (policy ACCEPT 15748 packets, 1719K bytes)
 pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 730 packets, 73256 bytes)
 pkts bytes target prot opt in out source destination

Chain POSTROUTING (policy ACCEPT 730 packets, 73256 bytes)
 pkts bytes target     prot opt in     out     source               destination

    0     0 SNAT       tcp  --  *      lo      0.0.0.0/0            0.0.0.0/0 tcp dpt:1025 to:192.168.10.106

这是我在本地主机电子邮件计算机上测试该服务

$ telnet 127.0.0.1 1025
Trying 127.0.0.1... Connected to 127.0.0.1.
Escape character is '^]'.
220 127.0.0.1 ESMTP Service Ready

注意 eth0 接收端丢弃的数据包

$ uname -a
Linux email 5.10.0-23-amd64 #1 SMP Debian 5.10.179-2 (2023-07-14) x86_64 GNU/Linux

bob@email:~ $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
        inet 192.168.10.106 netmask 255.255.255.0 broadcast 192.168.10.255
        ether 00:0c:29:63:d5:4f txqueuelen 1000 (Ethernet)
        RX packets 126620 bytes 24077186 (22.9 MiB)
        RX errors 0 dropped 6447 overruns 0 frame 0
        TX packets 30080 bytes 3728557 (3.5 MiB)
        TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
        inet 127.0.0.1 netmask 255.0.0.0
        loop txqueuelen 1000 (Local Loopback)
        RX packets 57 bytes 4931 (4.8 KiB)
        RX errors 0 dropped 0 overruns 0 frame 0
        TX packets 57 bytes 4931 (4.8 KiB)
        TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

以上都不起作用,所以我尝试了不同的变体。我还发现一个建议我使用的命令似乎没有帮助,但还是尝试了一下。

sysctl -w net.ipv4.conf.eth0.route_localnet=1

答案1

另一种方法是使用应用程序转发器。不需要iptables或内核级转发。在这个例子中我使用了socat,但也可能存在其他可能性。这里允许的源 IP 地址集被定义为应用程序参数。

socat TCP-LISTEN:1025,fork,range=192.168.10.0/24,reuseaddr,bind=192.168.10.106 TCP4:127.0.0.1:1025

在这里,我们有两组论点:

  1. 收听地址

    • LISTEN:1025- 监听此端口
    • fork- 分叉一个子进程来处理每个入站请求
    • range=192.168.10.0/24- 接受来自该网络范围内的设备的请求
    • reuseaddr- 允许快速重用地址/端口元组
    • bind=192.168.10.106- 收听此地址(您的eth0
  2. 转发/中继地址

    • TCP4:127.0.0.1:1025- 中继到此地址:端口

相关内容