日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ip_vs实现分析(2)

發布時間:2023/12/9 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ip_vs实现分析(2) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文檔的Copyleft歸yfydz所有,使用GPL發布,可以自由拷貝,轉載,轉載時請保持文檔的完整性,嚴禁用于任何商業用途。
msn:?yfydz_no1@hotmail.com
來源:http://yfydz.cublog.cn


4. 模塊初始化
初始化函數先初始化ipvs的各種處理機制,然后將ipvs的處理函數掛接到netfilter架構中。
/* net/ipv4/ipvs/ip_vs_core.c */ static int __init ip_vs_init(void)
{
?int ret;
// ioctl初始化
?ret = ip_vs_control_init();
?if (ret < 0) {
??IP_VS_ERR("can't setup control.\n");
??goto cleanup_nothing;
?}
// 協議初始化
?ip_vs_protocol_init(); // 應用層輔助協議初始化
?ret = ip_vs_app_init();
?if (ret < 0) {
??IP_VS_ERR("can't setup application helper.\n");
??goto cleanup_protocol;
?} // ipvs連接初始化
?ret = ip_vs_conn_init();
?if (ret < 0) {
??IP_VS_ERR("can't setup connection table.\n");
??goto cleanup_app;
?} // 下面分別掛接各個處理點到netfilter架構中
?ret = nf_register_hook(&ip_vs_in_ops);
?if (ret < 0) {
??IP_VS_ERR("can't register in hook.\n");
??goto cleanup_conn;
?} ret = nf_register_hook(&ip_vs_out_ops);
?if (ret < 0) {
??IP_VS_ERR("can't register out hook.\n");
??goto cleanup_inops;
?}
?ret = nf_register_hook(&ip_vs_post_routing_ops);
?if (ret < 0) {
??IP_VS_ERR("can't register post_routing hook.\n");
??goto cleanup_outops;
?}
?ret = nf_register_hook(&ip_vs_forward_icmp_ops);
?if (ret < 0) {
??IP_VS_ERR("can't register forward_icmp hook.\n");
??goto cleanup_postroutingops;
?} IP_VS_INFO("ipvs loaded.\n");
?return ret;
// 以下是如果初始化出現失敗時依次進行釋放
? cleanup_postroutingops:
?nf_unregister_hook(&ip_vs_post_routing_ops);
? cleanup_outops:
?nf_unregister_hook(&ip_vs_out_ops);
? cleanup_inops:
?nf_unregister_hook(&ip_vs_in_ops);
? cleanup_conn:
?ip_vs_conn_cleanup();
? cleanup_app:
?ip_vs_app_cleanup();
? cleanup_protocol:
?ip_vs_protocol_cleanup();
?ip_vs_control_cleanup();
? cleanup_nothing:
?return ret;
}
4.1 ip_vs_control_init /* net/ipv4/ipvs/ip_vs_ctl.c */
int ip_vs_control_init(void)
{
?int ret;
?int idx; EnterFunction(2); // 登記ipvs的sockopt控制,這樣用戶空間可通過setsockopt函數來和ipvs進行通信
?ret = nf_register_sockopt(&ip_vs_sockopts);
?if (ret) {
??IP_VS_ERR("cannot register sockopt.\n");
??return ret;
?} // 建立/proc/net/ip_vs和/proc/net/ip_vs_stats只讀項
?proc_net_fops_create("ip_vs", 0, &ip_vs_info_fops);
?proc_net_fops_create("ip_vs_stats",0, &ip_vs_stats_fops); // 建立/proc/sys/net/ipv4/vs目錄下的各可讀寫控制參數
?sysctl_header = register_sysctl_table(vs_root_table, 0); // 初始化各種雙向鏈表
// svc_table是根據協議地址端口等信息進行服務結構struct ip_vs_service查找的HASH表
// svc_fwm_table是根據數據包的nfmark信息進行服務結構struct ip_vs_service查找的HASH表
?/* Initialize ip_vs_svc_table, ip_vs_svc_fwm_table, ip_vs_rtable */
?for(idx = 0; idx < IP_VS_SVC_TAB_SIZE; idx++)? {
??INIT_LIST_HEAD(&ip_vs_svc_table[idx]);
??INIT_LIST_HEAD(&ip_vs_svc_fwm_table[idx]);
?}
// rtable是目的結構struct ip_vs_dest的HASH鏈表
?for(idx = 0; idx < IP_VS_RTAB_SIZE; idx++)? {
??INIT_LIST_HEAD(&ip_vs_rtable[idx]);
?} // ipvs統計信息
?memset(&ip_vs_stats, 0, sizeof(ip_vs_stats));
// 統計鎖
?spin_lock_init(&ip_vs_stats.lock);
// 對當前統計信息建立一個預估器,可用于計算服務器的性能參數
?ip_vs_new_estimator(&ip_vs_stats); /* Hook the defense timer */
// 掛一個定時操作,根據系統當前負載情況定時調整系統參數
?schedule_delayed_work(&defense_work, DEFENSE_TIMER_PERIOD); LeaveFunction(2);
?return 0;
}
4.2 ip_vs_protocol_init
/* net/ipv4/ipvs/ip_vs_proto.c */
int ip_vs_protocol_init(void)
{
// 掛接ipvs能進行均衡處理的各種協議,目前支持TCP/UDP/AH/ESP
// 最好還要增加GRE,在PPTP服務器中使用
?char protocols[64];
#define REGISTER_PROTOCOL(p)???\
?do {?????\
??register_ip_vs_protocol(p);?\
??strcat(protocols, ", ");?\
??strcat(protocols, (p)->name);?\
?} while (0) // 0,1字符是給", "預留的
?protocols[0] = '\0';
?protocols[2] = '\0'; // 登記各種協議
#ifdef CONFIG_IP_VS_PROTO_TCP
?REGISTER_PROTOCOL(&ip_vs_protocol_tcp);
#endif
#ifdef CONFIG_IP_VS_PROTO_UDP
?REGISTER_PROTOCOL(&ip_vs_protocol_udp);
#endif
#ifdef CONFIG_IP_VS_PROTO_AH
?REGISTER_PROTOCOL(&ip_vs_protocol_ah);
#endif
#ifdef CONFIG_IP_VS_PROTO_ESP
?REGISTER_PROTOCOL(&ip_vs_protocol_esp);
#endif
// 第0,1字符分別為逗號','和空格' ',從第2字符起才是真正數據串
?IP_VS_INFO("Registered protocols (%s)\n", &protocols[2]); return 0;
} register_ip_vs_protocol()函數就是把ip_vs_protocol結構掛接到協議HASH表中,不過其實沒幾個協議,沒必要用HASH,直接數組就行了,Linux內核中缺省好象也只支持32種IP協議。 /*
?*?register an ipvs protocol
?*/
static int register_ip_vs_protocol(struct ip_vs_protocol *pp)
{
?unsigned hash = IP_VS_PROTO_HASH(pp->protocol); // 把新協議節點掛接到HASH鏈表頭
?pp->next = ip_vs_proto_table[hash];
?ip_vs_proto_table[hash] = pp; // 調用該協議的初始化函數
?if (pp->init != NULL)
??pp->init(pp); return 0;
}
4.3 ip_vs_app_init IPVS應用初始化 /* net/ipv4/ipvs/ip_vs_app.c */
int ip_vs_app_init(void)
{
?/* we will replace it with proc_net_ipvs_create() soon */
// 該函數就是建立一個/proc/net/ip_vs_app項
?proc_net_fops_create("ip_vs_app", 0, &ip_vs_app_fops);
?return 0;
}
4.4 ip_vs_conn_init IPVS連接初始化 /* net/ipv4/ipvs/ip_vs_conn.c */
int ip_vs_conn_init(void)
{
?int idx; /*
? * Allocate the connection hash table and initialize its list heads
? */
// ipvs連接HASH表
?ip_vs_conn_tab = vmalloc(IP_VS_CONN_TAB_SIZE*sizeof(struct list_head));
?if (!ip_vs_conn_tab)
??return -ENOMEM; /* Allocate ip_vs_conn slab cache */
// ipvs連接cache,由于使用cache在內存塊釋放時并不真正釋放,而是cache起來,
// 因此重新分配時速度更快
?ip_vs_conn_cachep = kmem_cache_create("ip_vs_conn",
?????????? sizeof(struct ip_vs_conn), 0,
?????????? SLAB_HWCACHE_ALIGN, NULL, NULL);
?if (!ip_vs_conn_cachep) {
??vfree(ip_vs_conn_tab);
??return -ENOMEM;
?} IP_VS_INFO("Connection hash table configured "
???? "(size=%d, memory=%ldKbytes)\n",
???? IP_VS_CONN_TAB_SIZE,
???? (long)(IP_VS_CONN_TAB_SIZE*sizeof(struct list_head))/1024);
?IP_VS_DBG(0, "Each connection entry needs %Zd bytes at least\n",
??? sizeof(struct ip_vs_conn));
// 初始化各HASH鏈表頭
?for (idx = 0; idx < IP_VS_CONN_TAB_SIZE; idx++) {
??INIT_LIST_HEAD(&ip_vs_conn_tab[idx]);
?}
// 初始化各讀寫鎖
?for (idx = 0; idx < CT_LOCKARRAY_SIZE; idx++)? {
??rwlock_init(&__ip_vs_conntbl_lock_array[idx].l);
?} // 建立/proc/net/ip_vs_conn項
?proc_net_fops_create("ip_vs_conn", 0, &ip_vs_conn_fops); /* calculate the random value for connection hash */
// 初始隨機數
?get_random_bytes(&ip_vs_conn_rnd, sizeof(ip_vs_conn_rnd)); return 0;
}
4.5 netfilter掛接點
nf_hook_ops分別在FORWARD點掛2個, INPUT點和POST_ROUTING點各掛一個
/* net/ipv4/ipvs/ip_vs_core.c */ 4.5.1 ip_vs_in_ops
/* After packet filtering, forward packet through VS/DR, VS/TUN,
?? or VS/NAT(change destination), so that filtering rules can be
?? applied to IPVS. */
static struct nf_hook_ops ip_vs_in_ops = {
?.hook??= ip_vs_in,
?.owner??= THIS_MODULE,
?.pf??= PF_INET,
// INPUT點
?.hooknum??????? = NF_IP_LOCAL_IN,
// 此優先級低于filter
?.priority?????? = 100,
};
ip_vs_in()這個函數對進入本機的包進行處理. /* net/ipv4/ipvs/ip_vs_core.c */ /*
?*?Check if it's for virtual services, look it up,
?*?and send it on its way...
?*/
static unsigned int
ip_vs_in(unsigned int hooknum, struct sk_buff **pskb,
? const struct net_device *in, const struct net_device *out,
? int (*okfn)(struct sk_buff *))
{
?struct sk_buff?*skb = *pskb;
?struct iphdr?*iph;
?struct ip_vs_protocol *pp;
?struct ip_vs_conn *cp;
?int ret, restart;
?int ihl; /*
? *?Big tappo: only PACKET_HOST (neither loopback nor mcasts)
? *?... don't know why 1st test DOES NOT include 2nd (?)
? */
?if (unlikely(skb->pkt_type != PACKET_HOST
?????? || skb->dev == &loopback_dev || skb->sk)) {
// input不處理目的非本機的包
??IP_VS_DBG(12, "packet type=%d proto=%d daddr=%d.%d.%d.%d ignored\n",
???? skb->pkt_type,
???? skb->nh.iph->protocol,
???? NIPQUAD(skb->nh.iph->daddr));
??return NF_ACCEPT;
?} iph = skb->nh.iph;
?if (unlikely(iph->protocol == IPPROTO_ICMP)) {
// 如果是ICMP,可能是指示連接錯誤的ICMP信息,調用ip_vs_in_icmp進行檢查
// 是否是相關的ICMP信息
??int related, verdict = ip_vs_in_icmp(pskb, &related, hooknum); if (related)
???return verdict;
// 非相關ICMP,恢復處理流程
// 但其實ipvs是不均衡ICMP信息的,后面就返回了
??skb = *pskb;
??iph = skb->nh.iph;
?} /* Protocol supported? */
// 獲取協議支持模塊,由于只支持TCP、UDP、AH和ESP,如果是ICMP,返回為NULL
?pp = ip_vs_proto_get(iph->protocol);
?if (unlikely(!pp))
??return NF_ACCEPT; ihl = iph->ihl << 2; /*
? * Check if the packet belongs to an existing connection entry
? */
// 找到和該skb相關的ipvs連接,類似netfilter的根據tuple查找連接,
// 不過sk_buff結構中沒有增加nfct那樣能直接指向連接的成員
// 對TCP協議來說是tcp_conn_in_get()
?cp = pp->conn_in_get(skb, pp, iph, ihl, 0); if (unlikely(!cp)) {
??int v;
// 如果沒有連接, 表明是新連接, 調用IPVS連接的conn_schedule調度連接分配和處理
// 連接調度要根據調度算法選擇一個真實目的服務器,然后建立新的IPVS連接
// 對TCP協議來說是tcp_conn_schedule()
??if (!pp->conn_schedule(skb, pp, &v, &cp))
???return v;
?} if (unlikely(!cp)) {
// 這種情況主要是沒內存空間了,IPVS沒提供主動刪除連接的機制
??/* sorry, all this trouble for a no-hit :) */
??IP_VS_DBG_PKT(12, pp, skb, 0,
???????? "packet continues traversal as normal");
??return NF_ACCEPT;
?} IP_VS_DBG_PKT(11, pp, skb, 0, "Incoming packet"); /* Check the server status */
?if (cp->dest && !(cp->dest->flags & IP_VS_DEST_F_AVAILABLE)) {
??/* the destination server is not available */
// 對于目的服務器失效的包丟棄
??if (sysctl_ip_vs_expire_nodest_conn) {
???/* try to expire the connection immediately */
???ip_vs_conn_expire_now(cp);
??}
??/* don't restart its timer, and silently
???? drop the packet. */
??__ip_vs_conn_put(cp);
??return NF_DROP;
?}
// 連接信息統計
?ip_vs_in_stats(cp, skb); // 進行連接狀態的遷移, restart這個參數其實沒用
// 對TCP協議來說是調用tcp_state_transition
?restart = ip_vs_set_state(cp, IP_VS_DIR_INPUT, skb, pp); if (cp->packet_xmit)
// 將包發送出去, 具體xmit的實現在ip_vs_xmit.c中實現,
// NAT模式下為 ip_vs_nat_xmit;
// 通道模式下為 ip_vs_tunnel_xmit;
// 直接路由模式下為:? ip_vs_dr_xmit;
// 本機數據為: ip_vs_null_xmit;
// 旁路模式下為: ip_vs_bypass_xmit;
// 函數成功時基本都返回NF_STOLEN使netfilter不再處理該包
// 所以對于NAT模式,應該是不需要配置DNAT規則的,請求方向數據也不經過FORWARD鏈
??ret = cp->packet_xmit(skb, cp, pp);
??/* do not touch skb anymore */
?else {
??IP_VS_DBG_RL("warning: packet_xmit is null");
??ret = NF_ACCEPT;
?} /* increase its packet counter and check if it is needed
??? to be synchronized */
?atomic_inc(&cp->in_pkts); // 在進行均衡器熱備時將連接信息要從MASTER傳遞到SLAVE,使系統切換時
// 連接不丟棄,但還是要有一定條件才進行同步
?if ((ip_vs_sync_state & IP_VS_STATE_MASTER) &&
// 同步狀態類型為主機
???? (cp->protocol != IPPROTO_TCP ||
????? cp->state == IP_VS_TCP_S_ESTABLISHED) &&
// 非TCP連接或是已經建立的連接
???? (atomic_read(&cp->in_pkts) % sysctl_ip_vs_sync_threshold[1]
????? == sysctl_ip_vs_sync_threshold[0]))
// 當前連接的包數為N*thres[1]+thres[0]時
// 進行連接的同步
??ip_vs_sync_conn(cp);
// 調整連接超時,釋放連接計數
?ip_vs_conn_put(cp);
?return ret;
}
4.5.2 ip_vs_out_ops
/* After packet filtering, change source only for VS/NAT */
static struct nf_hook_ops ip_vs_out_ops = {
?.hook??= ip_vs_out,
?.owner??= THIS_MODULE,
?.pf??= PF_INET,
// FORWARD點
?.hooknum??????? = NF_IP_FORWARD,
// 此優先級低于filter
?.priority?????? = 100,
}; ip_vs_out()這個函數對轉發包進行處理, 只用在NAT模式的均衡處理,TUNNEL和DR方式下都是直接發送了,實際處理的只是服務器返回的回應包,而客戶端請求的包是不經過這里的,但如果設置了DNAT規則,數據包在PREROUTING點進行了目的地址修改,這樣就不會再進入INPUT點而是直接轉到FORWARD點處理,這時時針對該包的IPVS連接是沒有建立的。
/* net/ipv4/ipvs/ip_vs_core.c */ /*
?*?It is hooked at the NF_IP_FORWARD chain, used only for VS/NAT.
?*?Check if outgoing packet belongs to the established ip_vs_conn,
?*????? rewrite addresses of the packet and send it on its way...
?*/
static unsigned int
ip_vs_out(unsigned int hooknum, struct sk_buff **pskb,
?? const struct net_device *in, const struct net_device *out,
?? int (*okfn)(struct sk_buff *))
{
?struct sk_buff? *skb = *pskb;
?struct iphdr?*iph;
?struct ip_vs_protocol *pp;
?struct ip_vs_conn *cp;
?int ihl; EnterFunction(11);
// 這個標志只占一位
// 標志設上就是已經經過IPVS處理了,直接返回
?if (skb->ipvs_property)
??return NF_ACCEPT; iph = skb->nh.iph;
?if (unlikely(iph->protocol == IPPROTO_ICMP)) {
// 處理可能的連接相關ICMP錯誤信息,如地址端口不可達等
??int related, verdict = ip_vs_out_icmp(pskb, &related); if (related)
???return verdict;
??skb = *pskb;
??iph = skb->nh.iph;
?}
// 取得IPVS協議, tcp/udp/ah/esp之一
?pp = ip_vs_proto_get(iph->protocol);
?if (unlikely(!pp))
??return NF_ACCEPT; /* reassemble IP fragments */
?if (unlikely(iph->frag_off & __constant_htons(IP_MF|IP_OFFSET) &&
?????? !pp->dont_defrag)) {
// 如果是碎片包進行重組,基本不可能,因為數據包進入netfilter時就要進行碎片重組
??skb = ip_vs_gather_frags(skb, IP_DEFRAG_VS_OUT);
??if (!skb)
???return NF_STOLEN;
??iph = skb->nh.iph;
??*pskb = skb;
?} ihl = iph->ihl << 2; /*
? * Check if the packet belongs to an existing entry
? */
// 查找IPVS連接
?cp = pp->conn_out_get(skb, pp, iph, ihl, 0); if (unlikely(!cp)) {
// 沒找到IPVS連接,可能是請求方向的包經過DNAT過來的
??if (sysctl_ip_vs_nat_icmp_send &&
????? (pp->protocol == IPPROTO_TCP ||
?????? pp->protocol == IPPROTO_UDP)) {
???__u16 _ports[2], *pptr; pptr = skb_header_pointer(skb, ihl,
??????? sizeof(_ports), _ports);
???if (pptr == NULL)
????return NF_ACCEPT;?/* Not for me */
// 用源地址,源端口來查真實服務器結構,如果是請求方向是找不到的
// 這種情況下數據包就不再被IPVS處理
???if (ip_vs_lookup_real_service(iph->protocol,
??????????? iph->saddr, pptr[0])) {
????/*
???? * Notify the real server: there is no
???? * existing entry if it is not RST
???? * packet or not TCP packet.
???? */
????if (iph->protocol != IPPROTO_TCP
??????? || !is_tcp_reset(skb)) {
?????icmp_send(skb,ICMP_DEST_UNREACH,
??????? ICMP_PORT_UNREACH, 0);
?????return NF_DROP;
????}
???}
??}
??IP_VS_DBG_PKT(12, pp, skb, 0,
???????? "packet continues traversal as normal");
??return NF_ACCEPT;
?}
// 找到連接,該包是服務器的回應包
?IP_VS_DBG_PKT(11, pp, skb, 0, "Outgoing packet");
// skb數據包要求是可寫的
?if (!ip_vs_make_skb_writable(pskb, ihl))
??goto drop; /* mangle the packet */
// 修改協議部分信息,如TCP、UDP的端口
?if (pp->snat_handler && !pp->snat_handler(pskb, pp, cp))
??goto drop;
// 修改源地址, 由于是服務器的返回包,只修改源地址
?skb = *pskb;
?skb->nh.iph->saddr = cp->vaddr;
?ip_send_check(skb->nh.iph); IP_VS_DBG_PKT(10, pp, skb, 0, "After SNAT"); // IPVS輸出統計
?ip_vs_out_stats(cp, skb);
?ip_vs_set_state(cp, IP_VS_DIR_OUTPUT, skb, pp);
?ip_vs_conn_put(cp); // 對該包設置標志表示IPVS處理過了
?skb->ipvs_property = 1; LeaveFunction(11);
?return NF_ACCEPT; drop:
?ip_vs_conn_put(cp);
?kfree_skb(*pskb);
?return NF_STOLEN;
}
4.5.3 ip_vs_post_routing_ops
/* Before the netfilter connection tracking, exit from POST_ROUTING */
static struct nf_hook_ops ip_vs_post_routing_ops = {
?.hook??= ip_vs_post_routing,
?.owner??= THIS_MODULE,
?.pf??= PF_INET,
// POSTROUTING點
?.hooknum??????? = NF_IP_POST_ROUTING,
// 在源NAT之前進行
?.priority?????? = NF_IP_PRI_NAT_SRC-1,
};
ip_vs_post_routing()這個函數對最后要發出的包進行檢查,這個包是經過FORWARD鏈的,源地址已經被IPVS修改過了,不用再被netfilter進行修改。如果是IPVS處理過的包,直接跳出POSTROUTING點, 不再繼續可能的該點的更低優先級的hook點操作,即不用進行netfilter標準的SNAT操作。
/* net/ipv4/ipvs/ip_vs_core.c */ /*
?*????? It is hooked before NF_IP_PRI_NAT_SRC at the NF_IP_POST_ROUTING
?*????? chain, and is used for VS/NAT.
?*????? It detects packets for VS/NAT connections and sends the packets
?*????? immediately. This can avoid that iptable_nat mangles the packets
?*????? for VS/NAT.
?*/
static unsigned int ip_vs_post_routing(unsigned int hooknum,
?????????? struct sk_buff **pskb,
?????????? const struct net_device *in,
?????????? const struct net_device *out,
?????????? int (*okfn)(struct sk_buff *))
{
// 如果沒被IPVS處理過,繼續后續hook點操作
?if (!((*pskb)->ipvs_property))
??return NF_ACCEPT;
?/* The packet was sent from IPVS, exit this chain */
// NF_STOP和NF_ACCEPT的區別就是STOP就不繼續后面的低優先級的hook_ops的操作了
?return NF_STOP;
}
4.5.4 ip_vs_forward_icmp_ops
/* After packet filtering (but before ip_vs_out_icmp), catch icmp
?? destined for 0.0.0.0/0, which is for incoming IPVS connections */
static struct nf_hook_ops ip_vs_forward_icmp_ops = {
?.hook??= ip_vs_forward_icmp,
?.owner??= THIS_MODULE,
?.pf??= PF_INET,
// FORWARD點
?.hooknum??????? = NF_IP_FORWARD,
// 在ip_vs_out_ops之前進行
?.priority?????? = 99,
}; ip_vs_forward_icmp()這個函數對轉發的ICMP包進行處理, 處理由于服務器失效而引起的網絡或端口不可達的ICMP信息,其他和服務器無關的ICMP信息不處理
/* net/ipv4/ipvs/ip_vs_core.c */ /*
?*?It is hooked at the NF_IP_FORWARD chain, in order to catch ICMP
?*????? related packets destined for 0.0.0.0/0.
?*????? When fwmark-based virtual service is used, such as transparent
?*????? cache cluster, TCP packets can be marked and routed to ip_vs_in,
?*????? but ICMP destined for 0.0.0.0/0 cannot not be easily marked and
?*????? sent to ip_vs_in_icmp. So, catch them at the NF_IP_FORWARD chain
?*????? and send them to ip_vs_in_icmp.
?*/
static unsigned int
ip_vs_forward_icmp(unsigned int hooknum, struct sk_buff **pskb,
???? const struct net_device *in, const struct net_device *out,
???? int (*okfn)(struct sk_buff *))
{
?int r; if ((*pskb)->nh.iph->protocol != IPPROTO_ICMP)
??return NF_ACCEPT;
// 實際調用ip_vs_in_icmp()來處理數據包
?return ip_vs_in_icmp(pskb, &r, hooknum);
}
/*
?*?Handle ICMP messages in the outside-to-inside direction (incoming).
?*?Find any that might be relevant, check against existing connections,
?*?forward to the right destination host if relevant.
?*?Currently handles error types - unreachable, quench, ttl exceeded.
?*/
static int?
ip_vs_in_icmp(struct sk_buff **pskb, int *related, unsigned int hooknum)
{
?struct sk_buff *skb = *pskb;
?struct iphdr *iph;
?struct icmphdr?_icmph, *ic;
?struct iphdr?_ciph, *cih;?/* The ip header contained within the ICMP */
?struct ip_vs_conn *cp;
?struct ip_vs_protocol *pp;
?unsigned int offset, ihl, verdict; // 這個參數指示該ICMP包是否和IPVS的連接相關
?*related = 1; /* reassemble IP fragments */
?if (skb->nh.iph->frag_off & __constant_htons(IP_MF|IP_OFFSET)) {
// 進行碎片重組
??skb = ip_vs_gather_frags(skb,
?????????????????????????? hooknum == NF_IP_LOCAL_IN ?
????? IP_DEFRAG_VS_IN : IP_DEFRAG_VS_FWD);
??if (!skb)
???return NF_STOLEN;
??*pskb = skb;
?} iph = skb->nh.iph;
?offset = ihl = iph->ihl * 4;
?ic = skb_header_pointer(skb, offset, sizeof(_icmph), &_icmph);
?if (ic == NULL)
??return NF_DROP; IP_VS_DBG(12, "Incoming ICMP (%d,%d) %u.%u.%u.%u->%u.%u.%u.%u\n",
??? ic->type, ntohs(icmp_id(ic)),
??? NIPQUAD(iph->saddr), NIPQUAD(iph->daddr)); /*
? * Work through seeing if this is for us.
? * These checks are supposed to be in an order that means easy
? * things are checked first to speed up processing.... however
? * this means that some packets will manage to get a long way
? * down this stack and then be rejected, but that's life.
? */
?if ((ic->type != ICMP_DEST_UNREACH) &&
???? (ic->type != ICMP_SOURCE_QUENCH) &&
???? (ic->type != ICMP_TIME_EXCEEDED)) {
// 如果不是這三種ICMP信息,則該skb與IPVS無關
??*related = 0;
??return NF_ACCEPT;
?} /* Now find the contained IP header */
?offset += sizeof(_icmph);
?cih = skb_header_pointer(skb, offset, sizeof(_ciph), &_ciph);
?if (cih == NULL)
??return NF_ACCEPT; /* The packet looks wrong, ignore */
// 找的是ICMP信息中包含的原始包中的協議,而不是ICMP
?pp = ip_vs_proto_get(cih->protocol);
?if (!pp)
??return NF_ACCEPT; /* Is the embedded protocol header present? */
// 如果是碎片不處理直接返回
?if (unlikely(cih->frag_off & __constant_htons(IP_OFFSET) &&
?????? pp->dont_defrag))
??return NF_ACCEPT; IP_VS_DBG_PKT(11, pp, skb, offset, "Checking incoming ICMP for"); offset += cih->ihl * 4; /* The embedded headers contain source and dest in reverse order */
// 查找IPVS連接
?cp = pp->conn_in_get(skb, pp, cih, offset, 1);
?if (!cp)
??return NF_ACCEPT; // 缺省的裁定結果是丟棄包
?verdict = NF_DROP; /* Ensure the checksum is correct */
?if (skb->ip_summed != CHECKSUM_UNNECESSARY &&
// 檢查一下IP頭的校驗和
???? ip_vs_checksum_complete(skb, ihl)) {
??/* Failed checksum! */
??IP_VS_DBG(1, "Incoming ICMP: failed checksum from %d.%d.%d.%d!\n",
???? NIPQUAD(iph->saddr));
??goto out;
?} /* do the statistics and put it back */
// 進行輸入統計
?ip_vs_in_stats(cp, skb);
// 如果內部協議是TCP/UDP,發送偏移量要包括前4個字節: 源端口和目的端口
?if (IPPROTO_TCP == cih->protocol || IPPROTO_UDP == cih->protocol)
??offset += 2 * sizeof(__u16);
// 發送ICMP
?verdict = ip_vs_icmp_xmit(skb, cp, pp, offset);
?/* do not touch skb anymore */ out:
?__ip_vs_conn_put(cp); return verdict;
} /* net/ipv4/ipvs/ip_vs_xmit.c */ /*
?*?ICMP packet transmitter
?*?called by the ip_vs_in_icmp
?*/
int
ip_vs_icmp_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
??struct ip_vs_protocol *pp, int offset)
{
?struct rtable?*rt;?/* Route to the other host */
?int mtu;
?int rc; EnterFunction(10); /* The ICMP packet for VS/TUN, VS/DR and LOCALNODE will be
??? forwarded directly here, because there is no need to
??? translate address/port back */
?if (IP_VS_FWD_METHOD(cp) != IP_VS_CONN_F_MASQ) {
// 如果不是NAT情況的IPVS連接, 即是TUNNEL或DR,直接調用連接的發送函數發送
??if (cp->packet_xmit)
???rc = cp->packet_xmit(skb, cp, pp);
??else
???rc = NF_ACCEPT;
??/* do not touch skb anymore */
??atomic_inc(&cp->in_pkts);
??goto out;
?} /*
? * mangle and send the packet here (only for VS/NAT)
? */
// 查找路由
?if (!(rt = __ip_vs_get_out_rt(cp, RT_TOS(skb->nh.iph->tos))))
??goto tx_error_icmp; /* MTU checking */
?mtu = dst_mtu(&rt->u.dst);
?if ((skb->len > mtu) && (skb->nh.iph->frag_off&__constant_htons(IP_DF))) {
// 數據包過長超過MTU,但又是不允許分片的,發送ICMP出錯包
??ip_rt_put(rt);
??icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu));
??IP_VS_DBG_RL("ip_vs_in_icmp(): frag needed\n");
??goto tx_error;
?} /* copy-on-write the packet before mangling it */
// 讓skb可寫
?if (!ip_vs_make_skb_writable(&skb, offset))
??goto tx_error_put; // skb留出足夠的硬件頭空間
?if (skb_cow(skb, rt->u.dst.dev->hard_header_len))
??goto tx_error_put; /* drop the old route when skb is not shared */
?dst_release(skb->dst);
?skb->dst = &rt->u.dst;
// 修改ICMP包
?ip_vs_nat_icmp(skb, pp, cp, 0); /* Another hack: avoid icmp_send in ip_fragment */
?skb->local_df = 1; // 將該包用OUTPUT點的hook_ops進行處理
?IP_VS_XMIT(skb, rt); // NF_STOLEN表示該skb不用返回到正常的IP棧了
?rc = NF_STOLEN;
?goto out; tx_error_icmp:
?dst_link_failure(skb);
? tx_error:
?dev_kfree_skb(skb);
?rc = NF_STOLEN;
? out:
?LeaveFunction(10);
?return rc;
? tx_error_put:
?ip_rt_put(rt);
?goto tx_error;
}

總結

以上是生活随笔為你收集整理的ip_vs实现分析(2)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

日韩精品一区二区三区免费视频观看 | 久久久国产一区 | 91精品在线观看视频 | 欧美成人在线网站 | 国产精品门事件 | 在线免费观看黄色 | 国产原创av在线 | 亚洲激情在线播放 | 美女网站免费福利视频 | 亚洲在线黄色 | 欧美一级小视频 | 国产精品久久久久久高潮 | 久久精品日产第一区二区三区乱码 | 久久免费视频播放 | 国产精品久久久久久久久久99 | 99产精品成人啪免费网站 | 亚洲精品免费观看视频 | 美女免费视频黄 | 97在线观看免费视频 | 天天射天天干 | 日本中文在线 | 夜夜夜草| 国产精品一区二区白浆 | 99在线热播精品免费 | 亚洲久草在线视频 | 国产色视频网站2 | 成人av片在线观看 | 国产毛片久久 | av综合在线观看 | 丁香婷婷激情 | 日韩a在线播放 | av软件在线观看 | 日本精品在线视频 | 日韩高清成人 | 一区二区伦理 | 亚洲国产精品电影在线观看 | 人人爱人人爽 | 国产一区二区在线免费 | 日韩理论电影在线观看 | 欧美激情精品一区 | 欧美资源在线观看 | 中文字幕日韩免费视频 | 成人午夜av电影 | 日韩网站视频 | 国产特级毛片 | 人人爽人人插 | 麻豆系列在线观看 | 黄色1级大片 | 91九色视频导航 | 992tv在线观看 | 五月婷婷丁香在线观看 | 国产在线观看免费 | 免费观看一级成人毛片 | 99精品久久久久 | 在线免费观看黄色 | 永久黄网站色视频免费观看w | 亚洲 欧美 精品 | 91精品国产乱码在线观看 | 日韩精品电影在线播放 | 日韩视频免费观看高清完整版在线 | 久久久久久久久久伊人 | 亚洲精品久久久久久中文传媒 | 免费看的黄色网 | 日韩免费视频在线观看 | 五月在线 | 97爱| 国产精品美乳一区二区免费 | 2023av在线| 免费观看一级一片 | 日韩毛片在线免费观看 | 欧美日韩国产在线 | 国产精品一区二区无线 | 综合久久综合久久 | 日韩欧美精品一区二区三区经典 | 在线国产视频 | 欧美色婷婷 | 久久久国产一区二区三区四区小说 | 最近最新中文字幕视频 | 久久图| 亚洲综合在线一区二区三区 | av电影 一区二区 | 亚洲涩综合 | www黄色大片| 国产伦精品一区二区三区免费 | 97精品久久人人爽人人爽 | 欧美日韩另类在线 | 一级片黄色片网站 | 免费观看性生交大片3 | 97在线播放视频 | 91爱爱视频 | 国产在线播放一区二区 | 蜜臀久久99静品久久久久久 | 黄网站www| 91av99| 91在线你懂的 | 国产免费国产 | 中文字幕精品一区 | 91亚洲精 | 久久论理 | 久热色超碰 | 成年人免费观看国产 | 午夜久久福利视频 | 精品日韩在线一区 | 热re99久久精品国产66热 | 狠狠躁日日躁夜夜躁av | 亚洲深夜影院 | 成人久久18免费网站麻豆 | 激情五月婷婷激情 | av日韩精品 | 曰韩在线 | 九九热免费观看 | 日韩高清在线一区 | 亚洲黄色成人网 | 欧美日本国产在线观看 | 中文字幕乱在线伦视频中文字幕乱码在线 | 久久久久精 | 国内精品久久久精品电影院 | 中文av资源站 | 97电影手机版 | 香蕉在线视频播放网站 | www免费在线观看 | 中文视频在线播放 | 欧美激情综合网 | 在线观看亚洲国产 | 中文字幕第一页在线播放 | 国产黄色精品在线 | 夜夜躁日日躁狠狠久久88av | 免费人人干 | 国产精品美女999 | 99r在线观看 | 国产品久精国精产拍 | 色综合天天 | 亚洲第二色 | 久久久久国产精品免费免费搜索 | 精品9999| 久草在线99 | 国产精品中文久久久久久久 | 日韩免费网站 | 91热爆视频 | 91亚洲精品久久久中文字幕 | 日韩欧美高清在线 | 91精品久久香蕉国产线看观看 | 亚洲激情影院 | 欧美精品色 | 日韩视频一 | 中文字幕乱码一区二区 | 97国产情侣爱久久免费观看 | 久久久久久福利 | 久久视精品 | 好看的国产精品视频 | 久久国产精品久久w女人spa | 国产a国产a国产a | 欧美美女视频在线观看 | 草免费视频 | 在线免费高清视频 | 亚洲理论在线观看 | 久久精品小视频 | 中文字幕中文字幕中文字幕 | 亚洲涩涩网 | 中文字幕在线观看一区二区 | 午夜精品一区二区国产 | 99热播精品 | 国产福利专区 | 天天干天天碰 | 欧美日韩不卡在线观看 | 成人影视片 | 精品专区一区二区 | 视频精品一区二区三区 | 欧美精选一区二区三区 | 美女视频黄是免费的 | a在线观看免费视频 | 成年人黄色免费视频 | 午夜精品久久久久久久99热影院 | 亚洲精品免费在线播放 | 丁香花在线观看免费完整版视频 | 国产一区二区播放 | 午夜丰满寂寞少妇精品 | 亚洲自拍偷拍色图 | 91久久国产自产拍夜夜嗨 | 精品一区二区免费在线观看 | 久久精品老司机 | 免费在线色 | 一区二区三区在线免费观看视频 | 亚洲免费成人av电影 | 亚洲无吗天堂 | 亚洲涩涩涩 | 99热手机在线观看 | 狠狠色狠狠色终合网 | 中文字幕免费一区二区 | 午夜av免费观看 | 欧美日韩视频精品 | 在线观看中文av | 视频在线日韩 | 欧美久久久久久久久久久久 | 黄污污网站 | 国产群p视频 | www亚洲一区 | 日韩av在线一区二区 | 激情av在线资源 | 日韩精品欧美视频 | 国产亚洲精品无 | 91在线看视频 | 色综合天天综合在线视频 | a级国产乱理论片在线观看 特级毛片在线观看 | 国产精品综合久久久久 | 国内精品久久久久久久久久久 | 国产成人精品一区二区三区福利 | 久久人人精品 | 青青久草在线 | 中国黄色一级大片 | 国产精品日韩在线播放 | 韩国av免费 | 欧美精品免费在线观看 | 在线免费观看国产视频 | 九九九热精品免费视频观看 | 日韩电影精品 | 在线观看国产日韩欧美 | 成人免费在线观看电影 | 久久久蜜桃 | 国产精品一区二区视频 | 久久精品综合视频 | 成人免费视频播放 | 8x成人在线 | 久久国产精品系列 | 亚洲国产精品500在线观看 | 亚洲精品乱码久久久久久蜜桃动漫 | 久久无码av一区二区三区电影网 | 成人小视频在线免费观看 | av黄色av| 超碰97人人在线 | 六月婷操 | 91片黄在线观 | 久草在线视频免赞 | 国产精品视频大全 | 香蕉在线视频观看 | 色婷婷亚洲综合 | 美国人与动物xxxx | 91麻豆精品国产自产在线游戏 | 亚洲一区尤物 | 国产精品一区二区中文字幕 | 午夜av不卡 | 久久国产一区二区三区 | 国产精品久久久久久久久久妇女 | 国产精品色视频 | 2018亚洲男人天堂 | 国产精品一区二区美女视频免费看 | 玖操| 国产自在线观看 | 国产艹b视频 | 中文字幕日韩在线播放 | 亚洲综合色丁香婷婷六月图片 | 久久99视频精品 | 在线免费观看欧美日韩 | 91丨九色丨蝌蚪丰满 | 日本女人逼 | 九九久久国产精品 | 久久久久视 | 久久不卡免费视频 | 欧美日韩国产页 | 久草在线综合 | 久久国产网站 | avav片| 视频 国产区 | 成人在线视频观看 | 日韩精品久久久久久久电影竹菊 | 在线观看国产区 | 99热最新网址| 久久高清 | av看片在线 | 国产探花视频在线播放 | 在线精品视频免费播放 | 91精品啪在线观看国产 | 天天操夜操 | 中文字幕在线国产 | 在线不卡视频 | 在线看片91 | 日韩成人不卡 | 日韩在线免费小视频 | 国产91大片 | 亚洲国产欧美一区二区三区丁香婷 | 国产精品1000 | 国产成人精品女人久久久 | 国产精品久久久久一区二区三区 | 91久久国产精品 | 999热视频 | 国产在线观看网站 | 91成人免费视频 | 精品亚洲va在线va天堂资源站 | 国产精品白丝av | 精品国自产在线观看 | 国产91九色蝌蚪 | 操操操操网 | 九九久久国产精品 | 久久久久久免费网 | 久久婷婷激情 | 久久综合视频网 | 日韩av一区在线观看 | 热久久免费国产视频 | 在线免费黄色av | 在线免费观看黄色大片 | 一区二区免费不卡在线 | 亚洲一级电影在线观看 | 91九色精品国产 | 成全在线视频免费观看 | 国产精品国产三级国产aⅴ入口 | 久草在线免费看视频 | 天天做天天爱天天爽综合网 | 亚洲毛片在线观看. | 99久久精品免费看国产免费软件 | 国产成人在线免费观看 | 丁香婷婷激情五月 | 欧美一级性生活视频 | 91在线日本 | 中文字幕欧美日韩va免费视频 | 中文在线最新版天堂 | 欧美一区二区精美视频 | 亚洲精品一区二区网址 | 国产成人精品亚洲精品 | 国产一级黄色av | 亚洲永久精品一区 | 日韩午夜三级 | 国产精品久久久久av免费 | www久草| 国产精品免费久久久久影院仙踪林 | 日韩高清精品一区二区 | 久久精品这里都是精品 | 狠狠干电影 | 中文字幕在线播放日韩 | 夜夜爽夜夜操 | 成年人看片 | 中文字幕国产视频 | 激情电影影院 | 精品久久久久一区二区国产 | 日韩激情视频在线观看 | 国内视频在线 | 久久黄视频 | 五月激情综合婷婷 | 色婷婷综合久久久久中文字幕1 | avlulu久久精品 | 欧美一性一交一乱 | 久久精品久久久久久久 | 国产视频91在线 | 天天操天天摸天天干 | 成年人在线观看 | 精品国产伦一区二区三区免费 | 日本深夜福利视频 | 97精产国品一二三产区在线 | 久久久午夜精品福利内容 | 99精品久久精品一区二区 | 不卡国产视频 | 日韩天天操 | 婷婷国产v亚洲v欧美久久 | 日韩激情久久 | 国产欧美精品一区二区三区四区 | 福利二区视频 | av成人免费在线 | 亚洲国产高清在线观看视频 | 久精品视频 | 色是在线视频 | 日本中文不卡 | 久久久久久国产精品免费 | 欧美另类美少妇69xxxx | 四虎天堂 | 免费色视频| 91成人在线观看高潮 | 欧美日韩p片 | 国产乱码精品一区二区蜜臀 | 免费看成人av | 亚洲午夜精品久久久久久久久 | 国产在线观看网站 | 欧洲黄色片 | 午夜影视一区 | 色天堂在线视频 | 欧美日韩不卡在线 | 亚洲另类视频在线观看 | 精品国产123 | 国产欧美精品一区二区三区四区 | 中文字幕在线观看网址 | 毛片888| 国产视频精品久久 | 男女视频久久久 | 国产成人一区二区三区免费看 | 五月视频 | 久久视频免费观看 | 日韩乱码中文字幕 | 又黄又爽又刺激的视频 | 久操视频在线 | 中文字幕视频一区二区 | 国产免费作爱视频 | 国产精品国产亚洲精品看不卡 | 探花视频在线观看免费版 | 亚洲精品久久久久58 | 91九色综合 | 成人av影视在线 | 久久免费av电影 | 欧美日韩精品免费观看视频 | 久久高清| 欧美精品在线免费 | 国产精品18久久久久vr手机版特色 | 91av视频网| 亚洲一区精品人人爽人人躁 | 精品久久一区二区三区 | 在线播放亚洲激情 | 亚洲精品综合一区二区 | 最新国产在线视频 | 在线观看精品视频 | 欧美精品在线免费 | 在线观看av中文字幕 | 毛片一区二区 | 亚洲精品1234区 | 四虎成人精品 | 九草在线观看 | 久久综合福利 | 久艹在线播放 | 欧美一区二区三区四区夜夜大片 | 亚洲免费精品视频 | 国内精品视频免费 | 在线之家免费在线观看电影 | 91成人破解版 | 最新日韩在线 | 国产亚洲欧洲 | 中文字幕av免费观看 | 九九色网| 日韩精品免费一区 | 久久综合九色九九 | 99中文视频在线 | 国产高清免费 | 国产在线91精品 | 97超碰在线免费观看 | 国产精品毛片一区视频 | 欧美一二三区在线播放 | 午夜精品久久久久久久99 | 久久高清视频免费 | 国内精品久久久久久久久久久久 | www.婷婷色 | 日韩在线资源 | 国产美女主播精品一区二区三区 | 五月天久久狠狠 | 日韩高清一二三区 | 色综合久久精品 | 久久国产精品99久久人人澡 | 毛片3| 国产日韩欧美视频在线观看 | av线上看 | 日韩成人高清在线 | 欧美va天堂在线电影 | 在线看成人 | 国产精品视频久久久 | 日本精品一区二区三区在线观看 | 中文字幕在线资源 | 亚洲精品激情 | 成人黄色电影在线观看 | 九九热免费精品视频 | 五月婷婷色播 | 久久国产精品一二三区 | 国内精品久久久久 | 欧洲亚洲激情 | 国产在线精品播放 | 91久久精品一区二区二区 | 免费在线观看成人小视频 | 国产黄色片在线免费观看 | 黄色大片免费播放 | 久久黄色免费观看 | 麻豆视频在线免费看 | 日韩av不卡在线播放 | 狠狠干天天色 | 欧美精品乱码99久久影院 | 色综合天天干 | 成人午夜网址 | 国产午夜精品久久 | 色噜噜噜噜 | 久久国产精品一区二区三区 | 精品国产免费一区二区三区五区 | 国产xvideos免费视频播放 | 超碰97中文| av在线一级 | 久久久久久久久久久久久国产精品 | 激情五月在线观看 | 欧美精品乱码99久久影院 | 黄色片网站av | 精品无人国产偷自产在线 | 丁五月婷婷 | 中文字幕乱在线伦视频中文字幕乱码在线 | 在线观看成人小视频 | 色在线视频网 | 久久久久亚洲国产精品 | 18国产精品白浆在线观看免费 | 亚洲黄色大片 | 天堂av观看 | 日韩成人不卡 | 婷婷丁香色 | 又黄又爽又色无遮挡免费 | 九九热免费精品视频 | 香蕉视频亚洲 | 欧美成人免费在线 | 日韩高清观看 | 一级精品视频在线观看宜春院 | 免费国产一区二区视频 | 九九精品视频在线 | 一区二区三区在线视频观看58 | 久久99久久99免费视频 | 国产录像在线观看 | 黄色avwww | 少妇18xxxx性xxxx片 | 手机看片国产日韩 | 超级av在线 | 久久久精品免费看 | 国产精品乱看 | 亚洲精品玖玖玖av在线看 | 天天曰| 91精品国产91热久久久做人人 | 国产亚洲婷婷 | 99在线视频播放 | 中文字幕在线一区观看 | 在线国产精品视频 | 六月激情丁香 | 午夜精品视频免费在线观看 | 国产人免费人成免费视频 | 在线成人中文字幕 | 欧美激情精品一区 | 在线中文字幕视频 | 国产在线不卡一区 | 中文区中文字幕免费看 | 草久久久久久 | 成人综合日日夜夜 | 在线小视频| 亚洲免费成人 | 超薄丝袜一二三区 | 91久久精品日日躁夜夜躁国产 | 99国产精品久久久久久久久久 | 色网站中文字幕 | 亚洲成人999 | 国产精品欧美在线 | 天天射天天干天天插 | 久久久久看片 | 国产成人福利片 | 美女网站色 | 国产美女精品视频 | 91激情| 欧美网站黄色 | 韩国av免费在线 | 精品国产一区二区三区日日嗨 | 亚洲男男gaygay无套同网址 | 四虎在线免费视频 | 亚洲aaa级| 精品国产理论 | 精品美女久久 | av免费观看在线 | 久久国产精品99精国产 | 亚洲精品国产日韩 | 超碰97免费在线 | 欧美激情视频在线免费观看 | 久久久久看片 | 国产三级香港三韩国三级 | 国产精品久久久久久久久久久久午夜 | 黄av免费 | 国产成人91 | 精品在线免费视频 | 久久99亚洲精品久久久久 | 五月开心六月伊人色婷婷 | 伊香蕉大综综综合久久啪 | 国产一区成人在线 | 欧亚日韩精品一区二区在线 | 亚洲永久精品视频 | 黄网站www| 成人h在线播放 | 成人黄色av网站 | 欧美日韩超碰 | 91精品无人成人www | 久久久久国产成人精品亚洲午夜 | 中文字幕资源网 国产 | 免费欧美高清视频 | 亚洲一区二区黄色 | 在线不卡中文字幕播放 | 欧美影片 | 麻豆精品传媒视频 | 国产中文字幕一区二区三区 | 久久久久久久久电影 | 黄色avwww| 久久久人| 国产精品一区在线观看 | 在线a人v观看视频 | 精品视频123区在线观看 | 91av免费观看| 精品一区二区影视 | 福利视频网址 | 欧美日韩一级久久久久久免费看 | 少妇bbbb搡bbbb桶| 日本论理电影 | 日韩精品久久久免费观看夜色 | a√国产免费a | 精品国产一区二区三区av性色 | 国产黄色在线观看 | 在线免费观看黄色大片 | 日韩在线无 | 日本公妇色中文字幕 | 国语对白少妇爽91 | 日韩激情在线 | 在线观看理论 | 国产视频在线一区二区 | 香蕉视频啪啪 | 日韩理论片在线 | 99这里有精品 | 日韩精品一区二区不卡 | 亚洲天堂精品视频在线观看 | 亚洲无吗天堂 | 视频在线在亚洲 | 国内精品视频在线 | 日韩欧美在线播放 | 看毛片网站 | 精品视频在线视频 | 国产中文欧美日韩在线 | 亚洲涩涩网 | 人人草天天草 | 日韩美av在线 | 97超碰国产精品女人人人爽 | av电影免费在线看 | 久热爱| 国产精品国产三级国产 | 国产视频精品在线 | 成人免费中文字幕 | 久久精品久久久久 | 99r精品视频在线观看 | 91福利社区在线观看 | 国产婷婷vvvv激情久 | 国产精品自在线拍国产 | 国产黄色免费电影 | 国产精品成人aaaaa网站 | 欧美日韩1区2区 | 人人澡人人澡人人 | 97在线免费视频观看 | 激情五月***国产精品 | 玖玖玖在线观看 | 麻豆传媒在线视频 | 国产精品久久久久久麻豆一区 | 日韩精品一区二区在线观看 | 色94色欧美 | 国产流白浆高潮在线观看 | 久久午夜电影网 | 九九热在线免费观看 | 在线观看免费av网 | 久黄色 | 欧美视频在线观看免费网址 | 婷婷精品在线 | 欧美日韩久久不卡 | 免费在线黄色av | 在线观看久久 | 国语自产偷拍精品视频偷 | 日韩欧美在线免费 | 国产18精品乱码免费看 | 久久亚洲视频 | 在线观看成人毛片 | 香蕉影院在线播放 | 国产资源在线免费观看 | 日韩最新在线视频 | av在线播放中文字幕 | 久亚洲 | 99欧美视频 | 一级黄色片在线观看 | 亚洲天天在线日亚洲洲精 | 天天se天天cao天天干 | 婷婷激情小说网 | 粉嫩av一区二区三区四区 | 久草网在线 | 超碰免费97 | 国产一区视频在线观看免费 | 国产精品久久久久久久久久久杏吧 | 精品福利视频在线观看 | 麻豆视频在线播放 | 精品在线观看一区二区三区 | 国产又粗又猛又爽 | 国产一区二区不卡视频 | 综合天天 | 亚洲干视频在线观看 | 伊人永久 | 黄色特级片 | 欧美国产日韩在线观看 | 国产69精品久久99不卡的观看体验 | 特级黄录像视频 | 激情av在线资源 | 天天爽夜夜爽人人爽曰av | 操操操影院 | 在线只有精品 | 一区二区三区韩国免费中文网站 | 成 人 黄 色 免费播放 | 九九精品视频在线看 | 日韩久久久 | 91大神免费在线观看 | 免费在线观看91 | 人人爱人人添 | 国产99久久久国产 | 亚洲91中文字幕无线码三区 | 久久久久www | 亚洲成av人片在线观看无 | 日韩成人精品在线观看 | 成人黄色小说在线观看 | 成人影视免费看 | 婷婷在线五月 | 久久精品国产一区二区电影 | 日韩一级黄色片 | 久久综合久久综合这里只有精品 | 欧美国产精品久久久久久免费 | 国产高清福利在线 | 国产黄色精品在线观看 | 亚洲精品字幕在线 | 免费高清av在线看 | 黄色看片 | 视频国产 | 久久尤物电影视频在线观看 | 天天色综合天天 | 免费精品国产 | 日本公乱妇视频 | 在线视频日韩精品 | 国产成人精品综合 | 日韩成人精品 | 一级片免费视频 | 国产成人精品一区二区三区在线观看 | 久久视频精品在线观看 | 色91在线 | 97色在线观看免费视频 | 美女福利视频一区二区 | av电影不卡在线 | 婷婷丁香av | 91精品视频免费看 | 综合色狠狠 | 国产精品 日韩精品 | 狠狠干天天干 | 91热这里只有精品 | 欧美成人69av | 国产香蕉视频在线观看 | 中文字幕在线观看资源 | 国产一区二区成人 | 一本一道久久a久久精品蜜桃 | 国产激情小视频在线观看 | 欧美性另类 | 在线午夜| 在线看片成人 | 精品在线视频一区二区三区 | 精品亚洲视频在线 | 人人射人人澡 | 婷婷在线精品视频 | 成人在线视频观看 | 97精品国产手机 | 中文字幕免费观看全部电影 | 亚洲成av人影院 | 免费网站污 | 黄色网www | 日韩欧美一区二区三区视频 | 欧美va电影 | 97日日 | 国产精品你懂的在线观看 | 国产中文字幕视频在线观看 | 免费网站看v片在线a | 中文字幕永久 | 色精品视频 | 九九久久国产 | 欧美成人一二区 | 精品美女在线观看 | 国产 欧美 日本 | 五月亚洲综合 | 操操操日日日干干干 | 日韩理论片中文字幕 | 91在线麻豆| www.色婷婷.com | 99r在线观看| 久久9999久久免费精品国产 | 在线观看视频一区二区三区 | 天天搞天天干天天色 | 国产精品大尺度 | 国产高清一 | 中文字幕免费中文 | 亚洲日本在线一区 | 麻豆影视在线免费观看 | 日韩精品免费一线在线观看 | 91视频在线观看免费 | 欧美色综合久久 | 五月激情站 | 91精品国产高清自在线观看 | 久久国内精品 | 国产精品女同一区二区三区久久夜 | 国产免费久久 | 欧美性脚交 | 成人高清在线观看 | 黄色片网站免费 | 日韩免费中文 | 国产精品久久久久久久久毛片 | 超碰av在线 | 国模精品在线 | 97超碰免费在线 | 欧美大片第1页 | 成人一级电影在线观看 | 97超碰精品 | 国产日本在线观看 | 中文字幕成人一区 | 天天摸天天舔 | 最新av电影网址 | 日韩有码中文字幕在线 | 免费在线观看日韩欧美 | 成人国产综合 | 91黄色视屏 | 色视频 在线 | 黄色大全视频 | 日韩精品一卡 | 久久一精品 | 在线你懂| 91中文视频 | 99 精品 在线 | 高清有码中文字幕 | 欧美久久精品 | 青青河边草免费 | 天天摸天天舔天天操 | 亚洲精品影视在线观看 | 99 视频 高清 | 欧美二区在线播放 | 国产日韩欧美在线观看视频 | 91视频在线免费看 | 福利视频一区二区 | 天天综合天天综合 | 91亚洲精品久久久蜜桃 | 久久精品一区二区三 | 四虎影视成人永久免费观看亚洲欧美 | 五月激情丁香图片 | 国产精品第三页 | 久久成人国产 | 99精品久久久久久久久久综合 | 狠狠干婷婷色 | 亚洲h色精品 | 国产精品久久久久久久久久ktv | a级国产乱理伦片在线播放 久久久久国产精品一区 | 岛国av在线免费 | 久久这里有精品 | 国产成本人视频在线观看 | 天天操导航 | 久久久福利 | 久久久国产精品久久久 | 久久综合色天天久久综合图片 | 成人午夜精品福利免费 | 日本久久久久久 | 久久久精品99 | 成人免费网站在线观看 | 成人黄色片在线播放 | 亚洲人成在线电影 | 中文字幕免费在线看 | 成人国产精品av | 亚洲在线精品视频 | 国产精品一区二区在线 | 美女在线免费视频 | 成人av一级片 | 日韩免费看片 | 亚洲精品一区中文字幕乱码 | 日韩精品三区四区 | 久久欧美精品 | 国产精品剧情 | 在线视频1卡二卡三卡 | 国产福利资源 | 日韩中文字幕免费视频 | 亚洲人人av | 天天干天天玩天天操 | 亚洲成人资源在线观看 | 中文字幕免费高清在线观看 | 日韩在线视频一区二区三区 | 福利一区在线视频 | 成人午夜性影院 | 美女视频免费精品 | 欧美精品一区二区在线观看 | 亚洲高清色综合 | 日韩在线 一区二区 | 久色 网| 久久大视频| 精品黄色在线 | 五月综合色 | 女人18片 | 中文字幕免费 | 国产黄网在线 | 日韩免费电影一区二区 | 亚洲欧美综合 | 中文字幕一区在线观看视频 | 91在线麻豆 | 九九精品毛片 | 国产一区二区不卡视频 | 欧美极品一区二区三区 | 在线观看成人福利 | av高清在线 | 久久全国免费视频 | 美女黄网久久 | 丝袜美女视频网站 | 日韩激情片在线观看 | 国产亚洲精品女人久久久久久 | 国产日韩欧美自拍 | 中文字幕精品一区二区三区电影 | 99精品久久只有精品 | 久久电影色 | 成人av亚洲 | 99国产精品免费网站 | 欧美成人影音 | 天堂av网站 | 人人爽人人爽人人片av | 天天干天天操天天入 | 亚洲精品高清视频 | 免费成人在线观看视频 | 国产免费小视频 | 五月花丁香婷婷 | 久久久久免费 | 一区二区三区四区五区在线 | 欧美aaa视频 | 97电影在线观看 | 国产美女精品视频 | 欧美一级在线观看视频 | 国产精品视频 | 久久99国产精品久久99 | 日韩精品高清不卡 | 国产一级在线观看视频 | 亚洲午夜久久久久久久久久久 | 又长又大又黑又粗欧美 | 成人黄色影片在线 | 大胆欧美gogo免费视频一二区 | 在线视频精品 | 亚洲开心色 | 99精品久久99久久久久 | 天天天天天天天操 | 91字幕| 9999亚洲| 欧美巨大荫蒂茸毛毛人妖 | 天天射一射 | 亚洲国产av精品毛片鲁大师 | 国产午夜亚洲精品 | 色99久久 | 国产成人一区二区三区 | 欧美一级电影 | 久久手机精品视频 | 久久久www成人免费精品张筱雨 | 97精品免费视频 | 天天天干 | 免费毛片aaaaaa | 香蕉视频国产在线观看 | wwwww.国产 | 国产69精品久久久久99尤 | 国产成人久久av免费高清密臂 | 中文字幕免费国产精品 | 国产 色 | 天天人人 | 999久久久免费精品国产 | 在线观看va | 成人在线视频免费观看 | 天天拍天天操 | 天天操天天操天天操天天操天天操天天操 | 久久免费成人精品视频 | 五月激情综合婷婷 | 亚洲国产高清在线 | 成人午夜剧场在线观看 | 亚洲精品久久久蜜桃 | 五月天婷婷在线视频 | 深爱激情av| 国产偷v国产偷∨精品视频 在线草 | 成人在线小视频 | 亚洲精品网页 | 91香蕉视频 | 不卡的一区二区三区 | 97超视频免费观看 | 激情久久伊人 | 六月丁香在线观看 | 午夜精品福利影院 | 国产精品美女久久久久久久久 | 91片在线观看 | 免费看的黄网站软件 | 五月天狠狠操 | 在线观看精品黄av片免费 | 久操操 | 日韩在线观看的 | 超碰97国产精品人人cao | 国产成人a亚洲精品v | 最新久久久 | 少妇bbr搡bbb搡bbb | 视频一区二区在线 | 91精品入口 | 久久久久婷 | 国产精品久久久久一区二区 | 麻豆免费精品视频 | 久久久国产精品成人免费 | 色综合久久中文综合久久牛 | 黄色三级免费观看 | 久久久久久影视 | 国产色啪 | 国产高清av | 99热超碰 | 五月婷婷久久综合 | 久久综合久久伊人 | 精品综合久久久 | 日韩在线大片 | 天天色天天干天天色 | 夜添久久精品亚洲国产精品 | 六月婷婷网 | 伊人伊成久久人综合网小说 | 欧美一区中文字幕 | 狠狠色狠狠综合久久 | 91视频在线观看免费 | 久久国语| 一区二区三区免费在线观看 |