问题发生在一个Openstack的控制节点(兼网络节点)。我的网络由一个VM、两个路由器组成。结构如下:
VM -> Router1 -> Router2 -> External network
其中第一个路由器做SNAT,没有问题;第二个路由器是用来转发的,但是转发不成功,就是下面的qrouter-d3dcb2df-f3ca-4079-a434-491b23f84b5a。不会发贴,贴截图了。。。
看到你的描述了,如你的拓扑图,VM(192.168.1.x) -> (LAN:192.168.1.1)Router1(WAN:10.10.52.X) -> Router2 -> (10.10.52.X)External network,指出几点我**个人认为**有问题的点:
1.如你所说Router1做SNAT,Router2透传转发,首先如果Router1只做SNAT,那么VM的数据包文能到Externel network,但是Externel network回应的报文无法到达VM,还需要在Router1上做DNAT;
2.以我理解,VM的IP使用Router1的LAN端私网IP,假设是192.168.1.x网段,Router1的WAN端IP需要与External network同网段,假设为10.10.52.x,此时要实现VM到Externel network的互通,有两种做法:
《1》将Router2配置为Bridge模式,数据包在二层进行透传,但是由于Router2所处的位置,需要消耗一个10.10.52.x的IP地址,具体方式是在Router2上新建一个虚拟网桥接口如br0,讲Router2的LAN和WAN都加入网桥(brctl 命令),最后为br0配置需要消耗的哪个10.10.52.X的IP,并且启动此接口br0;缺点:基本不可能为Router2配置一个公网IP地址,很容易冲突,解决办法是将Router2移动到Router1之前,让Router2消耗私网IP(192.168.1.x),即拓扑变为VM(192.168.1.x) -> Router2(br0:192.168.1.x)->(LAN:192.168.1.1)Router1(WAN:10.10.52.X) -> (10.10.52.X)External network,或者直接去掉Router2更好;
《2》将Router2配置为NAT模式,(但是感觉没必要),拓扑变为VM(192.168.1.x) -> (LAN:192.168.1.1)Router1(WAN:192.168.2.x)-> (LAN:192.168.2.1)Router2(WAN:10.10.52.x)->-> (10.10.52.X)External network,这种Router1和2都要做SNAT/DNAT或者MASQUERADE,并且Router和21的默认路由需要配置正确
大概就是这样了,不知道我理解的对不对
看下这个:http://bbs.chinaunix.net/thread-4181406-1-1.html
检查下iptables的配置正确不
不一样哦。我这个问题FORWARD是ACCEPT,反倒不能转发
没有看到iptables的NAT配置啊,根据你的描述我理解是你的路由器的192.168.1.1是连接局域网端,10.10.52.x是链接上行网络,比如Internet网络,如果我的理解正确,那看你的iptables配置缺少NAT的配置,光打开forward是不行的,还需要同时配置iptables的SNAT和DNAT,或者MASQUERADE
理解的没错,给力!不过我们这个网络本来就是对一个实体网络的仿真,是不让改拓扑的。那个10.10.52.X地址,打算
配在最外层路由器Router2上,Router2收到目的地址是10.10.52.X的报文后,转发给Router1,目前想到比较拙劣的办法是iptables TEE
问题解决了。转发不成功是因为反向路由检测。要关掉这个功能:
sysctl net.ipv4.conf.all.rp_filter=0
sysctl net.ipv4.conf.qr-70aabff6-c8.rp_filter=0