目前,我正在尝试对电子邮件服务器进行故障排除,该服务器允许用户发送电子邮件,但不能登录到服务器 (POP3) 或使用 Outlook 客户端接收电子邮件。以前这是可行的,但将服务器移动到当前位置就破坏了它。出于明显的原因,我怀疑是防火墙导致了问题。
首先,这是我对防火墙进行任何更改之前握手(或尝试)的样子:
- 邮件服务器:192.168.25.26
客户:192.168.25.50
Source | Destination | PROTO | INFO 192.168.25.50 192.168.25.26 TCP 50861 > pop3 [SYN] seq=0 win=65535 len=0 192.168.25.26 192.168.25.50 TCP pop3 > 58601 [RST, ACK] seq=1 win=1 len=0 192.168.25.50 192.168.25.26 TCP [TCP Retransmission] 58061 > pop3 [Syn] etc....
并且 [rst, ack]、[tcp 重新传输] 舞蹈在失败之前再次发生。
防火墙(Cisco)关于192.168.25.26和POP3的规则如下:
里面: source | destination | service
any 192.168.25.0/24 tcp/pop3
192.168.25.0/24 any tcp/smtp
208.105.121.196
外部:
source | destination | service
any 192.168.25.26 tcp/pop3
any tcp/smtp
对我来说,这看起来不错。可以肯定的是,在电子邮件服务器(Zentyal)上我运行了以下命令:
(IP表配置得很重。我怀疑问题出在这里。有什么方法可以允许全部流量,只是为了测试?)
sudo iptables -F
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
但是,仍然没有 Outlook 连接能力。此时,我在电子邮件服务器上运行了命令:
telnet 127.0.0.1 110
并能够登录邮件服务器。从网络内部的客户端,我运行了相同的命令,并被告知“连接失败”。
进行这些更改后,当我尝试在 Outlook 中“测试设置”时,握手过程如下所示。我注意到一些奇怪的事情。
Source | Destination | PROTO | INFO
192.168.25.50 192.168.25.26 TCP apollo-status > pop3 [SYN] seq=0 win=65535 len=0
192.168.25.26 192.168.25.50 TCP pop3 > apollo-status [RST, ACK] seq=1 win=1 len=0
192.168.25.50 192.168.25.26 TCP [TCP Retransmission] apollo-status > pop3 [Syn] etc....
和上次一样,它又做了两次。在信息窗格中,我现在看到 apollo-status 而不是端口号。接下来的两次我运行它,我分别看到了 npep_messaging 和 synapse。我怀疑这些是 dovecot 选择的随机端口,因为在 dovecot.config 中,我将默认侦听器从先前指定的端口更改为星号“*”,这似乎是 4,000 年代的任意端口,并且在防火墙。
只是为了确认,它每次使用的端口似乎都根据(推荐的)配置而变化。在环回接口端口 110 上显然有一个侦听器连接到它,但从另一台计算机来看,它似乎已关闭。
任何帮助根本不受到赞赏。我为此绞尽脑汁,希望这个社区能有一些新奇的想法。
答案1
所以 RST 消息不应该吓到你。每当您尝试访问受防火墙保护的服务或操作系统告诉您没有此类服务正在侦听此端口时,就会发生这种情况(顺便说一句,traceroute 使用此技巧来找出 Traceroute 何时需要停止其探测。)。
让我们看一下我的盒子上TCP套接字处于Listen状态的情况
❯ netstat -an | grep LISTEN [11:49:58 PM]
tcp4 0 0 *.9100 *.* LISTEN
tcp4 0 0 *.17500 *.* LISTEN
tcp4 0 0 127.0.0.1.8021 *.* LISTEN
tcp6 0 0 ::1.8021 *.* LISTEN
tcp4 0 0 127.0.0.1.3306 *.* LISTEN
tcp4 0 0 *.22 *.* LISTEN
tcp6 0 0 *.22 *.* LISTEN
tcp4 0 0 127.0.0.1.631 *.* LISTEN
tcp6 0 0 ::1.631 *.* LISTEN
因此,让我们尝试连接到一个不存在的服务,同时窥探我的本地流量。
❯ nc -v -z 127.0.0.1 12002 [11:50:12 PM]
nc: connectx to 127.0.0.1 port 12002 (tcp) failed: Connection refused
这是操作系统告诉我这里没有这样的服务。防火墙以完全相同的方式伪造它(当您使用 REJECT 目的地时,效果很好。目的地 DROP 只是 /dev/null 您的流量)。
❯ sudo tshark -i lo -s0 [11:50:04 PM]
Capturing on 'Loopback'
1 0.000000 127.0.0.1 -> 127.0.0.1 TCP 68 54188→12002 [SYN] Seq=0 Win=65535 Len=0 MSS=16344 WS=32 TSval=688032360 TSecr=0 SACK_PERM=1
2 0.000063 127.0.0.1 -> 127.0.0.1 TCP 44 12002→54188 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0
连接到活动端口会导致 TCP 握手和拆卸舞蹈
❯ nc -v -z 127.0.0.1 8021 [11:50:23 PM]
found 0 associations
found 1 connections:
1: flags=82<CONNECTED,PREFERRED>
outif lo0
src 127.0.0.1 port 54190
dst 127.0.0.1 port 8021
rank info not available
TCP aux info available
以及相关的网络流量:
3 11.123990 127.0.0.1 -> 127.0.0.1 TCP 68 54190→8021 [SYN] Seq=0 Win=65535 Len=0 MSS=16344 WS=32 TSval=688043453 TSecr=0 SACK_PERM=1
4 11.124082 127.0.0.1 -> 127.0.0.1 TCP 68 8021→54190 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=16344 WS=32 TSval=688043453 TSecr=688043453 SACK_PERM=1
5 11.124091 127.0.0.1 -> 127.0.0.1 TCP 56 54190→8021 [ACK] Seq=1 Ack=1 Win=408288 Len=0 TSval=688043453 TSecr=688043453
6 11.124099 127.0.0.1 -> 127.0.0.1 TCP 56 [TCP Window Update] 8021→54190 [ACK] Seq=1 Ack=1 Win=408288 Len=0 TSval=688043453 TSecr=688043453
7 11.136377 127.0.0.1 -> 127.0.0.1 TCP 56 54190→8021 [FIN, ACK] Seq=1 Ack=1 Win=408288 Len=0 TSval=688043464 TSecr=688043453
8 11.136406 127.0.0.1 -> 127.0.0.1 TCP 56 8021→54190 [ACK] Seq=1 Ack=2 Win=408288 Len=0 TSval=688043464 TSecr=688043464
9 11.136415 127.0.0.1 -> 127.0.0.1 TCP 56 [TCP Dup ACK 7#1] 54190→8021 [ACK] Seq=2 Ack=1 Win=408288 Len=0 TSval=688043464 TSecr=688043464
10 11.263097 127.0.0.1 -> 127.0.0.1 TCP 56 8021→54190 [FIN, ACK] Seq=1 Ack=2 Win=408288 Len=0 TSval=688043587 TSecr=688043464
11 11.263126 127.0.0.1 -> 127.0.0.1 TCP 56 54190→8021 [ACK] Seq=2 Ack=2 Win=408288 Len=0 TSval=688043587 TSecr=688043587
那么你如何解决你的问题呢?
确保您的套接字正在侦听外部可见端口 (*:port_number)
❯ netstat -an | grep LISTEN [11:49:58 PM]
tcp4 0 0 *.9100 *.* LISTEN <<< COOL
tcp4 0 0 *.17500 *.* LISTEN
tcp4 0 0 127.0.0.1.8021 *.* LISTEN <<< NOT COOL
从最简单的防火墙或无防火墙开始,从同一 LAN 上的远程设备连接到服务端口。记得在服务器端通过 sysctl 打开 iptables 转发内核标志
sudo iptables -n -L -X -v
sudo tshark -i eth0 -s0 port 110
在客户端
sudo tshark -i eth0 -s0 port 110
nc -v -z mailserver.example.org 110
比较两端的 tshark 输出非常重要,以确保您发送的内容正是到达远程盒子的内容