我整天都在为这个问题而绞尽脑汁,如果能有更多的人关注我手头的问题,我将非常感激。
我们拥有一个内部 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 日志的任何日志文件。(这应该是显而易见的,因为它很快就会变得非常庞大)