ipvs學習筆記(二)

來源:互聯網
上載者:User

3.6、ipvs資料包發送

IPVS串連中的資料包的發送方法是由ip_vs_bind_xmit()(net\netfilter\ipvs\ip_vs_conn.c中)函數定義的,具體的發送資料包處理函數定義在net\netfilter\ipvs\Ip_vs_xmit.c檔案中

int

ip_vs_nat_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,

       struct ip_vs_protocol *pp)

NAT發送只發送請求方向的資料,因此是進行目的NAT

int

ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,

  struct ip_vs_protocol *pp)

TUNNEL發送是把原來的IP部分再加在一個IPIP協議(4)頭後發出去,新頭的目的IP是真實目的伺服器,源IP是真實用戶端IP,該包是可以路由的,伺服器的回應包將直接路由回去而不經過IPVS.

int

ip_vs_dr_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,

      struct ip_vs_protocol *pp)

DR發送是將原來的skb包中的目的MAC地址修改為目的伺服器的MAC地址後直接發出,因此是不能路由的,IPVS均衡裝置和目的伺服器物理上必須在同一個二層子網。在DR模式下,IPVS和伺服器都配置了相同的對外服務的VIP,伺服器也配了自己的真實IP,不過伺服器上配VIP的網卡屬性中的NOARP資訊是開啟的,就是在該網卡上不響應ARP資訊,但可以接收到達該VIP的資料包,這樣外面請求包先是到IPVS均衡器,因為IPVS的VIP是響應ARP的,然後根據調度找一台伺服器,用伺服器的真實IP來確定路由,然後直接把包發出來,這時包中所有資料都沒修改,因為目的伺服器上VIP地址符合包中的目的地址,因此是可以接收該包的。

int

ip_vs_bypass_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,

  struct ip_vs_protocol *pp)

旁路模式,實際資料包不是給IPVS均衡器自己的,由IPVS進行轉寄

int

ip_vs_icmp_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,

struct ip_vs_protocol *pp, int offset, unsigned int hooknum)

發送各種ICMP錯誤資訊包

 

3.7、ipvs的應用管理

IPVS的應用是針對象FTP等的多連線協定處理的,由於多連線協定的特殊性,任何以串連為基礎進行處理的模組如IPVS,netfilter等都必須對這些協議特別處理,不過IPVS相對沒有netfilter那麼完善,目前也僅僅支援FTP協議,而netfilter已經可以支援FTP、TFTP、IRC、AMANDA、MMS、SIP、H.323等多種多連線協定。

 

IPVS應用也是模組化的,不過其實現有點特別,對於每一個應用協議,會定義一個靜態struct ip_vs_app結構作為模板,以後登記該協議時,對應的應用指標並不是直接指向這個靜態結構,而是新分配一個struct ip_vs_app結構,結構中的struct ip_vs_app指標指向這個靜態結構,然後把新分配的這個結構分別掛接到靜態struct ip_vs_app結構的具體實現鏈表和IP協議的應用HASH鏈表中進行使用,這種實現方法和netfilter完全不同。

 

IPVS應用一些共用的處理函數在net\netfilter\ipvs\ip_vs_app.c中定義,其他各協議相關處理分別由各自檔案處理,如net\netfilter\ipvs\ip_vs_ftp.c.

 

3.8、ipvs的主備同步

IPVS支援對串連的同步,兩台IPVS裝置可分別以MASTER或BACKUP運行,MASTER進程可將串連資訊備份到BACKUP裝置上,這樣主裝置死機時從裝置可以無縫切換。

可以在IPVS裝置上同時啟動MASTER和BACKUP進程,使裝置之間互為備份,實現IPVS裝置的均衡。

 

IPVS同步實現在net\netfilter\ipvs\ip_vs_sync.c中

 

3.9、ipvs預估器

IPVS預估器用的估算在一個短暫時間間隔內的串連率,可在使用者空間開一個daemon定時讀取預估器的值以實現較長時間的預估。

預估演算法為:

取最後8秒鐘內,每兩秒取一個採樣點進行平滑處理:

    avgrate = avgrate*(1-W) + rate*W

    其中 W = 2^(-2) = 0.25,速率單位是KBytes/s

 

預估代碼在net\netfilter\ipvs\ip_vs_est.c中實現。

 

3.10、ipvs的/proc參數

ipvs在/proc目錄下建立了以下檔案:

/proc/net:

 /proc/net/ip_vs:IPVS的規則表

 /proc/net/ip_vs_app:IPVS應用協議

 /proc/net/ip_vs_conn:IPVS當前串連

 /proc/net/ip_vs_stats:IPVS狀態統計資訊

/proc/sys/net/ipv4/vs:

 /proc/sys/net/ipv4/vs/am_droprate:丟包率(預設10)

 /proc/sys/net/ipv4/vs/amemthresh:可用記憶體閾值(預設1024)

 /proc/sys/net/ipv4/vs/cache_bypass:是否建立旁路cache項

 /proc/sys/net/ipv4/vs/debug_level:調試層級

 /proc/sys/net/ipv4/vs/drop_entry:確定刪除串連處理層級

 /proc/sys/net/ipv4/vs/drop_packet:丟包層級

 /proc/sys/net/ipv4/vs/expire_nodest_conn:是否刪除沒有目的伺服器的串連

 /proc/sys/net/ipv4/vs/lblc_expiration:lblc演算法的到期時間(預設1天)

 /proc/sys/net/ipv4/vs/lblcr_expiration:lblcr演算法的到期時間(預設1天)

 /proc/sys/net/ipv4/vs/nat_icmp_send:NAT模式下串連異常時發送ICMP包

 /proc/sys/net/ipv4/vs/secure_tcp:更安全的TCP狀態轉換

 /proc/sys/net/ipv4/vs/sync_threshold:串連同步時的包數閾值數值

 /proc/sys/net/ipv4/vs/timeout_close:TCP sCL狀態逾時

 /proc/sys/net/ipv4/vs/timeout_closewait:TCP sCW狀態逾時

 /proc/sys/net/ipv4/vs/timeout_established:TCP sES狀態逾時

 /proc/sys/net/ipv4/vs/timeout_finwait:TCP sFW狀態逾時

 /proc/sys/net/ipv4/vs/timeout_icmp:ICMP逾時

 /proc/sys/net/ipv4/vs/timeout_lastack:TCP sLA狀態逾時

 /proc/sys/net/ipv4/vs/timeout_listen:TCP sLI狀態逾時

 /proc/sys/net/ipv4/vs/timeout_synack:TCP sSA狀態逾時

 /proc/sys/net/ipv4/vs/timeout_synrecv:TCP sSR狀態逾時

 /proc/sys/net/ipv4/vs/timeout_synsent:TCP sSS狀態逾時

 /proc/sys/net/ipv4/vs/timeout_timewait:TCP sTW狀態逾時

 /proc/sys/net/ipv4/vs/timeout_udp:UDP逾時

 

3.11、ipvs控制

ipvs控制包括定義IPVS提供的虛擬服務參數和實際的目的伺服器等各種參數。

ipvs的控制資訊是通過setsockopt系統調用傳遞到核心的,ipvs在使用者層的管理工具是ipvsadm。

關於ipvs控制碼在net\netfilter\ipvs\ip_vs_ctl.c中。

 

3.11.1、註冊sockopt

static struct nf_sockopt_ops ip_vs_sockopts = {

.pf                = PF_INET,

.set_optmin        = IP_VS_BASE_CTL,

.set_optmax        = IP_VS_SO_SET_MAX+1,

.set                = do_ip_vs_set_ctl,

.get_optmin        = IP_VS_BASE_CTL,

.get_optmax        = IP_VS_SO_GET_MAX+1,

.get                = do_ip_vs_get_ctl,

.owner                = THIS_MODULE,

};

借用netfilter的struct nf_sockopt_ops結構來添加

在int __init ip_vs_control_init(void)函數中調用

ret = nf_register_sockopt(&ip_vs_sockopts);來註冊sockopt

static int

do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len)

寫控制

static int

do_ip_vs_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)

讀控制

 

3.11.2、服務控制

static int

ip_vs_add_service(struct net *net, struct ip_vs_service_user_kern *u,

  struct ip_vs_service **svc_p)

添加服務

static int

ip_vs_edit_service(struct ip_vs_service *svc, struct ip_vs_service_user_kern *u)

修改服務和綁定一個新的調度器

static int ip_vs_del_service(struct ip_vs_service *svc)

刪除服務

static int ip_vs_flush(struct net *net)

刪除所有服務

static int ip_vs_zero_service(struct ip_vs_service *svc)

清除服務計數器

 

3.11.3、真實伺服器管理

static int

ip_vs_add_dest(struct ip_vs_service *svc, struct ip_vs_dest_user_kern *udest)

添加一個真實伺服器到一個已存在的虛擬服務

static int

ip_vs_new_dest(struct ip_vs_service *svc, struct ip_vs_dest_user_kern *udest,

       struct ip_vs_dest **dest_p)

在一個虛擬服務中建立一個真實伺服器結構

static int

ip_vs_edit_dest(struct ip_vs_service *svc, struct ip_vs_dest_user_kern *udest)

修改真實伺服器

static int

ip_vs_del_dest(struct ip_vs_service *svc, struct ip_vs_dest_user_kern *udest)

在一個虛擬服務中刪除真實伺服器

static void __ip_vs_del_dest(struct net *net, struct ip_vs_dest *dest)

刪除一個真實伺服器(必須已與虛擬服務解除綁定)

static void __ip_vs_unlink_dest(struct ip_vs_service *svc,

struct ip_vs_dest *dest,

int svcupd)

在一個虛擬服務中解除綁定真實伺服器

 

3.11.4、防禦層級調整

static void defense_work_handler(struct work_struct *work)

定時處理函數

static void update_defense_level(struct netns_ipvs *ipvs)

更新IPVS的防禦層級,需要用到/proc下定義的一些控制參數

 

4、學習總結

對於對linux核心不瞭解的人來說,最開始看ipvs和ipvsadm代碼時會一頭霧水,但對核心編程初步瞭解與看yfydz老大的實現分析系列文章後使我茅塞頓開。ipvs的結構體定義與功能函數實現一目瞭然,某些關鍵細節還沒有看的很透徹,不過已可以定位關鍵點了。ipvsadm與ipvs之間的控制通訊通過setsockopt實現,對照看一些結構體的填充與使用者層和核心之間的資料傳遞,可對控制工作流程有直觀的瞭解。最後挖掘的地方就是資料包修改功能與調度策略的演算法實現,這樣使我對ipvs的代碼實現熟悉起來。希望我整理的函數列表會對大家有協助,一直看yfydz的大篇注釋有點暈,需要瞭解的地方再跟進查看吧,感謝ipvs作者與yfydz的技術分享。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.