參考: https://opengers.github.io/openstack/openstack-base-use-openvswitch/
這篇原理部分就不貼出來了,請自行參考上文,並根據自行實驗總結,上文寫的很深入,但仍有部分遺漏或或者說是作者認為不重要的東西吧,這些根據個人情況進行補充,內容重復太多,補充部分僅為自己理解,因此感覺還是交給認真的道友自行學習吧。
下面僅將自己總結的一些關於ovs-ofctl的更多詳細用法做一點說明
ovs-ofctl
是專門管理配置OpenFlow交換機的命令行工具,我們可以用它手動配置OVS中的OpenFlow flows,注意其不能操作datapath flows和”hidden” flows。【更多詳細匹配參數和Actions Set參數可參考后文.】
#查看br-tun中OpenFlow flows
ovs-ofctl dump-flows br-tun
#查看br-tun端口信息
ovs-ofctl show br-tun
#添加新的flow:對於從端口p0進入交換機的數據包,如果它不包含任何VLAN tag,則自動為它添加VLAN tag 101
ovs-ofctl add-flow br0 "priority=3,in_port=100,dl_vlan=0xffff,actions=mod_vlan_vid:101,normal"
#對於從端口3進入的數據包,若其vlan tag為100,去掉其vlan tag,並從端口1發出
ovs-ofctl add-flow br0 in_port=3,dl_vlan=101,actions=strip_vlan,output:1
#添加新的flow: 修改從端口p1收到的數據包的源地址為9.181.137.1,show 查看p1端口ID為100
ovs-ofctl add-flow br0 "priority=1 idle_timeout=0,in_port=100,actions=mod_nw_src:9.181.137.1,normal"
#添加新的flow: 重定向所有的ICMP數據包到端口 p2
ovs-ofctl add-flow br0 idle_timeout=0,dl_type=0x0800,nw_proto=1,actions=output:102
#刪除編號為 100 的端口上的所有流表項
ovs-ofctl del-flows br0 "in_port=100"
ovs-ofctl 中規則參數和Actions Set參數說明:
#添加新的flow:對於從端口p0進入交換機的數據包,如果它不包含任何VLAN tag,則自動為它添加VLAN tag 101
ovs-ofctl add-flow br0 "priority=3,in_port=100,dl_vlan=0xffff,actions=mod_vlan_vid:101,normal"
匹配規則參數:
ip Same as dl_type=0x0800.
icmp Same as dl_type=0x0800,nw_proto=1.
tcp Same as dl_type=0x0800,nw_proto=6.
udp Same as dl_type=0x0800,nw_proto=17.
sctp Same as dl_type=0x0800,nw_proto=132.
arp Same as dl_type=0x0806.
rarp Same as dl_type=0x8035.
in_port=port
匹配OpenFlow端口,該端口可以是OpenFlow端口號或關鍵字(例如LOCAL)。
執行: ovs-ofctl show SWITCH-Name
# 1(tun0): addr:5e:6a:a2:db:09:a4 #1:就是端口號
(resubmit操作可以搜索帶有任意in_port值的OpenFlow流表,因此從OpenFlow的角度來看,匹配端口號的流並不存在,但仍然可以進行匹配。)
dl_vlan=VLAN_Tag
匹配IEEE 802.1q虛擬LAN標簽。若VLAN_Tag=0xffff: 則表示匹配所有沒有VLAN標簽的包;否則,指定一個介於0到4095之間的數字,如12位vlan ID匹配。
dl_vlan_pcp=priority
匹配IEEE 802.1q優先代碼點(PCP:Priority Code Point)優先級,指定為0到7之間的值。更高的值表示更高的幀優先級。
dl_src=xx:xx:xx:xx:xx:xx
dl_dst=xx:xx:xx:xx:xx:xx
匹配一個以太網源(或目的地)地址,指定為6對十六進制數字。
dl_src=xx:xx:xx:xx:xx:xx/xx:xx:xx:xx:xx:xx
dl_dst=xx:xx:xx:xx:xx:xx/xx:xx:xx:xx:xx:xx
匹配一個以太網目的地地址,指定為6對十六進制數字。
OpenvSwitch 1.8,然后支持任意的掩模來提供源和/或目的地。早期版本只支持用以下面具掩蓋目的地:
01:00:00:00 00
只匹配多播比特。因此,dl_dst =01:00:00:00:00:00/01:00:00:00:00:00匹配所有的多播(包括廣播)以太網數據包,和 dl_dst=00:00:00:00:00:00/01:00:00:00:00:00匹配所有的unicast以太網包。
fe:ff:ff:ff:ff:ff
匹配所有的比特,除了多播比特。這可能是沒有用的。
ff:ff:ff:ff:ff:ff
精確匹配(相當於省略掩模)。
00:00:00:00:00:00
通配符所有位(等價於dl_dst = *)。
arp_sha=xx:xx:xx:xx:xx:xx
arp_tha=xx:xx:xx:xx:xx:xx
當dl_type指定ARP或RARP時,arp_sha和arp_tha分別匹配源和目標硬件地址。地址指定為6對十六進制數字,用冒號分隔。
dl_type = ethertype
匹配以太網協議類型以太類型,它被指定為一個整數在0和65535之間,包括十進制,或者作為一個十六進制數字,按0x(如0x0806匹配ARP包)。
nw_src = ip[/ netmask]
nw_dst = ip[/ netmask]
若dl_type=0x0800(或ip/tcp),則nw_src和nw_dst可匹配源或目的IP。可支持Netmask或CIDR。
當dl_type = 0x0806或arp時,在IPv4和以太網的arp包中分別匹配ar_spa或ar_tpa字段。
當dl_type = 0x8035或rarp時,在IPv4和以太網的rp包中,將分別匹配ar_spa或ar_tpa字段
當dl_type設置為 通配符或設置為0x0800,0x0806或0x8035的值,nw_src和nw_dst的值被忽略(見前面的流語法)。【不明白】
nw_proto = proto
當ip或dl_type = 0x0800被指定時,匹配ip協議類型proto,它被指定為0到255之間的十進制,包括(例如,匹配ICMP數據包或6來匹配TCP數據包)。
當指定ipv6或dl_type = 0x86dd時,匹配ipv6標題proto,它被指定為0到255之間的十進制,包括(例如,與ICMPv6包匹配,或6個匹配TCP)。頭類型是設計文檔中描述的終端頭。
當指定arp或dl_type = 0x0806時,與arp opcode的下8位相匹配。ARP碼大於255被視為0。
當指定了rp或dl_type = 0x8035時,與ARP opcode的下8位相匹配。ARP碼大於255被視為0。
當dl_type被通車或設置為一個大於0x0806、0x8035或0x86dd的值時,nw_proto的值就被忽略了(參見前面的流語法)。
nw_tos=tos
匹配IP ToS / DSCP或IPv6流量類字段,它被指定為0到255之間的十進制。注意,兩個較低的保留位被忽略為匹配的目的。
當dl_type被通配或設置為0x0800 / 0x0x86dd的值時,nw_tos的值就被忽略了(參見上面的流語法)。
tp_src=port
tp_dst=port
當dl_type和nw_proto指定為TCP/UDP/SCTP時,tp_src和tp_dst將匹配UDP或TCP或SCTP源或目的端口,分別指定為0到65535的整數
當dl_type和nw_proto使用其他值時,這些設置的值被忽略(見上面的流語法)。
tp_src=port/mask
tp_dst=port/mask
例如:
tcp,tp_src=0x03e8/0xfff8 #mask:要使用十六進制表示,它們最終要轉換為二進制做掩碼匹配。
tcp,tp_src=0x03f0/0xfff0
icmp_type=type
icmp_code=code
table=number
如果指定,則將流操作和流轉儲命令限制為僅應用於給定數字在0到254之間的表。如果沒有指定表,則行為會發生變化(相當於將255指定為數字)。對於沒有 --strict的流表修改命令,交換機將選擇這些命令要操作的表。對於帶有 --strict的流表修改命令,該命令將對任何表中任何匹配的流進行操作;如果在多個表中有匹配項,則不會執行任何操作。轉儲流和轉儲聚合命令將從所有表收集關於流的統計信息。
tun_id=tunnel-id[/mask]
匹配隧道標識符ID。只有通過帶有密鑰的隧道到達的數據包(例如grewith RFC 2890 key extension and a nonzero key value)才具有非零的隧道ID。如果指定了掩碼,則掩碼中的1位表示隧道id中對應的位必須精確匹配,並且該位必須匹配0位通配符。
tun_src=ip[/netmask]
tun_dst=ip[/netmask]
匹配隧道IPv4源(或目標)地址ip。只有通過隧道到達的數據包才有非零的隧道地址。地址可以指定為IP地址或主機名(例如192.168.1.1或www.example.com)。可選的網掩碼允許將匹配限制到屏蔽的IPv4地址。網絡掩碼可以指定為掩碼(例如192.168.1.0/255.255.255.0)或一個CIDR塊(例如192.168.1.0/24)。
Actions Set動作集參數:
add-flow、add-flows和mod-flows命令需要指定action= 用於設置動作集.
指定在流條目匹配時,對數據包采取的操作,它們之間用逗號分隔。如果沒有指定目標,則刪除與流匹配的包。目標可以是一個OpenFlow端口號,指定輸出數據包的物理端口,或者以下關鍵字之一:
output:port
將數據包輸出到端口,端口必須是OpenFlow端口號或關鍵字(例如LOCAL)。
output:src[start..end]
將數據包輸出到從src讀取的OpenFlow端口號,該端口號必須是如上所述的NXM字段。例如,輸出:NXM_NX_REG0 [16..31]輸出到寄存器0上半部分寫入的OpenFlow端口號。這種形式的輸出使用標准OpenFlow開關不支持的OpenFlow擴展。
enqueue:port:queue
在端口內的指定隊列上對數據包進行排隊,該隊列必須是OpenFlow端口號或關鍵字(例如LOCAL)。受支持隊列的數量取決於交換機;一些OpenFlow實現根本不支持排隊。
normal
使數據包服從設備正常的L2/L3處理。(並非所有OpenFlow開關都實現此操作。)
flood
將數據包輸出到所有交換機物理端口上,但不包括接收它的端口和禁用泛洪的端口(通常,這些端口是IEEE 802.1生成樹協議禁用的端口)。
all
在接收數據包的端口之外的所有交換機物理端口上輸出數據包。
controller(key=value...)
當發生“package in”事件時,向控制器發送指定消息
max_len = Bytes 設置發送的最大字節數
reason= Reason 設置發送消息的原因關鍵字,默認:action, no_match和invalid_ttl
id= Controller-ID 設置將'package in'事件消息發送給指定ID的控制器,ID:16位整數.
默認:0, 0:也是每個控制器連接的默認ID.
local
在“本地端口”上輸出數據包,“本地端口”對應於與網橋名稱相同的網絡設備。
in_port
在接收數據包的端口上輸出數據包。
drop
丟棄數據包,若指定它,則不能在指定其它動作.
mod_vlan_vid:vlan_vid
修改包上的VLAN id。根據需要添加或修改VLAN標記,以匹配指定的值。如果添加了VLAN標記,則使用零優先級.
mod_vlan_pcp:vlan_pcp
修改數據包上的VLAN優先級。根據需要添加或修改VLAN標記,以匹配指定的值。有效值介於0(最低)和7(最高)之間。如果添加了VLAN標記,則使用0的vid(請參閱設置此值的mod_vlan_vid操作)。
strip_vlan
若數據包中包含VLAN 標簽則刪除
push vlan:ethertype
將一個新的VLAN標簽推到包上。Ethertype用作標記的Ethertype。應該只使用ethertype 0x8100。(規范允許的0x88a8目前不受支持)新標記使用的優先級為零,標記為零。
mod_dl_src:mac
修改源MAC為指定MAC
mod_dl_dst:mac
修改目標MAC為指定MAC
mod_nw_src:ip
修改源IPv4地址為指定ip。
mod_nw_dst:ip
修改目標IPv4地址為指定ip。
mod_tp_src:port
修改TCP或UDP或SCTP源端口為指定端口。
mod_tp_dst:port
修改TCP或UDP或SCTP目標端口為指定端口。
mod_nw_tos:tos
將IPv4 ToS/DSCP字段設置為ToS,該字段必須是0到255之間4的倍數。此操作不修改ToS字段的兩個最不重要的位(ECN位)。
priority
通配符項與其他項相匹配的優先級。值是一個介於0和65535之間的數字,包括0和65535。較高的值將在較低的值之前匹配。與包含通配符的條目相比,精確匹配條目始終具有優先級,因此它的優先級值為65535。添加流時,如果沒有指定字段,則流的優先級默認為32768。
當具有相同優先級的兩個或多個流可以匹配一個包時,OpenFlow將不定義行為。一些用戶期望“合理”的行為,比如更特定的流優先於更不特定的流,但是OpenFlow沒有指定這一點,Open vSwitch也沒有實現這一點。因此,用戶應該注意使用優先級來確保他們期望的行為。