如何排除无法转发 DNS 请求的 VPN 连接故障?
没有运行 VPN 的网络配置按预期工作。我有一个 Centos 前端,通过 IPTables 对出站请求进行 NAT。内部路由器(Cisco 2600)配置为
router-2600#show ip route
代码:-snipped-
最后的网关是 192.168.1.1 到网络 0.0.0.0192.168.200.0/26 is subnetted, 1 subnets
C 192.168.200.0 直接连接,FastEthernet0/0
S 192.168.1.0/24 [1/0] 通过 192.168.200.2
C 192.168.3.0/24 直接连接,FastEthernet1/0
S* 0.0.0.0/0 [1/0] 通过 192.168.1.1
Internet
192.168.200.0 192.168.3.0
+----------+ +-----------+ +------------+
| |.2 .1| |.1 .3| |
| +----------------+ +-----------------+ |
| IPTables | | Cisco | | Laptop |
| NAT/Masq | | 2600 | | |
+----------+ +-----------+ +------------+
此设置完全按照预期和期望工作。
但是,当我在 192.168.200.2 主机上运行 vpnc 时,基于 UDP 的功能似乎失败了。具体来说,我无法对位于 VPN 名称空间中的 DNS 服务器执行 DNS 请求,尽管我可以 ping 该主机。
eth0 Link encap:Ethernet HWaddr 00:E0:4C:77:4B:32
inet addr:192.168.200.2 Bcast:192.168.200.63 Mask:255.255.255.192
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:256616278 errors:0 dropped:0 overruns:0 frame:0
TX packets:428976874 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1941010246 (1.8 GiB) TX bytes:1236389787 (1.1 GiB)
Interrupt:169 Base address:0x8400
eth1 -snipped-
eth2 Link encap:Ethernet HWaddr 00:14:D1:2B:86:9F
inet addr:192.168.100.252 Bcast:192.168.100.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:546051427 errors:0 dropped:0 overruns:0 frame:0
TX packets:318999693 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1296057751 (1.2 GiB) TX bytes:3330532283 (3.1 GiB)
Interrupt:193 Base address:0xac00
lo -snipped-
tunvpn Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:172.31.252.222 P-t-P:172.31.252.222 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1412 Metric:1
RX packets:162 errors:0 dropped:0 overruns:0 frame:0
TX packets:249 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:13756 (13.4 KiB) TX bytes:14324 (13.9 KiB)
VPN配置脚本:
#!/bin/bash
IPT="/sbin/iptables"
ROUTE="/sbin/route"
INSIDE="eth0"
OUTSIDE="eth2"
SCRIPT_HOME=/opt/vpn-scripts
PIDFILE=${SCRIPT_HOME}/vpn.pid
if [ -e ${PIDFILE} ] && pgrep vpnc | grep $(cat ${PIDFILE}) ; then
echo vpnc is already running. Killing process. >> ${SCRIPT_HOME}/vpn.log
kill $(cat ${PIDFILE})
sleep 3
fi
cp /etc/resolv.conf ${SCRIPT_HOME}/resolv.conf.bak
/sbin/vpnc --debug 3 --pid-file ${PIDFILE} vpn 2>&1 >> ${SCRIPT_HOME}/vpn.log
cp ${SCRIPT_HOME}/resolv.conf.bak /etc/resolv.conf
$ROUTE del default dev tunvpn
$ROUTE add -net 172.31.252.0 netmask 255.255.255.0 dev tunvpn metric 50
echo "Deleting routes - clear previous entries"
$IPT -t nat -D POSTROUTING -o tunvpn -j MASQUERADE
$IPT -D FORWARD -i tunvpn -o $INSIDE -j ACCEPT
$IPT -D FORWARD -i $INSIDE -o tunvpn -j ACCEPT
echo "Creating routes"
$IPT -t nat -A POSTROUTING -o tunvpn -j MASQUERADE
$IPT -A FORWARD -i tunvpn -o $INSIDE -j ACCEPT
$IPT -A FORWARD -i $INSIDE -o tunvpn -j ACCEPT
在 Centos 服务器上运行的 TCP Dump 显示,发送到目标 DNS 服务器的请求没有返回。
另外,从 Centos 路由器,我可以查询内部 DNS 并获得响应。
但是,当我从 Cisco 2600 查询 DNS 服务器时,它会超时。(当路由器尝试查询时,Centos 服务器上的 TCPDump 显示:
[root@localhost:~] sudo tcpdump src 172.31.252.11 or dst 172.31.252.11
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
15:35:39.861291 IP 192.168.200.1.50242 > 172.31.252.11.domain: 46+ X25? internal.lab. (28)
15:35:42.862844 IP 192.168.200.1.55077 > 172.31.252.11.domain: 47+ A? internal.lab. (28)
15:35:45.861379 IP 192.168.200.1.55077 > 172.31.252.11.domain: 47+ A? internal.lab. (28)
15:35:48.861533 IP 192.168.200.1.55077 > 172.31.252.11.domain: 47+ A? internal.lab. (28)
)
答案1
我倾向于tcpdump
对任何我能接触到的东西都进行彻底检查;这通常将问题归结为防火墙或网络链接。tcpdump
不过,我不会运行我无法运行的设备,因此如果思科参与其中,你可能会遇到麻烦。
如果是网络链接出了问题,我通常会开始逐个更换组件,试图找出原因。对于防火墙问题,没有什么比一个好的工具能iptables -t raw -I OUTPUT -j TRACE
准确地告诉你防火墙在做什么——以及它做错了什么。