您尚未登录。

#1 2017-08-06 21:26:37

驿窗
驿窗
所在地: 基础开源研究
注册时间: 2016-06-03
帖子: 928
个人网站

(已解决)虚拟机/软路由可以ping外网,但无法通过软路由上网

===

问题描述:虚拟机B里firefox无法通过虚拟路由A浏览网页。


===
环境描述:

        Host里安装了kvm(libvirt)虚拟机,在虚拟机A里安装了pfsense2.3.4-amd64,双网卡,wan类型是macvtap桥接,lan类型是隔离/仅内部和主机路由,没做其它设置;ping www.sohu.com可以ping通


001

002
===



虚拟机B安装了archlinux,网卡类型设置为隔离/仅内部和主机路由,dhcp,得到的地址为192.168.100.4;手动设定gateway为上面虚拟机A的lan地址:192.168.100.100;ping www.sohu.com可以ping通

003
003

===

虚拟机B里打开firefox,无法打开www.sohu.com,页面为空,无任何提示;
把虚拟机B关掉,改网上类型为NAT,删除gateway设定,则firefox可以正常浏览网页。

下面我应该从什么地方下手排除问题?



===

最近编辑记录 驿窗 (2017-08-09 19:46:59)


开源/Linux大众化,从驿窗开始~

离线

#2 2017-08-06 22:40:37

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,919
个人网站

Re: (已解决)虚拟机/软路由可以ping外网,但无法通过软路由上网

使用 curll -v 或者 wget 试试,获知具体发生了什么。

离线

#3 2017-08-06 23:23:13

驿窗
驿窗
所在地: 基础开源研究
注册时间: 2016-06-03
帖子: 928
个人网站

Re: (已解决)虚拟机/软路由可以ping外网,但无法通过软路由上网

===


我试下先。


===


开源/Linux大众化,从驿窗开始~

离线

#4 2017-08-07 10:48:53

驿窗
驿窗
所在地: 基础开源研究
注册时间: 2016-06-03
帖子: 928
个人网站

Re: (已解决)虚拟机/软路由可以ping外网,但无法通过软路由上网

===

试了一下,
第一步,设定虚拟机B网卡模式为NAT,wget可以正常下载文件,过程非常快:

001

===

第二步,设定虚拟机B网卡模式为“隔离网络,仅使用内部和主机路由”,启动后修改gateway:

sudo ip route add default via 192.168.100.100

能ping 通sohu.com,wget提示连接,然后就一直不动:


002


===
虚拟路由没做任何改动,看起来像是能解析ip,但连接不上......
接下来我应该怎么做?


.


开源/Linux大众化,从驿窗开始~

离线

#5 2017-08-07 11:29:10

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,919
个人网站

Re: (已解决)虚拟机/软路由可以ping外网,但无法通过软路由上网

你为什么 ping 和 wget 的是不同的地址……

host 上有做什么网络设置吗?

离线

#6 2017-08-07 12:20:55

驿窗
驿窗
所在地: 基础开源研究
注册时间: 2016-06-03
帖子: 928
个人网站

Re: (已解决)虚拟机/软路由可以ping外网,但无法通过软路由上网

看你说我才明白,用不同地址太不严谨;我又在虚拟机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内容,不算多:

001


开源/Linux大众化,从驿窗开始~

离线

#7 2017-08-07 12:45:51

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,919
个人网站

Re: (已解决)虚拟机/软路由可以ping外网,但无法通过软路由上网

贴一下以下命令的输出:

iptables -vnL
iptables -vnL -t nat
ip r

离线

#8 2017-08-07 12:46:50

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,919
个人网站

Re: (已解决)虚拟机/软路由可以ping外网,但无法通过软路由上网

另外你的 rackspace 的域名解析出来有好几个 IP,它们的表现都一样吗?

离线

#9 2017-08-07 14:45:59

驿窗
驿窗
所在地: 基础开源研究
注册时间: 2016-06-03
帖子: 928
个人网站

Re: (已解决)虚拟机/软路由可以ping外网,但无法通过软路由上网

三个命令输出的内容:

=====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大众化,从驿窗开始~

离线

#10 2017-08-07 14:48:40

驿窗
驿窗
所在地: 基础开源研究
注册时间: 2016-06-03
帖子: 928
个人网站

Re: (已解决)虚拟机/软路由可以ping外网,但无法通过软路由上网

依云 说:

另外你的 rackspace 的域名解析出来有好几个 IP,它们的表现都一样吗?

“表现一样”要怎么判断?是会自动更换IP么?

我这里不动了以后,就一直没有反应;每次我都是ctrl+c退出;


开源/Linux大众化,从驿窗开始~

离线

#11 2017-08-07 15:54:13

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,919
个人网站

Re: (已解决)虚拟机/软路由可以ping外网,但无法通过软路由上网

192.168.100.100 的以上三条命令的结果呢?

离线

#12 2017-08-07 16:49:52

驿窗
驿窗
所在地: 基础开源研究
注册时间: 2016-06-03
帖子: 928
个人网站

Re: (已解决)虚拟机/软路由可以ping外网,但无法通过软路由上网

依云 说:

192.168.100.100 的以上三条命令的结果呢?

是我前面没说清楚,192.168.100.100装的只有pfsense(基于freeBSD),不认iptables这个命令;
你是说问题出在pfsense里面?我研究研究。


开源/Linux大众化,从驿窗开始~

离线

#13 2017-08-07 17:19:33

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,919
个人网站

Re: (已解决)虚拟机/软路由可以ping外网,但无法通过软路由上网

哦。我也不怎么会 FreeBSD。目前看起来这奇怪的行为只能是那里了。ICMP 通畅,但是 TCP 被丢包或者不转发了。

离线

#14 2017-08-07 19:00:00

驿窗
驿窗
所在地: 基础开源研究
注册时间: 2016-06-03
帖子: 928
个人网站

Re: (已解决)虚拟机/软路由可以ping外网,但无法通过软路由上网

明白;
pfsense我也是刚开始弄,研究好了告诉你结果。


开源/Linux大众化,从驿窗开始~

离线

#15 2017-08-09 13:33:22

驿窗
驿窗
所在地: 基础开源研究
注册时间: 2016-06-03
帖子: 928
个人网站

Re: (已解决)虚拟机/软路由可以ping外网,但无法通过软路由上网

@仙子

虚拟机已经可以通过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大众化,从驿窗开始~

离线

页脚