1. 程式人生 > >OpenStack neutron floatingips 與 iptables 深入分析

OpenStack neutron floatingips 與 iptables 深入分析

1. 簡介neutron-l3-agent

OpenStack neutron-l3-agent 主要負責實現網路三層協議,為虛擬機器完成SNAT,DNAT等地址的轉換與偽裝,提供安全彈性隔離的雲網絡環境,

下面詳細敘述了OpenStack如何使用iptables鏈與規則完成複雜的neutron-l3-agent 的網路地址轉換(NAT)功能,虛擬機器floating ip與fixed ip繫結的工作原理。


2. iptables 簡介

    2.1 iptables 鏈拓撲結構


  2.2 iptables 表結構

           Table filter: 

                Chain INPUT

                Chain FORWARD

                Chain OUTPUT

            filter 表用於一般的資訊包過濾,它包含 INPUT 、 OUTPUT 和 FORWARD 鏈。

          Table nat:

                Chain PREROUTING

                Chain OUTPUT

                Chain POSTROUTING

           PREROUTING 鏈由指定資訊包一到達防火牆就改變它們的規則所組成,而 POSTROUTING 鏈由指定正當資訊包打算離開防火牆時改變它們的規則所組成。 


3. iptables command

# 新增一條規則到 INPUT 鏈的末尾,ACCEPT 來自源地址 10.9.1.141 的包

[[email protected] ~]# iptables -A INPUT -s 10.9.1.141  -j ACCEPT

#允許protocol為TCP 、 UDP 、 ICMP 的包通過

[[email protected] ~]# iptables -A INPUT -p TCP, UDP
# 從INPUT鏈中刪除掉規則“Drop 到埠80的包”
[[email protected] ~]# iptables -D INPUT --dport 80 -j DROP
# 將 INPUT 鏈的預設規則指定為 DROP 
[[email protected] ~]# iptables -P INPUT DROP

# 建立一個新鏈new-chain

[[email protected] ~]# iptables -N new-chain

# 刪除Table filter 中的所有規則

[[email protected] ~]# iptables -F

# 列出INPUT鏈中的所有規則

[[email protected] ~]# iptables -L INPUT

# 刪除鏈
[[email protected] ~]# iptables -X

4. 配置neutron-l3-agent 
[[email protected] ~]# neutron router-create router1
+--------------------------------------+---------+-----------------------+
| id                                   | name    | external_gateway_info |
+--------------------------------------+---------+-----------------------+
|c36b384e-b1f5-45e5-bb4f-c3ed32885142 | router1 | null |
+--------------------------------------+---------+-----------------------+
[[email protected] ~]# vi /etc/neutron/l3_agent.ini
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver 
# OS is RHEL6.4, not support namespace
use_namespaces = False
# This is done by setting the specific router_id.
router_id = c36b384e-b1f5-45e5-bb4f-c3ed32885142
# Name of bridge used for external network traffic. This should be set to
# empty value for the linux bridge
external_network_bridge = br-eth1
[[email protected] ~]# service neutron-l3-agent restart

啟用轉發功能

[[email protected] ~]#  echo 1 > /proc/sys/net/ipv4/ip_forward

5. neutron 利用iptables 實現 NAT 原理

iptables 中neutron l3 agent自定義的鏈:
neutron-l3-agent-PREROUTING
neutron-l3-agent-OUTPUT

neutron-l3-agent-POSTROUTING

建立外部網路(分配floatingip)

[[email protected] ~]#  neutron net-create ext_net --router:external=True
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | True                                 |
| id                        | 2d72d81b-cf09-459e-87fb-a50fa0e8730a |
| name                      | ext_net                              |
| provider:network_type     | vlan                                 |
| provider:physical_network | physnet1                             |
| provider:segmentation_id  | 1000                                 |
| router:external           | True                                 |
| shared                    | False                                |
| status                    | ACTIVE                               |
| subnets                   | e1932e73-1e4b-4f87-9ebf-758a757e20ef |
| tenant_id                 | b21a96e16c3c438caab4a27a1f58a5b8     |
+---------------------------+--------------------------------------+
[[email protected] cfn]# subnet-create ext_net --allocation-pool start=192.168.12.10,end=192.168.12.50 --gateway 192.168.12.1 192.168.12.0/24 --enable_dhcp=False
+------------------+----------------------------------------------------+
| Field            | Value                                              |
+------------------+----------------------------------------------------+
| allocation_pools | {"start": "192.168.12.10", "end": "192.168.12.50"} |
| cidr             | 192.168.12.0/24                                    |
| dns_nameservers  |                                                    |
| enable_dhcp      | False                                              |
| gateway_ip       | 192.168.12.1                                       |
| host_routes      |                                                    |
| id               | e1932e73-1e4b-4f87-9ebf-758a757e20ef               |
| ip_version       | 4                                                  |
| name             |                                                    |
| network_id       | 2d72d81b-cf09-459e-87fb-a50fa0e8730a               |
| tenant_id        | b21a96e16c3c438caab4a27a1f58a5b8                   |
+------------------+----------------------------------------------------+
建立內部網路(分配fixedip)
[[email protected] cfn]# neutron net-create vlan-70 --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 16
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | True                                 |
| id                        | 793a95b7-cf1f-4bde-b7b8-5a9a2e552fae |
| name                      | vlan-70                              |
| provider:network_type     | vlan                                 |
| provider:physical_network | physnet1                             |
| provider:segmentation_id  | 16                                   |
| router:external           | False                                |
| shared                    | False                                |
| status                    | ACTIVE                               |
| subnets                   | f542941d-5d53-45e4-85d0-944e030c2bcc |
| tenant_id                 | b21a96e16c3c438caab4a27a1f58a5b8     |
+---------------------------+--------------------------------------+
[[email protected] cfn]# neutron subnet-create vlan-70 70.0.0.0/24
+------------------+--------------------------------------------+
| Field            | Value                                      |
+------------------+--------------------------------------------+
| allocation_pools | {"start": "70.0.0.2", "end": "70.0.0.254"} |
| cidr             | 70.0.0.0/24                                |
| dns_nameservers  |                                            |
| enable_dhcp      | True                                       |
| gateway_ip       | 70.0.0.1                                   |
| host_routes      |                                            |
| id               | f542941d-5d53-45e4-85d0-944e030c2bcc       |
| ip_version       | 4                                          |
| name             |                                            |
| network_id       | 793a95b7-cf1f-4bde-b7b8-5a9a2e552fae       |
| tenant_id        | b21a96e16c3c438caab4a27a1f58a5b8           |
+------------------+--------------------------------------------+
[[email protected] cfn]# neutron net-list
+--------------------------------------+---------+------------------------------------------------------+
| id                                   | name    | subnets                                              |
+--------------------------------------+---------+------------------------------------------------------+
| 2d72d81b-cf09-459e-87fb-a50fa0e8730a | ext_net | e1932e73-1e4b-4f87-9ebf-758a757e20ef 192.168.12.0/24 |
| 793a95b7-cf1f-4bde-b7b8-5a9a2e552fae | vlan-70 | f542941d-5d53-45e4-85d0-944e030c2bcc 70.0.0.0/24     |
+--------------------------------------+---------+------------------------------------------------------+
繫結內外網到router1
# neutron router-gateway-set $ROUTER_ID $EXTERNAL_NETWORK_ID
[[email protected] cfn]# neutron router-gateway-set 06d85a01-fc42-4cde-a0f1-377f2f394a64 2d72d81b-cf09-459e-87fb-a50fa0e8730a

# neutron router-interface-add $ROUTER_ID $SUBNET_ID
[[email protected] cfn]# neutron router-interface-add 06d85a01-fc42-4cde-a0f1-377f2f394a64 f542941d-5d53-45e4-85d0-944e030c2bcc

經過上面的步驟後neutron-l3-agent會加入下列規則到iptables:

-A PREROUTING -j neutron-l3-agent-PREROUTING
-A POSTROUTING -j neutron-l3-agent-POSTROUTING
-A POSTROUTING -j neutron-postrouting-bottom
-A OUTPUT -j neutron-l3-agent-OUTPUT
-A neutron-l3-agent-snat -j neutron-l3-agent-float-snat
-A neutron-l3-agent-snat -s 70.0.0.0/24 -j SNAT --to-source 192.168.12.10
-A neutron-postrouting-bottom -j neutron-l3-agent-snat
建立floating ip(192.168.12.11)並繫結到vm的fixed ip(選擇70.0.0.3):
[[email protected] ~]# neutron floatingip-create 2d72d81b-cf09-459e-87fb-a50fa0e8730a
Created a new floatingip:
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| fixed_ip_address    |                                      |
| floating_ip_address | 192.168.12.11                        |
| floating_network_id | 2d72d81b-cf09-459e-87fb-a50fa0e8730a |
| id                  | f8b48ab7-ea51-4f29-bc84-0ab179808dbb |
| port_id             |                                      |
| router_id           |                                      |
| tenant_id           | adc4e7a4effa44ffa3c6e48dd5a8555a     |
+---------------------+--------------------------------------+

找出想要被繫結的fixed ip 的port id

[[email protected] ~]# neutron port-list
+--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------+
| id                                   | name | mac_address       | fixed_ips                                                                            |
+--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------+
| 0d06055b-2f31-4d8e-b8da-e048d76a07cc |      | fa:16:3e:d7:f4:19 | {"subnet_id": "5c62752f-27ba-4d38-9702-2ca17ec2741d", "ip_address": "70.0.0.3"}      |
+--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------+
[[email protected] ~]# neutron floatingip-associate f8b48ab7-ea51-4f29-bc84-0ab179808dbb0d06055b-2f31-4d8e-b8da-e048d76a07cc
Associated floatingip f8b48ab7-ea51-4f29-bc84-0ab179808dbb
[[email protected] ~]# neutron floatingip-list
+--------------------------------------+------------------+---------------------+--------------------------------------+
| id                                   | fixed_ip_address | floating_ip_address | port_id                              |
+--------------------------------------+------------------+---------------------+--------------------------------------+
| f8b48ab7-ea51-4f29-bc84-0ab179808dbb | 70.0.0.3         | 192.168.12.11       | b0797fe6-b799-41ea-86d0-9d9bfa0b2eb9 |
+--------------------------------------+------------------+---------------------+--------------------------------------+

經過前面步驟後,iptables會多出下面的規則, 所有目標ip是192.168.12.11的包都會被轉發到ip 70.0.0.3的guest上

-A neutron-l3-agent-OUTPUT -d 192.168.12.11/32 -j DNAT --to-destination 70.0.0.3
-A neutron-l3-agent-PREROUTING -d 192.168.12.11/32 -j DNAT --to-destination 70.0.0.3
-A neutron-l3-agent-float-snat -s 70.0.0.3/32 -j SNAT --to-source 192.168.12.11
6. neutron floating ip 與 fixed ip 的轉換
源地址轉換(SNAT)
[[email protected] ~]#  iptables -t nat -Aneutron-l3-agent-float-snat -s 70.0.0.6/32-j SNAT --to-source 192.168.12.100
 目的地址轉換(DNAT)
[[email protected] ~]#  iptables -t nat -Aneutron-l3-agent-PREROUTING -d 192.168.12.100/32-j DNAT --to-destination 70.0.0.6

測試:(從guest 70.0.0.11上ping 192.168.12.100, 結果被轉發到70.0.0.6的guest上)

[[email protected] ~]#  ssh [email protected]
[[email protected] ~]$ ping 192.168.12.100
PING 192.168.12.100 (192.168.12.100) 56(84) bytes of data.
64 bytes from 70.0.0.6: icmp_req=1 ttl=64 time=3.09 ms
64 bytes from 70.0.0.6: icmp_req=2 ttl=64 time=0.281 ms
64 bytes from 70.0.0.6: icmp_req=3 ttl=64 time=0.151 ms
將規則neutron-l3-agent-float-snat加到POSTROUTING規則之後,從70.0.0.6發出的包被偽裝成來自192.168.12.16,藉此掩蓋源地址
[[email protected] ~]#  iptables -t nat -A POSTROUTING -j neutron-l3-agent-float-snat

[[email protected] ~]$ ping 192.168.12.100
PING 192.168.12.100 (192.168.12.100) 56(84) bytes of data.
64 bytes from 192.168.12.100: icmp_req=1 ttl=63 time=2.47 ms
64 bytes from 192.168.12.100: icmp_req=2 ttl=63 time=0.199 ms
64 bytes from 192.168.12.100: icmp_req=3 ttl=63 time=0.251 ms

7. 例項分析(ALL-IN-ONE)

7.1 虛擬機器的網路拓撲


7.2 虛擬機器之間用floating ip ping通

# ping 192.168.12.100(70.0.0.6) from 70.0.0.11
# s:70.0.0.11 d:70.0.0.6
# prerouting -> forward -> postrouting
[[email protected] ~]#  iptables -A neutron-l3-agent-FORWARD -d 70.0.0.11/32 -j ACCEPT
[[email protected] ~]#  iptables -A neutron-l3-agent-FORWARD -d 70.0.0.6/32 -j ACCEPT
[[email protected] ~]#  iptables -t nat -A neutron-l3-agent-PREROUTING -d 192.168.12.100/32 -j DNAT --to-destination 70.0.0.6

7.3 虛擬機器主機ping通虛擬機器的floating ip

-A OUTPUT -j neutron-l3-agent-OUTPUT
[[email protected] ~]#  iptables -A neutron-l3-agent-OUTPUT -d 192.168.12.100/32 -j DNAT --to-destination 70.0.0.6


相關推薦

OpenStack neutron floatingips iptables 深入分析

1. 簡介neutron-l3-agent OpenStack neutron-l3-agent 主要負責實現網路三層協議,為虛擬機器完成SNAT,DNAT等地址的轉換與偽裝,提供安全彈性隔離的雲網絡環境, 下面詳細敘述了OpenStack如何使用iptables鏈與規則完

Java多執行緒(六)之DequeLinkedBlockingDeque深入分析

1、LinkedBlockingDeque資料結構 雙向併發阻塞佇列。所謂雙向是指可以從佇列的頭和尾同時操作,併發只是執行緒安全的實現,阻塞允許在入隊出隊不滿足條件時掛起執行緒,這裡說的佇列是指支援FIFO/FILO實現的連結串列。 首先看下LinkedBlockingDeque的資料結構。通常情況

OpenStack Neutron (1):外部網路建立分析

OpenStack中建立的instance想要訪問外網必須要建立外部網路(即provider network),然後通過虛擬路由器的連線實現。Neutron是通過網橋的方式實現外網的訪問,在建立外部網路之前檢視網路配置情況:[email protected]:~#

深入分析JavaWeb Item47 -- Struts2攔截器文件上傳下載

com custom public 面向切面 lang down pri 多功能 art 一、struts2中的攔截器(框架功能核心) 1、過濾器VS攔截器 過濾器VS攔截器功能是一回事。過濾器是Servlet規範中的技術,能夠對請求和響應進行過濾。

[數據庫事務鎖]詳解三: 深入分析事務的隔離級別

不可 ans 提高 重要 不能 標準 insert lec 使用 註明: 本文轉載自http://www.hollischuang.com/archives/943 本文詳細介紹四種事務隔離級別,並通過舉例的方式說明不同的級別能解決什麽樣的讀現象。並且介紹了在關系型數據

技術分享:OpenStack DVR部署分析

network 所有 emc 狀態 是把 oca l3-agent meta 進入 概述 為了提高neutron網絡服務的魯棒性與性能,OpenStack從J版開始正式加入的DVR(Distributed Virtual Router)服務,它將原本集中在網絡節點的部分服務

深入分析JavaWeb Item6 — servletConfig servletContext詳

顯示 www 程序 存在 文件夾 stream url mat 文件太大 一、ServletConfig講解首先看ServletConfig API文檔 1.1、配置Servlet初始化參數在Servlet的配置文件web.xml中,可以使用一個或多個<init-pa

深入分析JavaWeb技術內幕》之 12-Spring架構設計模式

    core context bean(bean工廠,bean定義,bean解析)   bean(bean工廠,bean定義,bean解析)     

深入分析JavaWeb技術內幕》之 11-Tomcat系統架構設計模式

1、 分發請求 2 、同時請求 3、 多級容器 4、 設計模式 Tomcat的組織結構 https://www.cnblogs.com/zhouyuqin/p/5143121.html   Tomcat Server處理一個HTTP請求的

深入分析JavaWeb技術內幕》之 10-SessionCookie

session與cookie     通過 返回的JsessionID 建立 session物件 查詢已經存在的session如果沒有就新建 session   standard manager管理session生命

深入分析JavaWeb技術內幕》之 15-iBatis系統架構對映原理

關鍵詞: 對映、 反射                              &

深入分析JavaWeb技術內幕》之 14-SpringMVC工作機制設計模式

 dispacherservlet初始化邏輯   handlerMapping            &nbs

數據結構算法分析-AVL樹深入探討

vhd tran ons c-s 算法 amp cal pascal oot .title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medi

【ODL-Openstack學習系列-01】-odl-neutron北向抓包分析

前言 odl-neutron是與openstack對接的北向模組,通過抓包分析openstack下發至odl-neutron的北向資料,可以大致瞭解到neutron的北向模型,以及各種請求的基本資料,便於我們進一步學習odl-netvirt程式碼,同時對於neutron的業務建立邏輯有一

Linux IO 監控深入分析

4.6 .cn 計時 說明 扇區 版本 play linux patch https://jaminzhang.github.io/os/Linux-IO-Monitoring-and-Deep-Analysis/ Linux IO 監控與深入分析 引言 接昨天電話面試

Netty深入分析Dubbo實戰解析(一)——網路程式設計模型介紹

Linux網路程式設計模型介紹 Linux核心將所有外部裝置都看作一個檔案來操作,對一個檔案的讀寫操作會呼叫核心提供的系統命令,返回一個file descriptor(fd,檔案描述符)。而對一個socket的讀寫也會有相應的描述符。描述符就是一個數字,它指向核心中的一個結構體(檔案路徑

《ODL-Openstack學習系列-01》-odl-neutron北向抓包分析

前言 odl-neutron是與openstack對接的北向模組,通過抓包分析openstack下發至odl-neutron的北向資料,可以大致瞭解到neutron的北向模型,以及各種請求的基本資料,便於我們進一步學習odl-netvirt程式碼,同時對於neu

深入分析JavaWeb Item6 — servletConfig servletContext詳解

一、ServletConfig講解 首先看ServletConfig API文件 1.1、配置Servlet初始化引數 在Servlet的配置檔案web.xml中,可以使用一個或多個標籤為servlet配置一些初始化引數。 例如: ServletCon

十四 第三章再續 快速選擇SELECT演算法的深入分析實現

                                          十四、亦第三章再續:快速選擇SELECT演算法的深入分析與實現前言    經典演算法研究系列已經寫了十三個演算法,共計22篇文章(詳情,見這:十三個經典演算法研究與總結、目錄+索引),我很怕我自己不再把這個算法系列給繼續寫下去

redis cluster叢集搭建深入分析(1)

對於之前所講的master+slave進行讀寫分離同時通過sentinel叢集保障高可用的架構,對於一般的資料量系統已經足夠。但是對於資料量龐大的T級別的資料,單master可能就無法滿足橫向擴充套件的場景。所以redis cluster支援多master