0

我已经构建了一个应用程序(在 PHP 中)来遍历我已配置的数据库列表并单独连接到那些远程数据库(端口 3306 上的标准 MySQL)并从这些数据库中获取我的应用程序的相关数据。

但是,其中一些连接只是“冻结”了,最终在远程“xxxx”等上提供了一个无法连接到 MySQL 的信息。

经过进一步调查,我可以看到 iptables 正在接受端口 3306 的输入和输出,并且我可以以相同的方式从其他一些服务器连接,而我的应用服务器不能。我已经检查了 mysql 的配置,以便从所有主机等进行远程访问。--skip-netwokring 已被注释掉,因此应该能够远程连接,--skip-name-resolve 也在其中以避免尝试解析 ip进入 DNS 名称,实际上我可以从其他几台服务器连接,但不能从应用服务器连接(正如我刚才所说)

所以,这是我的理论以及我需要帮助的地方。比方说,以下内容:

应用服务器:(centOs)连接到所有远程数据库并为应用获取数据。RDNS 是x1.somedomain.com

数据库 1:(centOs)保存数据。RDNS 是x2.somedomain.com

数据库 2:(Debian)保存数据。RDNS 是someotherdomain.com

应用服务器连接到数据库 1 时出现问题。作为一种调试方法,我尝试 telnet 3306 并从应用服务器 ping 到 db 1,但没有任何响应。如果我从 db 2 到 db 1 做同样的事情,它就可以工作。如果我执行相反的操作并从 db 1 远程登录和 ping 到应用程序服务器,它仍然无法正常工作,但如果我从 db 1 远程登录并 ping 到 db 2,那么它就可以正常工作(反之亦然)。

我也尝试过从其他 linux 操作系统中从虚拟机中执行相同的调试方法,并且效果很好。因此,这表明只剩下一件事,那就是应用程序服务器甚至不发送请求,因为它以某种方式查看 tld 并“认为”它不是远程连接并创建某种环回错误或接收服务器检查请求服务器的 IP 并拒绝它,因为它意识到这是一个远程请求,但 tld 与 localhost 相同,因此拒绝。

我整个周末都在努力解决这个问题,在系统日志上找不到答案,所以我希望有人能给我一些解决这个问题的见解,并指出我需要做些什么来解决它并让数据库 1 响应数据对于应用服务器。

非常感谢。

编辑:

  • 服务器不使用除 iptables 之外的任何安全性,因此不太确定锁定将如何发生。

应用服务器 iptables:

# Generated by iptables-save v1.4.7
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT 
-A INPUT -s x.x.x.x/x -p udp -m udp --dport 161 -m state --state NEW -j ACCEPT 
-A INPUT -s x.x.x.x/x -p udp -m udp --dport 161 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT 
-A INPUT -p udp -m udp --dport 53 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 53 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 25 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 110 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 143 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 20 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 21 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 3306 -m state --state NEW -j ACCEPT 
-A INPUT -p udp -m udp --dport 3306 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 10000 -j ACCEPT 
-A INPUT -j REJECT --reject-with icmp-port-unreachable 
-A OUTPUT -o lo -j ACCEPT 
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A OUTPUT -m state --state NEW -j ACCEPT 
COMMIT
*mangle
:FORWARD ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed
*nat
:OUTPUT ACCEPT [0:0]
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed

DB1 iptables:

# Generated by iptables-save v1.3.5
*nat
:PREROUTING ACCEPT [57850:6391695]
:POSTROUTING ACCEPT [4275:348954]
:OUTPUT ACCEPT [4275:348954]
COMMIT
# Completed on Fri Sep 20 12:56:40 2013
# Generated by iptables-save v1.3.5
*mangle
:PREROUTING ACCEPT [299933:34182855]
:INPUT ACCEPT [299486:34132134]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [326963:298292395]
:POSTROUTING ACCEPT [326963:298292395]
COMMIT
# Completed on Fri Sep 20 12:56:40 2013
# Generated by iptables-save v1.3.5
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [65322:6355987]
-A INPUT -i lo -j ACCEPT 
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT 
-A INPUT -s x.x.x.x -p udp -m udp --dport 161 -m state --state NEW -j ACCEPT 
-A INPUT -s x.x.x.x -p udp -m udp --dport 161 -m state --state NEW -j ACCEPT 
-A INPUT -s x.x.x.x -p udp -m udp --dport 161 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT 
-A INPUT -p udp -m udp --dport 53 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 53 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 25 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 110 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 143 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 20 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 21 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 3306 -m state --state NEW -j ACCEPT 
-A INPUT -p udp -m udp --dport 3306 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 10000 -j ACCEPT 
-A INPUT -j REJECT --reject-with icmp-port-unreachable 
-A OUTPUT -o lo -j ACCEPT 
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A OUTPUT -m state --state NEW -j ACCEPT 
COMMIT
# Completed on Fri Sep 20 12:56:40 2013

编辑 2

找到解决方案。现在解决了。请参阅已接受的答案。

4

1 回答 1

0

感谢你的帮助。事实证明,一切都从一开始就设置正确,我得到的是非常奇怪的行为,因为它看起来应该可以工作,为什么我需要你的帮助。

不过,我现在终于想通了。事实证明,托管服务提供商确实将某些端口放在了防火墙后面,并且没有以任何方式向我说明这一点,因为该防火墙仅在同一托管服务提供商下的本地服务器之间特别活跃。因此,(因为 db1 和应用程序服务器)使用相同的托管服务提供商,它们无法相互连接,但 db2 可以(包括 ping 和 telnet),因为该服务器位于不同的托管服务提供商下。显然,主机提供商希望每台服务器每月额外支付 10 英镑,以便在应用服务器和 db1 服务器之间打开一个专用 LAN:/

解决方案; 我正在将应用服务器移动到不同的主机(并且总是仔细检查 LAN 上是否没有防火墙,因为我的困惑是 WAN 上没有防火墙但 LAN 上有防火墙)。

感谢所有的帮助。

于 2013-09-24T11:45:14.537 回答