如何配置实现外部网络对Mininet节点IP(10.0.2.15网段)的Ping连通?
哈哈,这个问题我太熟了!之前帮好几个做SDN实验的朋友排查过——你现在的情况是典型的「单向通」:Mininet内部能ping通外部,但外部没法访问Mininet节点,核心是NAT规则只配了一半,再加上路由和转发的小细节没搞定,一步步来解决:
第一步:先把主机的IP转发功能拉满
Mininet运行在你的物理机/虚拟机上,首先得让主机允许IP转发,不然流量根本转不进Mininet:
- 先检查当前状态:
sysctl net.ipv4.ip_forward - 如果输出是
net.ipv4.ip_forward = 0,临时开启用:sudo sysctl -w net.ipv4.ip_forward=1 - 要永久生效(重启主机后也不用再开),编辑
/etc/sysctl.conf,把net.ipv4.ip_forward=1这行的注释去掉,然后执行sudo sysctl -p加载配置。
第二步:配置DNAT规则,给外部流量开个「入口」
你现在的配置应该只做了内部到外部的SNAT(把Mininet节点的源地址换成主机的IP),但外部要进来,得把主机收到的流量转发到Mininet节点,这就需要DNAT:
假设你的主机(运行Mininet的机器)的外部网卡IP是X.X.X.X,Mininet节点的IP是10.0.2.15:
- 先加DNAT规则,把外部发往主机的ICMP(ping)流量转到Mininet节点:
sudo iptables -t nat -A PREROUTING -p icmp --icmp-type echo-request -d X.X.X.X -j DNAT --to-destination 10.0.2.15 - 再补个SNAT规则,让Mininet节点的ping回应能正确发回外部:
sudo iptables -t nat -A POSTROUTING -p icmp --icmp-type echo-reply -s 10.0.2.15 -j SNAT --to-source X.X.X.X - 要是以后想让外部访问Mininet节点的其他服务(比如SSH、HTTP),只需要把
-p icmp换成对应的协议(比如-p tcp --dport 22)就行。
第三步:确认Mininet节点的默认网关没跑偏
有时候Mininet节点的路由没设对,回应的流量找不到回去的路:
- 进入Mininet节点的终端(比如在mininet交互界面输入
xterm h1),查路由:ip route - 如果默认网关不是主机的Mininet网卡IP(一般是10.0.2.1这类),手动添加:
sudo ip route add default via 10.0.2.1 - 更省事的办法是在Mininet拓扑脚本里直接配置,比如定义主机时:
h1 = self.addHost('h1', ip='10.0.2.15/24', defaultRoute='via 10.0.2.1')
第四步:排查主机防火墙的阻拦
很多时候主机的防火墙(比如ufw)会把转发的流量拦下来:
- 先临时关闭防火墙试试:
sudo ufw disable - 如果关闭后能ping通了,再配置防火墙允许转发:
编辑/etc/default/ufw,把DEFAULT_FORWARD_POLICY="DROP"改成DEFAULT_FORWARD_POLICY="ACCEPT",然后重启防火墙:sudo ufw reload
最后提个容易踩的坑:如果你的主机是虚拟机(比如VirtualBox、VMware),一定要把虚拟机的网络模式改成桥接模式!NAT模式下外部设备根本没法直接访问虚拟机的IP,这是很多人忽略的关键点!
内容的提问来源于stack exchange,提问作者Saidur Rahman Rifath
相关产品推荐
相关产品推荐

