精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何使用gRPC和Mutual TLS連接Python和Go應(yīng)用程序?

譯文
開發(fā) 項(xiàng)目管理
本教程通過使用Mutual TLS 身份驗(yàn)證的 gRPC 框架,向你介紹用 Python 和 Go 編寫的服務(wù)連接的過程。

【51CTO.com快譯】本教程通過使用Mutual TLS 身份驗(yàn)證的 gRPC 框架,向你介紹用 Python 和 Go 編寫的服務(wù)連接的過程。因多數(shù)開發(fā)者對(duì) Python/Django 和 Go 開發(fā)比較熟悉,本文將省略大多數(shù)無聊的東西,比如使用 Django 應(yīng)用程序引導(dǎo) virtualenv 或者如何“ manage.py runserver”它。

???

引言

有一個(gè)Python中的舊系統(tǒng)正在進(jìn)行大的修改。它是由兩部分組成的系統(tǒng):


  • Webapp是一個(gè)使用Django框架構(gòu)建的面向用戶的web應(yīng)用程序。它充當(dāng)API客戶機(jī),連接到幾個(gè)節(jié)點(diǎn)執(zhí)行一些操作。
  • 每個(gè)節(jié)點(diǎn)(服務(wù)器)都是一個(gè)用Python編寫的簡單服務(wù)器,它駐留在Nginx后面。一些節(jié)點(diǎn)位于私有網(wǎng)絡(luò)之外,通信通過公共網(wǎng)絡(luò)進(jìn)行。

在進(jìn)行一些清理、重構(gòu)和測試工作之后,客戶機(jī)基本上滿足了它的需求。另一方面,服務(wù)器有穩(wěn)定性和性能問題,所以在Go (Golang)重寫服務(wù)器是對(duì)性能提升很有幫助的解決方案。

而Python和Go之間的通信成了唯一的障礙。

用于客戶機(jī)和服務(wù)器之間通信的現(xiàn)有JSON API是舊的,沒有文檔記錄。正是因?yàn)閺牧汩_始重建它比試圖復(fù)興它更容易。將此API重寫為REST/JSON相對(duì)容易,但JSON作為交換格式將不能提供Python和Go之間的互換性和類型兼容性。在這兩種語言中,類型系統(tǒng)是不同的,要讓它工作是很繁瑣且容易出錯(cuò)的。

一個(gè)更好的解決方案是使用跨平臺(tái)的序列化格式,比如協(xié)議緩沖區(qū)(protobuf)。它的構(gòu)建是為了提供跨平臺(tái)兼容性,在Python和Go中得到很好的支持,而且它比JSON更小、更快。Protobuf可以與REST API一起使用,以確保編程語言之間的數(shù)據(jù)互操作性。但是一個(gè)更好的解決方案是使用gRPC框架來完全替換舊的API。

gRPC是一個(gè)遠(yuǎn)程過程調(diào)用(RPC)框架,它在跨服務(wù)通信場景中工作得非常好。它使用協(xié)議緩沖區(qū)作為接口定義語言(Interface Definition Language, IDL)和消息交換格式。gRPC使用HTTP/2作為傳輸,并支持傳輸層安全(TLS)協(xié)議,它可以在沒有TLS的情況下工作——基本上,這是大多數(shù)教程告訴我們的。這樣,通信是通過h2c協(xié)議完成的,本質(zhì)上是純文本HTTP/2,沒有TLS加密。然而,當(dāng)通過公共網(wǎng)絡(luò)進(jìn)行通信時(shí),TLS是必需的??紤]到現(xiàn)代安全威脅,TLS甚至應(yīng)該被考慮用于私有網(wǎng)絡(luò)連接[1]。

在本系統(tǒng)中,服務(wù)到服務(wù)的通信不需要區(qū)分客戶機(jī),也不需要向它們授予不同的權(quán)限。盡管如此,確保只有授權(quán)的客戶機(jī)才能與服務(wù)器通信是很重要的。使用互TLS (mTLS)作為身份驗(yàn)證機(jī)制很容易實(shí)現(xiàn)。

通常在TLS中,服務(wù)器有證書和公鑰/私鑰對(duì),而客戶端沒有。然后,服務(wù)器將其證書發(fā)送給客戶機(jī)進(jìn)行驗(yàn)證。在mTLS中,服務(wù)器和客戶機(jī)都有證書,服務(wù)器也驗(yàn)證客戶機(jī)的證書。只有在這之后,服務(wù)器才會(huì)授予對(duì)客戶端[2]的訪問權(quán)。

讓我們創(chuàng)建一個(gè)類似的東西——一個(gè)簡單的Python/Django web服務(wù),它將通過gRPC/mTLS調(diào)用Go服務(wù)器,并在瀏覽器中顯示結(jié)果,并從存儲(chǔ)庫的結(jié)構(gòu)開始。

代碼布局

對(duì)于這樣的項(xiàng)目,使用單個(gè)存儲(chǔ)庫(monorepo)就不需要共享API模式。對(duì)于如何組織代碼庫,每個(gè)人都有自己的偏好,只要記住protobuf編譯器,protoc,對(duì)如何組織代碼有自己的想法。

原型文件的位置會(huì)影響編譯后的代碼。它可能需要對(duì)編譯器標(biāo)志進(jìn)行一些試驗(yàn)來生成工作代碼。將原型文件放在帶代碼的主文件夾之外,這樣重新組織代碼就不會(huì)破壞原型編譯。

我建議這樣的目錄結(jié)構(gòu): 

tree -L 1 -d . . ├── certs ├── client ├── proto └── server 

  • certs -我們用于自簽名證書的公鑰基礎(chǔ)設(shè)施。
  • client - Python/Django web應(yīng)用程序和gRPC客戶端API。它基本上是一個(gè)' django-admin startproject client . '的結(jié)果,通過剝離配置,因?yàn)椴恍枰獢?shù)據(jù)庫。
  • proto -是放置gRPC的protobuf源文件的地方。
  • server - Go中的gRPC服務(wù)器。

公鑰基礎(chǔ)設(shè)施

要開始使用TLS,您需要客戶端和服務(wù)器的證書。要?jiǎng)?chuàng)建自簽名證書,我建議使用CloudFlare的PKI工具包CFSSL。

首先,您需要?jiǎng)?chuàng)建一個(gè)證書頒發(fā)機(jī)構(gòu)(CA),該機(jī)構(gòu)將用于為服務(wù)器和客戶端生成TLS證書。此CA證書還用于在建立TLS連接時(shí)驗(yàn)證另一方證書的真實(shí)性。

通過JSON文件配置CFSSL,并提供命令來生成默認(rèn)的配置模板開始:

cd certs cfssl print-defaults config > ca-config.json 

默認(rèn)ca-config。Json提供了足夠滿足我們需求的配置文件。讓我們生成一個(gè)CA證書簽名請(qǐng)求配置,證書和私鑰: 

cat > ca-csr.json <<EOF { "CN": "CA", "key": { "algo": "ecdsa", "size": 256 }, "names": [ { "C": "US", "ST": "CA", "L": "San Francisco" } ] } EOF  cfssl gencert -initca ca-csr.json | cfssljson -bare ca - 

客戶端證書、公鑰和私鑰: 

cat > client-csr.json <<EOF { "CN": "client", "key": { "algo": "ecdsa", "size": 256 }, "names": [ { "C": "US", "ST": "CA", "L": "San Francisco" } ] } EOF  cfssl gencert \ -ca=ca.pem \ -ca-key=ca-key.pem \ -config=ca-config.json \ -profile=client client-csr.json | cfssljson -bare client 

服務(wù)器的IP地址必須包含在API服務(wù)器證書的主題替代名稱列表中。這將確保遠(yuǎn)程客戶端可以驗(yàn)證證書。 

cat > server-csr.json <<EOF { "CN": "server", "key": { "algo": "ecdsa", "size": 256 }, "names": [ { "C": "US", "ST": "CA", "L": "San Francisco" } ] } EOF  cfssl gencert \ -ca=ca.pem \ -ca-key=ca-key.pem \ -config=ca-config.json \ -hostname=127.0.0.1 \ -profile=server server-csr.json | cfssljson -bare server 

Protobuf和gRPC

現(xiàn)在證書已經(jīng)準(zhǔn)備好了,下一步是為gRPC所需的API創(chuàng)建一個(gè)模式定義。它將是一個(gè)名為DiceService的簡單服務(wù),以演示gRPC和mTLS是如何工作的。

下面是proto/api.proto文件。它定義了一個(gè)RPC端點(diǎn)RollDie,該端點(diǎn)接受RollDieRequest并在rolldierresponse的值字段中返回滾模的值。 

syntax = "proto3";  option go_package = "server/api";  package api;  message RollDieRequest {}  message RollDieResponse { int32 value = 1; }  service DiceService { rpc RollDie (RollDieRequest) returns (RollDieResponse) {} } 

下一步是使用protobuf編譯器- protoc從原型定義中為每種語言生成代碼。此外,每種語言都需要自己的一組依賴項(xiàng)。

安裝所需的包,并構(gòu)建Python的原型文件: 

pip install grpcio grpcio-tools python -m grpc_tools.protoc -I proto --proto_path=proto \ --python_out=client/api --grpc_python_out=client/api proto/api.proto 

編譯后的文件位于client/api目錄中。由于某些原因,protocol的Python編譯器在生成的代碼中使用了絕對(duì)導(dǎo)入[3],它應(yīng)該是固定的: 

cd client/api && cat api_pb2_grpc.py | \ sed -E 's/^(import api_pb2.*)/from client.api \1/g' > api_pb2_grpc.tmp && \ mv -f api_pb2_grpc.tmp api_pb2_grpc.py 

安裝所需的模塊和構(gòu)建原型文件。protoc-gen-go和protoc-gen-go-grpc默認(rèn)安裝在GOBIN目錄下。你可以覆蓋GOBIN并將其指向virtualenv的bin目錄——這使得之后更容易清理。 

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest protoc -I. --go_out=. --go-grpc_out=. proto/api.proto 

編譯后的文件位于server/api目錄中。

Python客戶端

為了將其余的代碼庫與Protobuf/gRPC代碼隔離開來,創(chuàng)建一個(gè)簡單的包裝器:api/client.py。該包裝器需要CA證書、客戶端證書和密鑰來建立到提供地址的TLS連接。 

import grpc  from . import api_pb2, api_pb2_grpc  class Certs: root = None cert = None key = None  def __init__(self, root, cert, key): self.root = open(root, 'rb').read() self.cert = open(cert, 'rb').read() self.key = open(key, 'rb').read()  class Client: rpc = None  def __init__(self, addr: str, crt: Certs): creds = grpc.ssl_channel_credentials(crt.root, crt.key, crt.cert) channel = grpc.secure_channel(addr, creds) self.rpc = api_pb2_grpc.DiceServiceStub(channel)  def roll_die(self) -> int: return self.rpc.RollDie(api_pb2.RollDieRequest()).value 

這是如何在web應(yīng)用程序的視圖中使用這個(gè)客戶端。這里的變量值包含RPC調(diào)用的結(jié)果。 

ICONS = ["?", "?", "?", "?", "?", "?", "?"]  def grpc(request): grpc_addr = "127.0.0.1:8443"  crt = api.Certs('certs/ca.pem', 'certs/client.pem', 'certs/client-key.pem') try: value = api.Client(grpc_addr, crt).roll_die() except Exception as e: logger.exception(e)  return HttpResponse('Value: ' + ICONS[value]) 

現(xiàn)在,如果你試圖通過啟動(dòng)web應(yīng)用程序并點(diǎn)擊相應(yīng)的視圖來執(zhí)行這段代碼,你會(huì)得到一個(gè)錯(cuò)誤。這是預(yù)期的-服務(wù)器還沒有創(chuàng)建。這里有趣的部分是錯(cuò)誤——它會(huì)說一些關(guān)于“連接到所有地址失敗”的東西,這并不多。但是設(shè)置環(huán)境變量GRPC_VERBOSITY=debug會(huì)使gRPC輸出更加詳細(xì),并有助于進(jìn)行故障排除。它可以在client/settings.py文件中完成,例如: 

if DEBUG: os.environ['GRPC_VERBOSITY'] = 'debug' 

服務(wù)器端

在server/api/server.go中實(shí)現(xiàn)DiceService邏輯。它初始化偽隨機(jī)數(shù)生成器,并根據(jù)請(qǐng)求返回范圍從1到6的隨機(jī)值。 

// Number of dots on a die const Dots = 6  type Server struct { UnimplementedDiceServiceServer rnd *rand.Rand }  func NewServer() *Server { return &Server{ rnd: rand.New(rand.NewSource(time.Now().UnixNano())), } }  func (s *Server) RollDie(ctx context.Context, req *RollDieRequest) (*RollDieResponse, error) { // rand.Intn returns a value in [0, Dots) interval value := s.rnd.Intn(Dots) + 1 return &RollDieResponse{Value: int32(value)}, nil } 

服務(wù)實(shí)現(xiàn)已經(jīng)準(zhǔn)備就緒。下一步是為gRPC服務(wù)器提供證書并啟動(dòng)它。你可以把它放在這里服務(wù)器/服務(wù)器。啟用mTLS的一個(gè)重要時(shí)刻是設(shè)置tls。配置{ClientAuth: tls。RequireAndVerifyClientCert},它指示服務(wù)器請(qǐng)求并驗(yàn)證客戶端的證書。 

secureAddress := "127.0.0.1:8443"  serverCert, err := tls.LoadX509KeyPair("certs/server.pem", "certs/server-key.pem") if err != nil { log.Printf("failed to load server cert/key: %s", err) os.Exit(1) }  caCert, err := ioutil.ReadFile("certs/ca.pem") if err != nil { log.Printf("failed to load CA cert: %s", err) os.Exit(1) }  caCertPool := x509.NewCertPool() caCertPool.AppendCertsFromPEM(caCert) creds := credentials.NewTLS(&tls.Config{ Certificates: []tls.Certificate{serverCert}, ClientCAs: caCertPool, ClientAuth: tls.RequireAndVerifyClientCert, })  secureSrv := grpc.NewServer(grpc.Creds(creds)) log.Printf("Starting gRPC server, address=%q", secureAddress) lis, err := net.Listen("tcp", secureAddress) if err != nil { log.Printf("failed to listen: %s", err) os.Exit(1) }  api.RegisterDiceServiceServer(secureSrv, api.NewServer()) if err := secureSrv.Serve(lis); err != nil { log.Printf("failed to serve: %s", err) os.Exit(1) } 

現(xiàn)在使用運(yùn)行server/server運(yùn)行服務(wù)器。去,確保web應(yīng)用程序運(yùn)行和訪問它的url -你應(yīng)該看到RPC請(qǐng)求的結(jié)果。gRPC服務(wù)器不會(huì)記錄任何關(guān)于傳入請(qǐng)求的信息,而且很難通過查看服務(wù)器的輸出來判斷發(fā)生了什么。 

幸運(yùn)的是,有一個(gè)API可以攔截RPC請(qǐng)求的執(zhí)行,您可以使用它添加類似于任何HTTP服務(wù)器的日志記錄。它接近于Django中間件的工作方式。下面是一個(gè)簡單的日志攔截器。要使用它,您需要將它傳遞給grpc.NewServer。 

func loggingInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { ts := time.Now()  peer, ok := peer.FromContext(ctx) if !ok { return nil, status.Errorf(codes.InvalidArgument, "missing peer") } md, ok := metadata.FromIncomingContext(ctx) if !ok { return nil, status.Errorf(codes.InvalidArgument, "missing metadata") }  res, err := handler(ctx, req)  log.Printf("server=%q ip=%q method=%q status=%s duration=%s user-agent=%q", md[":authority"][0], peer.Addr.String(), info.FullMethod, status.FromContextError(err).Code(), time.Since(ts), md["user-agent"][0], ) return res, err }  ...  secureSrv := grpc.NewServer(grpc.Creds(creds), grpc.UnaryInterceptor(loggingInterceptor)) 

看來目標(biāo)已經(jīng)達(dá)到了。客戶端通過gRPC與服務(wù)器通信,由于mTLS,連接是安全的,并且是相互驗(yàn)證的。但請(qǐng)記住,該服務(wù)器非?;A(chǔ),需要進(jìn)行一些工作和加固,才能在公共網(wǎng)絡(luò)上的生產(chǎn)環(huán)境中使用它。

讓我們把服務(wù)器放在Nginx后面

另一種方法是把Nginx放在服務(wù)器之前,我更喜歡它,而不是把Go服務(wù)暴露在互聯(lián)網(wǎng)上。開箱即用,你將獲得所有經(jīng)過戰(zhàn)斗測試的功能,如負(fù)載平衡和速率限制,它還將減少你需要編寫和支持的代碼數(shù)量。

Nginx從1.13.10版本開始就支持gPRC,并且可以終止、檢查和路由gRPC方法調(diào)用。所以讓我們?cè)诜?wù)器之前添加Nginx,讓它處理mTLS和通過未加密的HTTP/2的代理請(qǐng)求。這個(gè)設(shè)置有點(diǎn)復(fù)雜,所以這里是圖表: 

???

讓我們從客戶機(jī)中的另一個(gè)視圖開始。它將使用不同的端口號(hào)。 

def nginx(request): nginx_addr = "127.0.0.1:9443"  crt = api.Certs('certs/ca.pem', 'certs/client.pem', 'certs/client-key.pem') try: value = api.Client(nginx_addr, crt).roll_die() except Exception as e: logger.exception(e)  return HttpResponse('Value: ' + ICONS[value]) 

因?yàn)镹ginx將完成所有圍繞TLS的工作,所以沒有必要在服務(wù)器代碼中為gRPC服務(wù)器提供證書: 

insecureAddress := "127.0.0.1:50051" insecureSrv := grpc.NewServer(grpc.UnaryInterceptor(loggingInterceptor)) log.Printf("Starting gRPC server (h2c), address=%q", insecureAddress) lis, err := net.Listen("tcp", insecureAddress) if err != nil { log.Printf("failed to listen: %s", err) os.Exit(1) }  api.RegisterDiceServiceServer(insecureSrv, api.NewServer()) if err := insecureSrv.Serve(lis); err != nil { log.Printf("failed to serve: %s", err) os.Exit(1) } 

Nginx的配置文件:Nginx .conf這個(gè)配置禁用了妖魔化,并啟動(dòng)了一個(gè)記錄到stdout的進(jìn)程。這對(duì)于演示目的來說更方便。

NoneBashCSSCC#GoHTMLJavaJavaScriptJSONPHPPowershellPythonRubySQLTypeScriptYAMLCopy 

events { worker_connections 1024; }  # Do not use it in production! daemon off; master_process off;  http {  upstream grpcservers { server 127.0.0.1:50051; }  server { listen 9443 ssl http2;  error_log /dev/stdout; access_log /dev/stdout;  # Server's tls config ssl_certificate certs/server.pem; ssl_certificate_key certs/server-key.pem;  # mTLS part ssl_client_certificate certs/ca.pem; ssl_verify_client on;  location / { grpc_pass grpc://grpcservers; } } } 

開啟Nginx。 

nginx -p $(pwd) -c nginx.conf 

確保所有的服務(wù)都啟動(dòng)了,并訪問之前創(chuàng)建的視圖的URL——您應(yīng)該看到RPC請(qǐng)求的結(jié)果。如果有些東西不能工作-檢查這篇文章在GitHub上的代碼。


【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】


責(zé)任編輯:黃顯東 來源: hackernoon.com
相關(guān)推薦

2021-10-29 16:18:14

Streamlit Python

2023-06-10 23:01:41

GrpcProtobuf數(shù)據(jù)

2009-05-27 14:31:53

NetBeansEclipsPHP

2021-06-08 09:00:00

安全WebTLS

2023-08-11 07:59:15

2011-08-05 14:58:58

iPhone CoreAnimat 動(dòng)畫

2024-01-15 06:05:05

DockerGol ang應(yīng)用程序

2024-04-03 08:33:41

Python服務(wù)模塊Flask

2012-03-30 15:54:43

ibmdw

2011-07-21 15:37:40

jQuery MobiJQMJSON

2009-09-27 10:37:01

Java應(yīng)用程序Hibernate

2025-02-04 13:53:18

NixGogRPC

2020-09-18 07:00:00

Kubernetes應(yīng)用程序架構(gòu)

2009-07-01 13:54:41

Servlet和JSP

2020-02-12 08:00:44

SaaS數(shù)據(jù)云計(jì)算

2020-01-03 14:03:46

云計(jì)算開發(fā)云原生

2011-11-03 09:41:35

Android簽名安全性

2012-03-20 09:20:40

Go語言

2022-02-18 08:43:19

Spring Boo應(yīng)用程序RabbitMQ

2015-08-03 10:04:59

WineLinuxWindows
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

av福利在线导航| 一区不卡在线观看| 五月国产精品| 欧美伊人久久大香线蕉综合69| 性欧美大战久久久久久久免费观看| 中文字幕在线观看精品| 影音先锋日韩精品| 日韩精品中文字幕在线播放| 成人性生交免费看| 92久久精品| 国产精品欧美极品| 国产欧美在线一区二区| 国产天堂第一区| 欧美日本一区二区视频在线观看| 国产婷婷97碰碰久久人人蜜臀 | 日本强好片久久久久久aaa| 久久久精品2019中文字幕神马| 波多野结衣一二三区| 一区二区视频网| av在线资源观看| 自拍视频亚洲| 伊人久久免费视频| 影音先锋资源av| 91麻豆精品| 色婷婷久久综合| 成人精品视频在线播放| 免费看a在线观看| 久久蜜桃av一区精品变态类天堂| 99国产视频在线| 国产精品视频无码| 丝袜美腿亚洲综合| 欧美制服第一页| 国产网址在线观看| 欧美一区网站| 麻豆一区二区在线观看| 天美传媒免费在线观看| 免费成人高清在线视频theav| 亚洲精品国产a久久久久久| 天堂精品视频| 国产在线91| 91丨porny丨最新| 好看的日韩精品| 午夜精品久久久久久久99 | 日本乱人伦a精品| 日本一区二区免费在线观看| 欧美日韩中文| 欧美成人免费小视频| 精品亚洲乱码一区二区| 日韩精品免费一区二区三区| 国产午夜一区二区| 免费观看a级片| 国产欧美日韩免费观看| 亚洲欧美国内爽妇网| 国产精品嫩草av| 久久男人av| 日韩hd视频在线观看| 中文字幕人妻一区二区三区| 国产毛片精品| 日韩精品在线电影| 国产真实乱人偷精品人妻| 国产尤物久久久| 亚洲天堂影视av| eeuss中文字幕| 亚洲中文字幕无码一区| 黄色免费网站在线观看| 综合色天天鬼久久鬼色| 免费在线精品视频| 性欧美videos高清hd4k| 亚洲午夜激情网站| 国产原创中文在线观看| 原纱央莉成人av片| 欧洲av在线精品| 中文字幕免费高清在线| 久久久91麻豆精品国产一区| 日韩欧美在线影院| 亚洲一区二区三区综合| 国产成人精品免费视| 亚洲男人7777| 国精产品视频一二二区| 中文字幕一区二区av| 欧美精品激情blacked18| 1级黄色大片儿| 日本va欧美va欧美va精品| 成人欧美一区二区三区黑人| 嫩草影院一区二区| 国产拍揄自揄精品视频麻豆| 一区二区三区一级片| 天天干在线视频论坛| 欧美性猛xxx| 欧美日韩一区二区三区69堂| 亚洲精品在线国产| 亚洲天堂影视av| 少妇久久久久久被弄高潮| 亚洲国产国产亚洲一二三| 国产精品69久久| 精品黑人一区二区三区在线观看| 26uuu国产在线精品一区二区| 午夜免费电影一区在线观看| 青草在线视频| 欧美最猛性xxxxx直播| 波多野结衣电影免费观看| 99日在线视频| 玖玖精品在线| 亚洲国产精品va在线看黑人动漫| 蜜桃久久精品成人无码av| 欧美fxxxxxx另类| 热久久美女精品天天吊色| 一级黄色大片免费| 91在线视频免费91| 中文字幕欧美日韩一区二区| 在线免费三级电影网站| 91精品婷婷国产综合久久| 双性尿奴穿贞c带憋尿| 欧美第十八页| 青青草一区二区| 亚洲产国偷v产偷v自拍涩爱| 中文字幕免费不卡| 男人添女人下面高潮视频| 日韩大陆av| 亚洲美女av在线播放| 久久免费视频6| 日本sm残虐另类| 麻豆成人av| 国产网红在线观看| 欧美一区午夜精品| 人人妻人人澡人人爽| 国产日韩精品视频一区二区三区 | 国产偷v国产偷v亚洲高清| 国产精品videossex国产高清| jizzyou欧美16| 国产婷婷97碰碰久久人人蜜臀| 久久成人国产精品入口| 狠狠色丁香婷婷综合久久片| 欧美日韩在线不卡一区| 欧美激情网站| 亚洲国内精品视频| 久久精品无码人妻| 国产91丝袜在线播放0| 女女同性女同一区二区三区按摩| 国产一区一一区高清不卡| 亚洲欧美三级伦理| 亚洲 欧美 成人| 91在线你懂得| 日韩av一二三四区| 婷婷成人综合| 欧美一级电影在线| 视频三区在线观看| 色综合一区二区| 精品人妻一区二区三区日产乱码卜| 亚洲国产精品一区制服丝袜| 成人在线观看91| 四虎影视国产在线视频| 精品精品欲导航| 国产无遮挡aaa片爽爽| 日本xxxx人| 亚洲视频在线观看三级| 激情图片中文字幕| 亚洲精彩视频| 粉嫩高清一区二区三区精品视频| 18+视频在线观看| 精品电影一区二区| 日韩av无码中文字幕| 99久精品国产| 国产v亚洲v天堂无码久久久| 精品一区电影| 成人黄色片网站| 欧美xxxx视频| 亚洲精品理论电影| www.久久网| 亚洲欧美国产高清| 国产av一区二区三区传媒| 一本色道久久综合亚洲精品不卡| 久久久久久九九九九| 色8久久影院午夜场| 在线看福利67194| 国产精品女同一区二区| 一区二区在线看| 中国一级特黄录像播放| 久久久天天操| 伊人久久青草| 91午夜精品| 国产91色在线|| 国产激情小视频在线| 精品国产一区二区三区久久久蜜月 | 欧美1区2区3| 97视频在线观看免费高清完整版在线观看| 撸视在线观看免费视频| 欧美日本一区二区在线观看| 激情五月婷婷小说| 久久精品男人天堂av| 污视频网站观看| 激情综合自拍| 亚洲国产另类久久久精品极度| 精品久久免费| 国产suv精品一区二区| av大大超碰在线| 亚洲人在线视频| av中文字幕在线免费观看| 欧美性jizz18性欧美| 日本一级特级毛片视频| av欧美精品.com| 99中文字幕在线| 久久久久.com| www.国产在线视频| 日韩av有码| 精品无人乱码一区二区三区的优势 | 欧美人与性囗牲恔配| 国内外成人在线视频| 久久久久久久久久久久久国产精品| 天天色综合色| 日本不卡一二三区| 久久狠狠久久| 亚洲伊人久久综合| 草民电影神马电影一区二区| 欧美激情中文网| 欧美极品视频| 国产亚洲精品久久久| 日本黄视频在线观看| 欧美高清一级片在线| 久久久精品毛片| 午夜视频在线观看一区二区三区| 天堂网av2018| 国产欧美一区二区精品秋霞影院| 色悠悠在线视频| 国产在线不卡一卡二卡三卡四卡| 国产aaa一级片| 亚洲大胆视频| 亚洲色婷婷久久精品av蜜桃| 四虎国产精品免费观看| 日韩电影免费观看高清完整| 日本三级久久| 国产精品v欧美精品v日韩| 2019中文亚洲字幕| 国产精品久在线观看| 欧美黑人巨大xxxxx| 久久乐国产精品| 久久99亚洲网美利坚合众国| 日韩在线观看免费av| 1769视频在线播放免费观看| 亚洲人成毛片在线播放| 四虎在线免费看| 亚洲国产精品va在线| 三级网站在线看| 精品电影一区二区三区| 噜噜噜久久,亚洲精品国产品| 日韩免费福利电影在线观看| 性欧美8khd高清极品| 日韩色视频在线观看| 国产ts人妖调教重口男| 欧美一区二区三区视频在线| 国产绳艺sm调教室论坛| 在线播放欧美女士性生活| 91精品中文字幕| 91精品国产91久久久久久最新毛片| 国产乱淫av免费| 欧美一区二区成人| 亚洲精品字幕在线| 亚洲国产精品视频在线观看| 日本高清视频www| 亚洲开心激情网| 成人午夜电影在线观看| 中文字幕日韩专区| 麻豆系列在线观看| 欧美区二区三区| 艳色歌舞团一区二区三区| 高清日韩中文字幕| 久久精品日韩精品| 欧美精品久久久久久 | 亚洲精品国产偷自在线观看| 91九色国产ts另类人妖| 欧美精品国产| 久久国产成人精品国产成人亚洲| 久久美女性网| 不用播放器的免费av| 国产成人一区在线| 久久久久国产精品无码免费看| 久久综合色8888| 一本色道久久88| 一区二区免费在线| 日本中文字幕在线| 欧美精品丝袜久久久中文字幕| av男人天堂网| 亚洲欧美福利视频| 欧美r级在线| 性欧美xxxx交| 国产亚洲精彩久久| aa成人免费视频| 亚洲免费观看高清完整版在线观| 日韩资源av在线| 91一区在线| 日韩a∨精品日韩在线观看| 欧美aaaaaa午夜精品| 国产香蕉精品视频| 国产欧美一区二区精品性色| 欧美日韩大片在线观看| 欧美性猛交xxxx黑人猛交| 国产一区二区三区成人| 亚洲精品久久久久中文字幕二区 | www.国产精品一区| 日韩av一级大片| 国产精品av久久久久久麻豆网| 97在线播放视频| 国产成人午夜精品影院观看视频 | 亚洲视频香蕉人妖| yjizz国产| 在线播放国产精品二区一二区四区| 五月婷婷在线播放| 欧美成人精品一区| 国产精品伦一区二区| 精品一区久久| 女人色偷偷aa久久天堂| 色综合色综合色综合色综合| bt欧美亚洲午夜电影天堂| 91嫩草丨国产丨精品| 色婷婷久久99综合精品jk白丝| 亚洲国产www| 久久香蕉频线观| 粉嫩av一区二区三区四区五区 | 久久伊伊香蕉| 国产一区二区三区蝌蚪| 1314成人网| 国产精品久久久爽爽爽麻豆色哟哟| 韩国av中文字幕| 精品日韩av一区二区| 黄网站app在线观看| 国产精品久久激情| 欧美女优在线视频| 国产成人无码精品久久久性色| 国产一区二区精品久久99| 男人天堂资源网| 在线视频国产一区| 日韩a在线观看| 91国产精品91| 懂色av一区二区| 4444亚洲人成无码网在线观看| 精品一区二区在线观看| 亚洲色图欧美色| 欧美午夜宅男影院| 成人在线观看一区| 国产精品av在线播放| 国产成人久久| 成年人在线观看视频免费| 久久久久久久网| 日韩精品久久久久久免费| 精品五月天久久| 悠悠资源网亚洲青| 欧美极品日韩| 日韩精品午夜视频| 国产亚洲精品熟女国产成人| 91高清视频在线| 福利成人在线观看| 国产精品欧美日韩一区二区| 欧美老女人另类| 久久国产这里只有精品| 亚洲天堂久久久久久久| 国产三级第一页| 久久91精品国产91久久跳| 亚洲精品福利| 人人干视频在线| 久久久久久久久久美女| 波多野结衣视频在线观看| 中文字幕精品在线| 亚洲ww精品| 国产成人永久免费视频| 波多野结衣中文字幕一区二区三区| 日产电影一区二区三区| 亚洲精品视频中文字幕| jizz亚洲女人高潮大叫| 正在播放一区| 成人小视频免费在线观看| 午夜精品三级久久久有码| 亚洲欧洲免费视频| 懂色av色香蕉一区二区蜜桃| 大陆极品少妇内射aaaaaa| av成人免费在线观看| 少妇久久久久久久| 日韩中文娱乐网| 国产精品chinese在线观看| 欧美牲交a欧美牲交aⅴ免费真| 欧美极品少妇xxxxⅹ高跟鞋| va视频在线观看| 97av在线视频| 日韩精品一区二区三区免费观看| 伊人影院在线观看视频| 一本一本大道香蕉久在线精品| 日本综合在线| 国产欧美日韩一区| 免费在线观看日韩欧美| 久久黄色免费视频| 亚洲欧美日韩一区二区三区在线| 久久av影院| 欧美在线一区视频| 国产精品欧美久久久久一区二区| 亚洲a v网站| 午夜综合激情| 亚洲一区二区自偷自拍| 91精品国产综合久久久蜜臀粉嫩| 交100部在线观看| 天天成人综合网| 久久在线免费观看|