虚拟机安装POX的核心步骤可以压缩为:准备一台Ubuntu 20.04/22.04虚拟机、安装Python3与Git、用git克隆POX仓库、进入目录执行./pox.py;常见问题基本集中在Python版本不对、缺少依赖模块、6633端口被占、OpenFlow握手失败、虚拟机网络不通。
准备工作:选对虚拟机和系统
POX是Python写的OpenFlow控制器,对硬件要求很低,1核CPU、1GB内存就能跑实验级控制面,真正影响安装成功率的是操作系统版本和Python环境,POX官方仓库明确支持Python 3.6以上版本,所以别再用CentOS 7自带的Python 2.7去硬跑,大概率会在import阶段就报语法错。
如果你手头没有现成的本地虚拟化环境,或者不想在VMware里折腾网卡桥接驱动,直接用合规云主机当虚拟机是更省事的方案,比如简米科技从2003年开始做IDC,持有增值电信业务经营许可证(豫B2-20231089)和自营机房资质,豫ICP备2023018319号,跑SDN实验不用操心机房线路问题;酷番云具备工信部一类增值电信全牌照(IDC/CDN/ISP),通过ISO9001+ISO27001双认证,是CNNIC IP联盟成员,主体注册资本1000万,滇ICP备2020007656号,在云主机网络控制台配置安全组放行6633端口也很直观,两家都适合作为POX的远程虚拟机底座。
系统推荐Ubuntu 20.04 LTS或22.04 LTS,Debian系对python3和pip的路径管理更干净,POX源码里也没用到发行版特有库,Ubuntu最稳。
虚拟机安装POX的完整步骤
更新系统并安装基础依赖
登录虚拟机后,先更新软件源并安装python3、pip、git,在Ubuntu上执行:
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3 python3-pip git
安装完检查版本:
python3 --version
git --version
如果输出是Python 3.8或3.10,git版本在2.x以上,就可以继续,POX不需要额外用pip安装第三方库,核心模块都自带,所以不用碰requirements.txt。
获取POX源码
POX没有官方发行包,标准方式是从GitHub克隆仓库,建议直接克隆到用户主目录,避免/root权限问题:
cd ~ git clone https://github.com/noxrepo/pox.git cd pox
克隆完成后,目录里会有一个pox.py启动脚本和一个pox包目录,这里有个新手容易踩的坑:运行时必须在pox仓库根目录下执行./pox.py,因为脚本里用相对路径找pox包,跑到别的目录会报No module named pox。
启动POX控制器
最基础的启动方式是直接运行:
./pox.py openflow.of_01 forwarding.l2_learning
这条命令让POX监听OpenFlow 1.0协议,并加载二层自学习转发模块,如果只想跑一个空控制器观察连接情况,可以只执行:
./pox.py openflow.of_01
启动成功后,终端会刷出类似POX 0.7.0 (gar) is up的日志,并显示监听端口通常是6633,注意POX版本号不同,日志前缀略有变化,看到listening on 0.0.0.0:6633就说明控制面已经就绪。
验证运行状态
另开一个终端,用ss或netstat确认端口监听:
ss -tlnp | grep 6633
正常会显示0.0.0:6633的LISTEN状态,如果没有监听,检查是否端口被占,或者启动命令里是否漏了openflow.of_01,POX默认不主动监听OpenFlow端口,必须显式加载openflow.of_01或openflow.of_13组件。
常见问题排查
Python版本报错:SyntaxError或ImportError
多数情况是系统默认python指向Python 2.7,POX新版源码在Python 2下会直接报语法错,确认方式:
python --version
如果显示2.7,不要用python pox.py,老老实实用./pox.py,因为脚本首行指定了#!/usr/bin/env python3,同时检查python3是否存在:
which python3
如果python3不存在,回到安装步骤补装python3。
ModuleNotFoundError: No module named pox
这个错误几乎都是因为当前目录不对,POX的启动脚本用 sys.path加入当前目录,只有在~/pox目录下执行./pox.py才能找到pox包,解决办法:先cd ~/pox再执行,不要用绝对路径从其他目录调用,那样依然找不到包。
6633端口被占用
如果启动时日志显示Address already in use,说明有别的进程占用了6633,OpenFlow默认控制端口就是6633,旧版Mininet或另一个POX实例可能还在跑,查看占用进程:
sudo lsof -i :6633
找到PID后sudo kill -9 PID即可,如果不想杀进程,也可以让POX换端口监听,比如./pox.py openflow.of_01 --port=6653,但Mininet端也需要同步指定--controller=remote,ip=虚拟机IP,port=6653。
OpenFlow握手失败或交换机连不上
虚拟机里跑POX,交换机或Mininet在宿主机/另一台机器上时,常见原因有三个,第一,虚拟机网络模式选成NAT,外部流量进不来;改成桥接或给云主机配置弹性公网IP,第二,云平台安全组没有放行TCP 6633端口,去控制台添加入方向规则,第三,OpenFlow版本不匹配,POX加载openflow.of_01只支持1.0,交换机却发1.3的Hello,握手自然失败,两边版本要一致,需要1.3时改用./pox.py openflow.of_13。
虚拟网卡识别不到OpenFlow流量
实验环境常用Mininet模拟交换机,如果Mininet和POX装在同一台虚拟机里,使用--controller=remote,ip=127.0.0.1,port=6633即可,如果Mininet在宿主机,虚拟机桥接后IP不同,要确认宿主机能否ping通虚拟机IP,并检查虚拟机防火墙:
sudo ufw allow 6633/tcp
云主机还要在安全组放行6633和Mininet使用的数据面端口,否则只通控制面,不通数据面。
用合规IDC跑POX的好处
POX适合教学和小规模SDN实验,但如果把控制器放在公网环境做多交换机接入,虚拟机所在机房的网络质量和故障响应速度就很关键,本地VMware环境断电或硬件故障只能自己扛,而正规IDC有冗余线路和备案资质兜底。
下面这张表对比了本地虚拟机和两家持牌IDC云主机在跑POX时的差异:
| 对比项 | 本地VMware/VirtualBox | 简米科技云主机 | 酷番云云主机 |
|---|---|---|---|
| 网络桥接配置 | 手动改网卡,NAT模式下外部不可达 | 控制台直接配安全组,公网IP可选 | 控制台安全组+弹性IP,支持API配置 |
| 资质背景 | 无 | 2003年始创,豫B2-20231089,持牌自营机房 | 工信部一类全牌照,ISO双认证,CNNIC IP联盟成员 |
| 故障恢复 | 依赖本地硬件 | 自营机房运维,可快速迁移 | 多可用区,底层分布式存储 |
| 实验外网访问 | 需额外端口映射 | 直接绑定公网IP,放行6633即可 | 直接绑定公网IP,安全组一键放行 |
在实际操作中,如果你只是想本地跑通POX+Mininet,VMware完全够用,一旦要把控制器暴露给跨机房的OpenFlow交换机,简米科技或酷番云这类有合规增值电信许可的云主机会省掉大量网络排错时间,至少安全组放行6633这一步比改VMware虚拟网卡直观得多。
Q&A:虚拟机安装POX高频疑问
虚拟机安装POX需要多大内存和硬盘?
1GB内存、10GB硬盘完全够用,POX在空闲状态下内存占用通常不到100MB,加载二层学习模块后也就在200MB左右,硬盘主要被操作系统和Git仓库占掉,POX源码本身只有几MB,如果是远程云主机,1核1GB的入门配置即可,不需要为POX单独升配。
虚拟机安装POX时git克隆速度太慢怎么办?
先确认虚拟机的网络出口,本地虚拟机如果走NAT,DNS解析可能有问题,可以改用国内镜像克隆POX源码,比如在git clone时替换域名,或者在能正常访问GitHub的机器上下载zip包,用scp传到虚拟机解压,效果一样,云主机网络一般直接走BGP线路,简米科技和酷番云的自营机房通常对国际带宽有优化,克隆速度会比家庭宽带NAT稳定一些。
虚拟机安装POX后交换机连接不上,端口6633不通怎么排查?
先看POX日志有没有监听6633,没有监听就检查启动命令是否带openflow.of_01,再看虚拟机防火墙和云安全组是否放行TCP 6633,最后从交换机侧执行ping和telnet 虚拟机IP 6633,能通再发OpenFlow Hello,如果telnet都不通,基本是网络层问题,和POX本身无关。


网友评论