SVN 服务器没有响应

SVN 服务器没有响应

我整天都在为这个问题而绞尽脑汁,如果能有更多的人关注我手头的问题,我将非常感激。

我们拥有一个内部 SVN 服务器,其中包含我们网站的所有实时和开发代码。我们的实时服务器可以连接到此服务器并从存储库获取更新。

一切都运行正常,直到我们将 SVN 服务器从物理机迁移到 vSphere VM。现在,由于某种我一直搞不明白的原因,我们无法再连接到 SVN 服务器。

SVN 服务器运行 CentOS 6.2、Apache 和 SVN 1.7.2。SELinux 确实被禁用,当 iptables 停止时问题仍然存在。

我们的生产服务器确实运行着旧版本的 CentOS 和 SVN,但是相同的系统以前也能运行,所以我不认为这是问题所在。

值得注意的是,如果我启用了 iptables,使用 service iptables status,我可以看到一个数据包进来并被接受,但生产服务器只是挂在任何 svn 命令上。如果我放弃等待并执行 CTRL-C 来中断该过程,我会得到“无法连接到服务器”的信息。

对我来说,这似乎与 SVN 服务器拒绝外部连接有关,但我不知道这是如何发生的。

关于我可以从这里尝试什么,有什么想法吗?

谢谢,罗布

编辑:网络拓扑生产服务器位于我们内部 SVN 服务器的外部。我们的 IPCop (?) 防火墙允许来自它(仅它)在端口 80 上的连接,并将连接传递到 SVN 服务器。硬件都相当不错,我毫不怀疑它能正确地完成工作,尤其是当 iptables 看到新连接时。

subversion.conf(位于 /etc/httpd/conf.d 中)

LoadModule dav_svn_module     modules/mod_dav_svn.so
<Location /repos>
   DAV svn
   SVNPath /var/svn/repos

   <LimitExcept PROPFIND OPTIONS REPORT>
      AuthType Basic
      AuthName "SVN Server"
      AuthUserFile /var/svn/svn-auth
      Require valid-user
   </LimitExcept>
</Location>

是否配置

eth0      Link encap:Ethernet  HWaddr 00:0C:29:5F:C8:3A
          inet addr:172.16.0.14  Bcast:172.16.0.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe5f:c83a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:32317 errors:0 dropped:0 overruns:0 frame:0
          TX packets:632 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2544036 (2.4 MiB)  TX bytes:143207 (139.8 KiB)

网络状态监测

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      1484/mysqld
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1135/rpcbind
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1351/sshd
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1230/cupsd
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1575/master
tcp        0      0 0.0.0.0:58401               0.0.0.0:*                   LISTEN      1153/rpc.statd
tcp        0      0 0.0.0.0:5672                0.0.0.0:*                   LISTEN      1626/qpidd
tcp        0      0 :::139                      :::*                        LISTEN      1678/smbd
tcp        0      0 :::111                      :::*                        LISTEN      1135/rpcbind
tcp        0      0 :::80                       :::*                        LISTEN      1615/httpd
tcp        0      0 :::22                       :::*                        LISTEN      1351/sshd
tcp        0      0 ::1:631                     :::*                        LISTEN      1230/cupsd
tcp        0      0 ::1:25                      :::*                        LISTEN      1575/master
tcp        0      0 :::445                      :::*                        LISTEN      1678/smbd
tcp        0      0 :::56799                    :::*                        LISTEN      1153/rpc.statd

iptables --list -v -n (当 iptables 停止时)

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

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

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

iptables --list -v -n (当 iptables 运行时,尝试一次 svn 连接后)

Chain INPUT (policy ACCEPT 68 packets, 6561 bytes)
 pkts bytes target     prot opt in     out     source               destination
   19  1304 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
    1    60 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW udp dpt:80

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

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

tcpdump

17:08:18.455114 IP 'production server'.43255 > 'svn server'.local.http: Flags [S], seq 3200354543, win 5840, options [mss 1380,sackOK,TS val 2011458346 ecr 0,nop,wscale 7], length 0
17:08:18.455169 IP 'svn server'.local.http > 'production server'.43255: Flags [S.], seq 629885453, ack 3200354544, win 14480, options [mss 1460,sackOK,TS val 816478 ecr 2011449346,nop,wscale 7], length 0
17:08:19.655317 IP 'svn server'.local.http > 'production server'k.43255: Flags [S.], seq 629885453, ack 3200354544, win 14480, options [mss 1460,sackOK,TS val 817679 ecr 2011449346,nop,wscale 7], length 0

答案1

(我认为你应该用来自 httpd.conf 的 SVN 配置的完整详细信息以及ifconfig输出和netstat -lntp一些 pastebin 来更新你的问题)

但是如果您执行以下操作...

[root@workstation001 ~]# iptables --flush             <---  flush rules
[root@workstation001 ~]# iptables --list -n -v
Chain INPUT (policy ACCEPT 17 packets, 2792 bytes)    <---  is default policy ACCEPT?
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

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


[root@workstation001 ~]# setenforce 0
setenforce: SELinux is disabled               <---  f**k off selinux

你这样做来宾和 VM 主机而您仍然无法连接,那么问题就不在于 iptables 或 selinux。

因此,您可以继续检查问题的每个阶段,像这样......

检查您是否可以解析 svn 服务器主机名;

[root@workstation001 ~]# dig svn.somehost.co.uk +short
www.somehost.co.uk.
209.135.17.202       <---  resolved!!

您能 ping 通该 IP 吗?

ping 209.135.17.202
PING 209.135.17.202 (209.135.17.202) 56(84) bytes of data.
64 bytes from 209.135.17.202: icmp_req=1 ttl=50 time=132 ms <---  reply!
....

(假设您的 svn 使用 mod_svn_dav apache 模块公开...)

您能否通过端口 80 连接到该服务器?

[root@workstation001 ~]# telnet svn.liepaper.co.uk 80
Trying 209.135.17.202...
Connected to svn.liepaper.co.uk.          <---  connected!
Escape character is '^]'.
^]
telnet> 

您能否连接到 httpd 服务器并获取服务器字符串...(您可以使用 curl、netcat、telnet 或任何您选择的 TCP 连接工具)

[root@workstation001 ~]# wget -O- --server-response http://svn.liepaper.co.uk
--2012-03-20 16:16:06--  http://svn.liepaper.co.uk/
Resolving svn.liepaper.co.uk... 209.135.17.202
Connecting to svn.liepaper.co.uk|209.135.17.202|:80... connected.
HTTP request sent, awaiting response... 
  HTTP/1.1 401 Authorization Required
  Date: Tue, 20 Mar 2012 16:16:06 GMT
  Server: Apache                    <---  server header value
  WWW-Authenticate: Basic realm="Authorization Realm"
  Content-Length: 401
  Keep-Alive: timeout=5, max=100
  Connection: Keep-Alive
  Content-Type: text/html; charset=iso-8859-1
Authorization failed.

然后像这样尝试用户名/密码;

wget -O- --server-response --user=mysvnuser --password=mokeypoke http://svn.liepaper.co.uk/projects/admin/

应该包括类似的内容;

HTTP/1.1 200 正常

然后尝试命令行 svn 工具来查看它们是否建立连接;

[root@workstation001 ~]# svn list --username=mysvnuser --password=mokeypoke http://svn.liepaper.co.uk/projects/admin/
mystupidcode/
anotherwasteofcomputer/
cantprogrammefortoffee/

基本上,如果您到这里发现 svn 正在运行,那么就是客户端工具或代理配置错误了……等等……

需要考虑的一件事是代理会弄乱标题,而且 Windows 7 不喜欢基本身份验证,因此您可能需要实现摘要式身份验证或一些自签名 SSL 来绕过您的 VM、某些代理或 windoze 网络工作以破坏您的 svn 连接。(在您知道问题是什么之前,请不要尝试任何这些......)


此外,REJECT 规则上的所有命中都表明您可能甚至不会尝试通过端口 80 连接到 SVN。

 8    26840 2356K REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

在该规则之前添加另一条带有 LOG 行的规则,以便将这些数据包转储到系统日志;

itpables  -A INPUT 8 -j LOG --log-prefix "LOGDROP: "

将“8”更改为 INPUT 链的正确规则编号....然后在 /var/log 中查找 kern.log 或 syslog 配置为发送 iptables 日志的任何日志文件。(这应该是显而易见的,因为它很快就会变得非常庞大)

相关内容