===
问题描述:虚拟机B里firefox无法通过虚拟路由A浏览网页。
===
环境描述:
Host里安装了kvm(libvirt)虚拟机,在虚拟机A里安装了pfsense2.3.4-amd64,双网卡,wan类型是macvtap桥接,lan类型是隔离/仅内部和主机路由,没做其它设置;ping www.sohu.com可以ping通:
===
虚拟机B安装了archlinux,网卡类型设置为隔离/仅内部和主机路由,dhcp,得到的地址为192.168.100.4;手动设定gateway为上面虚拟机A的lan地址:192.168.100.100;ping www.sohu.com可以ping通:
===
虚拟机B里打开firefox,无法打开www.sohu.com,页面为空,无任何提示;
把虚拟机B关掉,改网上类型为NAT,删除gateway设定,则firefox可以正常浏览网页。
下面我应该从什么地方下手排除问题?
===
最近编辑记录 驿窗 (2017-08-09 19:46:59)
开源/Linux大众化,从驿窗开始~
离线
使用 curll -v 或者 wget 试试,获知具体发生了什么。
在线
===
我试下先。
===
开源/Linux大众化,从驿窗开始~
离线
===
试了一下,
第一步,设定虚拟机B网卡模式为NAT,wget可以正常下载文件,过程非常快:
===
第二步,设定虚拟机B网卡模式为“隔离网络,仅使用内部和主机路由”,启动后修改gateway:
sudo ip route add default via 192.168.100.100
能ping 通sohu.com,wget提示连接,然后就一直不动:
===
虚拟路由没做任何改动,看起来像是能解析ip,但连接不上......
接下来我应该怎么做?
.
开源/Linux大众化,从驿窗开始~
离线
你为什么 ping 和 wget 的是不同的地址……
host 上有做什么网络设置吗?
在线
看你说我才明白,用不同地址太不严谨;我又在虚拟机B里面 ping 了一下wget下载的地址,可以ping通:
ping mirror.rackspace.com ===> OK
执行wget http://mirror.rackspace.com/archlinux/i … 1sums.txt,
故障仍是 connecting to mirror.rackspace.com... ... 然后不动;
===
下面是host环境:
host网络设置的话,时间有点久,具体记不太清楚,不过主要应该就是用GUFW设置了一些规则;
代理肯定没设置过,DNS加密也没做过设置,删过一些证书;
不过在测试虚拟机B的时候,我通常都会把GUFW关闭;
刚才我又确认了一下:
sudo ufw status ===> inactive
systemctl status iptables ===> inactive(dead)
确保以上两条以后,测试虚拟机B联网,故障表现是一样的,这样可以排除host里网络问题么?
下面是systemctl --type=service内容,不算多:
开源/Linux大众化,从驿窗开始~
离线
贴一下以下命令的输出:
iptables -vnL
iptables -vnL -t nat
ip r
在线
另外你的 rackspace 的域名解析出来有好几个 IP,它们的表现都一样吗?
在线
三个命令输出的内容:
=====1=====
14:25 peter@H ~$ 1
[>>>:] sudo iptables -vnL
[sudo] peter 的密码:
Chain INPUT (policy ACCEPT 2883 packets, 149K bytes)
pkts bytes target prot opt in out source destination
382 28028 ACCEPT udp -- virbr1 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
0 0 ACCEPT tcp -- virbr1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
22 8396 ACCEPT udp -- virbr1 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
0 0 ACCEPT tcp -- virbr1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
1587 101K ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
31 11251 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
24419 1885K ufw-before-logging-input all -- * * 0.0.0.0/0 0.0.0.0/0
24419 1885K ufw-before-input all -- * * 0.0.0.0/0 0.0.0.0/0
11216 1194K ufw-after-input all -- * * 0.0.0.0/0 0.0.0.0/0
9728 516K ufw-after-logging-input all -- * * 0.0.0.0/0 0.0.0.0/0
9728 516K ufw-reject-input all -- * * 0.0.0.0/0 0.0.0.0/0
9728 516K ufw-track-input all -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
109 35752 ACCEPT all -- virbr1 virbr1 0.0.0.0/0 0.0.0.0/0
9 585 REJECT all -- * virbr1 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- virbr1 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
45811 60M ACCEPT all -- * virbr0 0.0.0.0/0 192.168.122.0/24 ctstate RELATED,ESTABLISHED
48404 6615K ACCEPT all -- virbr0 * 192.168.122.0/24 0.0.0.0/0
0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0
0 0 REJECT all -- * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 ufw-before-logging-forward all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ufw-before-forward all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ufw-after-forward all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ufw-after-logging-forward all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ufw-reject-forward all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ufw-track-forward all -- * * 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 2773 packets, 86991 bytes)
pkts bytes target prot opt in out source destination
22 7233 ACCEPT udp -- * virbr1 0.0.0.0/0 0.0.0.0/0 udp dpt:68
31 10175 ACCEPT udp -- * virbr0 0.0.0.0/0 0.0.0.0/0 udp dpt:68
24535 1167K ufw-before-logging-output all -- * * 0.0.0.0/0 0.0.0.0/0
24535 1167K ufw-before-output all -- * * 0.0.0.0/0 0.0.0.0/0
9445 330K ufw-after-output all -- * * 0.0.0.0/0 0.0.0.0/0
9445 330K ufw-after-logging-output all -- * * 0.0.0.0/0 0.0.0.0/0
9445 330K ufw-reject-output all -- * * 0.0.0.0/0 0.0.0.0/0
9445 330K ufw-track-output all -- * * 0.0.0.0/0 0.0.0.0/0
Chain ufw-after-forward (1 references)
pkts bytes target prot opt in out source destination
Chain ufw-after-input (1 references)
pkts bytes target prot opt in out source destination
Chain ufw-after-logging-forward (1 references)
pkts bytes target prot opt in out source destination
Chain ufw-after-logging-input (1 references)
pkts bytes target prot opt in out source destination
Chain ufw-after-logging-output (1 references)
pkts bytes target prot opt in out source destination
Chain ufw-after-output (1 references)
pkts bytes target prot opt in out source destination
Chain ufw-before-forward (1 references)
pkts bytes target prot opt in out source destination
Chain ufw-before-input (1 references)
pkts bytes target prot opt in out source destination
Chain ufw-before-logging-forward (1 references)
pkts bytes target prot opt in out source destination
Chain ufw-before-logging-input (1 references)
pkts bytes target prot opt in out source destination
Chain ufw-before-logging-output (1 references)
pkts bytes target prot opt in out source destination
Chain ufw-before-output (1 references)
pkts bytes target prot opt in out source destination
Chain ufw-reject-forward (1 references)
pkts bytes target prot opt in out source destination
Chain ufw-reject-input (1 references)
pkts bytes target prot opt in out source destination
Chain ufw-reject-output (1 references)
pkts bytes target prot opt in out source destination
Chain ufw-track-forward (1 references)
pkts bytes target prot opt in out source destination
Chain ufw-track-input (1 references)
pkts bytes target prot opt in out source destination
Chain ufw-track-output (1 references)
pkts bytes target prot opt in out source destination
14:25 peter@H ~$ 2
[>>>:]
=====2=====
14:26 peter@H ~$ 3
[>>>:] sudo iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 6395 packets, 1157K bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 1332 packets, 158K bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 1572 packets, 123K bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 1446 packets, 127K bytes)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- * * 192.168.122.0/24 224.0.0.0/24
2 656 RETURN all -- * * 192.168.122.0/24 255.255.255.255
1549 92940 MASQUERADE tcp -- * * 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
1482 114K MASQUERADE udp -- * * 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
9 756 MASQUERADE all -- * * 192.168.122.0/24 !192.168.122.0/24
14:26 peter@H ~$ 4
[>>>:]
=====3=====
14:28 peter@H ~$ 6
[>>>:] ip r
default via 192.168.3.1 dev enp0s25 src 192.168.3.3 metric 202
default via 192.168.100.1 dev virbr1 src 192.168.100.2 metric 206
192.168.3.0/24 dev enp0s25 proto kernel scope link src 192.168.3.3 metric 202
192.168.100.0/24 dev virbr1 proto kernel scope link src 192.168.100.2 metric 206
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
14:28 peter@H ~$ 7
=====end=====
开源/Linux大众化,从驿窗开始~
离线
另外你的 rackspace 的域名解析出来有好几个 IP,它们的表现都一样吗?
“表现一样”要怎么判断?是会自动更换IP么?
我这里不动了以后,就一直没有反应;每次我都是ctrl+c退出;
开源/Linux大众化,从驿窗开始~
离线
192.168.100.100 的以上三条命令的结果呢?
在线
192.168.100.100 的以上三条命令的结果呢?
是我前面没说清楚,192.168.100.100装的只有pfsense(基于freeBSD),不认iptables这个命令;
你是说问题出在pfsense里面?我研究研究。
开源/Linux大众化,从驿窗开始~
离线
哦。我也不怎么会 FreeBSD。目前看起来这奇怪的行为只能是那里了。ICMP 通畅,但是 TCP 被丢包或者不转发了。
在线
明白;
pfsense我也是刚开始弄,研究好了告诉你结果。
开源/Linux大众化,从驿窗开始~
离线
@仙子
虚拟机已经可以通过pfsense上网了;
结果确实如同你所说的,问题出在pfsense这个虚拟机里;
按pfsense官方论坛的解释,FreeBSD会drop掉那些没有checksum的packet;而在linux里,kvm虚拟机的网卡如果型号是VirtIO,则通过网卡的数据是不会checksum的,这是VirtIO技术的一个特性(e1000或者rtl8139两个型号没有这个问题),VirtIO认为经过虚拟机网卡的数据并没有经过实体物理网线,只是在shared memory里传输,所以VirtIO网卡不会对经过的数据包进行checksum;而这些没有checksum的数据包,全被FreeBSD给drop掉了,这就导致你说的:TCP被丢包 --- 主动丢包。
我的虚拟机B恰恰把网卡型号设置成了VirtIO,所以TCP包都被pfsense给drop掉了~
解决方案也很简单,关掉 tx checksum offloading就行,具体操作:用另一个虚拟机web登录pfsense,然后找到System>Advanced>Networking,向下找到Network Interfaces,确保下面三项disable框都是被勾选状态,再重启pfsense就可以:
- Hardware Checksum Offloading
- Hardware TCP Segmentation Offloading
- Hardware Large Receive Offloading
其实后面两项默认就是选中状态(pfsense version:2.3.4)。
======
我前前后后搜索了好久,最后是围绕“TCP 被丢包”这个主题列关键字才搜索到的这个结果,仙子,你的推断好精准~ 赞~~
再想想之前的神器strace,这就是linux运维专家的水准么?真材实料啊~
我啥时候才能达到这个水平啊... ...
===
开源/Linux大众化,从驿窗开始~
离线