Linux(28) La configuración de tarjeta de red dual de Linux proporciona acceso a la red externa para las PC conectadas al host de Linux.

En este artículo, exploraré cómo proporcionar acceso a la red a dispositivos conectados a un host Linux. Se utilizará un caso real de resolución de problemas para explicar este proceso en detalle y, finalmente, se utilizará el script para completar varias inspecciones y trabajos de configuración.


fondo:

El cliente tiene una placa base RK3568 que ejecuta el sistema Ubuntu Linux. Esta placa base tiene dos interfaces Ethernet: suponga que eth0 (red interna) y eth1 (red externa) están definidas. El cliente desea proporcionar acceso a la red externa a través de RK3568 a una PC con Windows conectada a eth0.

En resumen, la PC con Windows está conectada al puerto de red interno de la placa base RK3568 a través de un cable de red, y luego se puede acceder a www.baidu.com (red externa) desde la PC con Windows.


Configuración de PC con Windows:

La PC es Windows 10 y la puerta de enlace predeterminada debe configurarse a través de la interfaz gráfica o la línea de comando:

  1. Abra el Panel de control.
  2. Seleccione Centro de redes y recursos compartidos.
  3. A la izquierda, haz clic en "Cambiar configuración del adaptador".
  4. Haga clic derecho en la conexión de red (probablemente "Ethernet" o algo similar) y seleccione "Propiedades".
  5. Busque y haga doble clic en "Protocolo de Internet versión 4 (TCP/IPv4)" en la lista.
  6. Seleccione "Usar la siguiente dirección IP" e ingrese su dirección IP y máscara de subred. En Puerta de enlace predeterminada, ingrese 192.168.52.2.
  7. Haga clic en "Aceptar" para guardar la configuración.
    Insertar descripción de la imagen aquí
#执行ipconfig简单确认下
ipconfig

Insertar descripción de la imagen aquí


Configuración de Ubuntu RK3568:

1. Pasos para la solución de problemas:

1. Configurar NAT (traducción de direcciones de red)

Asegúrese de tener configuradas las reglas NAT correctas en su host Linux.

root@xxx:/# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables v1.8.4 (legacy): can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.

Muy bien, este paso salió mal. Verifique la información. Agregué iptables nat config al depurar la ventana acoplable RK3399 antes, y luego recordé que necesito activar la función de configuración en el kernel.

Primero resolvamos el problema del comando iptables nat. Primero, abra kernel/arch/arm64/configs/rockchip_linux_defconfigy agregue el soporte de arranque del kernel. Algunos de los siguientes contenidos no se pueden ignorar primero, copie la configuración en él y estúdielo más tarde.

+CONFIG_TUN=y
+
+#------------iptables
+#CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_CGROUP_PIDS=y
+CONFIG_MEMCG=y
+CONFIG_MEMCG_SWAP=y
+CONFIG_RT_GROUP_SCHED=y
+CONFIG_BLK_CGROUP=y
+CONFIG_BLK_DEV_THROTTLING=y
+CONFIG_CFQ_GROUP_IOSCHED=y
+CONFIG_INET_ESP=y
+CONFIG_BRIDGE_NETFILTER=y
+CONFIG_NF_CONNTRACK_FTP=y
+CONFIG_NF_CONNTRACK_TFTP=y
+CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
+CONFIG_NETFILTER_XT_MATCH_IPVS=y
+CONFIG_IP_VS=y
+CONFIG_IP_VS_PROTO_TCP=y
+CONFIG_IP_VS_PROTO_UDP=y
+CONFIG_IP_VS_RR=y
+CONFIG_IP_VS_NFCT=y
+CONFIG_IP_NF_TARGET_REDIRECT=y
+CONFIG_BRIDGE=y
+CONFIG_CGROUP_NET_PRIO=y
+CONFIG_BLK_DEV_DM=y
+CONFIG_DM_THIN_PROVISIONING=y
+CONFIG_DUMMY=y
+CONFIG_MACVLAN=y
+CONFIG_IPVLAN=y
+CONFIG_VXLAN=y
+CONFIG_VETH=y
+CONFIG_BTRFS_FS=y
+CONFIG_BTRFS_FS_POSIX_ACL=y

Compile kernel boot.img, vuelva a grabarlo en el sistema RK3568 y reinicie.
Vuelva a verificar si la función se puede ejecutar. Si no se informa ningún error después de la ejecución, este paso se completa.

root@xxx:/# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

2. Habilite el reenvío de IP:

El host Linux debe permitir el reenvío de IP.

echo 1 > /proc/sys/net/ipv4/ip_forward

Y asegúrese de /etc/sysctl.conftener las siguientes líneas en el archivo:

net.ipv4.ip_forward=1

3. Verifique la configuración del entorno de puerto de red dual:

Si no hay una interfaz en la misma subred que la puerta de enlace que está intentando agregar, es posible que necesite configurar una interfaz para usar esta subred. Por ejemplo, si tiene una eth0interfaz llamada , puede asignarle una dirección IP usando el siguiente comando:

    ifconfig eth0 192.168.52.2 netmask 255.255.255.0 up

Se probó el siguiente ipcomando y se encontró que no estaba agregado a la ruta. Si no funciona, no lo use :

   ip addr add 192.168.52.2/24 dev eth0
   ip link set eth0 up

Aquí 192.168.52.2hay una dirección IP de ejemplo; puede elegir cualquier dirección disponible en esa subred.

root@xxx:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::f5d1:863c:90d8:c00e  prefixlen 64  scopeid 0x20<link>
        ether f6:b2:f0:93:bb:ab  txqueuelen 1000  (Ethernet)
        RX packets 121  bytes 9206 (9.2 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 47  bytes 7793 (7.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 38

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.2  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::1b34:5d25:1cc3:eb3d  prefixlen 64  scopeid 0x20<link>
        ether f2:b2:f0:93:bb:ab  txqueuelen 1000  (Ethernet)
        RX packets 1317  bytes 219566 (219.5 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 55  bytes 5851 (5.8 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 43

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 166  bytes 11692 (11.6 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 166  bytes 11692 (11.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
root@xxx:/# ifconfig eth0 192.168.52.2 netmask 255.255.255.0 up
root@xxx:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.52.2  netmask 255.255.255.0  broadcast 192.168.52.255
        ether f6:b2:f0:93:bb:ab  txqueuelen 1000  (Ethernet)
        RX packets 873  bytes 299601 (299.6 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 98  bytes 15353 (15.3 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 38

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.2  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::1b34:5d25:1cc3:eb3d  prefixlen 64  scopeid 0x20<link>
        ether f2:b2:f0:93:bb:ab  txqueuelen 1000  (Ethernet)
        RX packets 5035  bytes 782225 (782.2 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 668  bytes 287954 (287.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 43

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 242  bytes 17162 (17.1 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 242  bytes 17162 (17.1 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

root@xxx:/# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         _gateway        0.0.0.0         UG    102    0        0 eth1
192.168.1.0     0.0.0.0         255.255.255.0   U     102    0        0 eth1
192.168.52.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0

OK. Vea que eth0 anterior se ha configurado con IP y enrutamiento.

4. Compruebe si la red está conectada:

Si su PC con Windows 10 no puede acceder a la red externa a través de RK3568, debe realizar una serie de pasos de solución de problemas.

Prueba de ping :
- Haga ping a la dirección IP interna del RK3568 (192.168.52.2) desde la PC. Asegúrate de que esté abierto. (OK)
- Haga ping a la dirección IP de la PC (192.168.52.1) desde el RK3568. Asegúrate de que también sea transitable. (OK)
: haga ping a un sitio web externo desde RK3568, como 8.8.8.8. Asegúrese de que la red externa sea accesible. (OK)
- haga ping a 8.8.8.8 desde la PC. Si esto no funciona, pero todos los pasos anteriores sí, el problema puede estar en NAT o en el enrutamiento.

Verifique la configuración de NAT : asegúrese de que NAT esté configurado correctamente en el RK3568. Ejecute el siguiente comando nuevamente:

   iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

Verifique DNS : el problema puede estar relacionado con la resolución de DNS. Intente hacer ping a un nombre de dominio desde su PC, por ejemplo www.baidu.com. Si esto no funciona, pero hacer ping a 8.8.8.8 sí, es posible que necesites configurar un DNS estático en tu PC, como 8.8.8.8 y 8.8.4.4 de Google.

Verificación RK3568:

root@btf:/# ping 192.168.52.1
PING 192.168.52.1 (192.168.52.1) 56(84) bytes of data.
64 bytes from 192.168.52.1: icmp_seq=1 ttl=128 time=1.17 ms
64 bytes from 192.168.52.1: icmp_seq=2 ttl=128 time=1.33 ms
64 bytes from 192.168.52.1: icmp_seq=3 ttl=128 time=1.27 ms
64 bytes from 192.168.52.1: icmp_seq=4 ttl=128 time=0.937 ms
64 bytes from 192.168.52.1: icmp_seq=5 ttl=128 time=1.66 ms
64 bytes from 192.168.52.1: icmp_seq=6 ttl=128 time=3.46 ms
64 bytes from 192.168.52.1: icmp_seq=7 ttl=128 time=1.32 ms
64 bytes from 192.168.52.1: icmp_seq=8 ttl=128 time=1.62 ms
64 bytes from 192.168.52.1: icmp_seq=9 ttl=128 time=1.75 ms
64 bytes from 192.168.52.1: icmp_seq=10 ttl=128 time=1.42 ms
^C
--- 192.168.52.1 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9015ms
rtt min/avg/max/mdev = 0.937/1.593/3.460/0.663 ms
root@btf:/# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=110 time=184 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=110 time=186 ms
^C
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 183.646/184.745/185.844/1.099 ms
root@btf:/#

Verificación de PC Windows:
primero verifique que la red interna no esté accesible (OK)
Insertar descripción de la imagen aquí
y luego verifique que la red externa no esté accesible (OK).
Insertar descripción de la imagen aquí
De hecho, ya puede acceder a Internet aquí. Si no lo cree, mire en el icono en la esquina inferior derecha de la PC y abra el navegador.

5. Configuración del cortafuegos:

Asegúrese de que el firewall del host de Linux permita el tráfico. (No hice este paso. Si los pasos anteriores aún no funcionan, puedes intentar eliminar el firewall)

iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

6. Sección:

Si tiene problemas, siga el paso 4 para verificar en detalle. Los dos elementos siguientes son importantes y no se los pierda:

1. Prueba de conexión externa:

Haga ping a 8.8.8.8 desde el host Linux para asegurarse de que pueda acceder a la red externa.

2. Configuración de red de la computadora:

Asegúrese de que la puerta de enlace predeterminada de la PC esté configurada en la dirección IP interna del host Linux.


3. Estado final de acceso a Internet:

route

o

ip route

A continuación se muestran las diversas configuraciones que finalmente me permitieron acceder a Internet.

root@xxx:/# ip route
default via 192.168.1.1 dev eth1 proto dhcp metric 101
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.2 metric 101
192.168.52.0/24 dev eth0 proto kernel scope link src 192.168.52.2
root@xxx:/# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         _gateway        0.0.0.0         UG    101    0        0 eth1
192.168.1.0     0.0.0.0         255.255.255.0   U     101    0        0 eth1
192.168.52.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
root@xxx:/# ifconfig -a
can0: flags=128<NOARP>  mtu 16
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 10  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 55

can1: flags=128<NOARP>  mtu 16
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 10  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 56

dummy0: flags=130<BROADCAST,NOARP>  mtu 1500
        ether f2:4c:f0:78:b5:b0  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.52.2  netmask 255.255.255.0  broadcast 192.168.52.255
        ether f6:b2:f0:93:bb:ab  txqueuelen 1000  (Ethernet)
        RX packets 49950  bytes 15323445 (15.3 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 43930  bytes 7288991 (7.2 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 38

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.2  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::1b34:5d25:1cc3:eb3d  prefixlen 64  scopeid 0x20<link>
        ether f2:b2:f0:93:bb:ab  txqueuelen 1000  (Ethernet)
        RX packets 55814  bytes 9172054 (9.1 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 49908  bytes 15222325 (15.2 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 43

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 202  bytes 16611 (16.6 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 202  bytes 16611 (16.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

usb0: flags=4098<BROADCAST,MULTICAST>  mtu 1500
        ether ae:0c:29:a3:9b:6d  txqueuelen 1000  (Ethernet)
        RX packets 1  bytes 28 (28.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2  bytes 433 (433.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

root@xxx:/# cat /etc/sysctl.conf | grep net.ipv4.ip_forward=1
#net.ipv4.ip_forward=1  #后面发现这个不打开其实也是可以的
root@xxx:/# cat /proc/sys/net/ipv4/ip_forward
1 #这个要打开设置为1

7. Guión:

Durante el proceso de depuración, me sentí confundido y gradualmente me volví claro. También aprendí muchos conceptos y lo intenté muchas veces. Finalmente, después de repetidos intentos, encontré un patrón que satisface las necesidades del cliente. Los comandos son un poco engorrosos. Según mis características debo crear un script para automatizarlo.

#!/bin/bash

# 检查参数数量
if [ "$#" -ne 3 ]; then
    echo "使用方法: $0 <内网接口名> <内网接口IP地址> <外网接口名>"
    exit 1
fi

# 获取参数
INTERNAL_IF="$1"
IPADDR="$2"
EXTERNAL_IF="$3"

# 启用IP转发
echo "启用IP转发..."
echo 1 > /proc/sys/net/ipv4/ip_forward

# 清理旧的NAT规则
echo "清理旧的NAT规则..."
iptables -F
iptables -t nat -F

# 清理旧的NAT规则
echo "清理旧的NAT规则..."
iptables -t nat -F

# 设置NAT规则
echo "设置NAT规则..."
iptables -t nat -A POSTROUTING -o $EXTERNAL_IF -j MASQUERADE

# 配置内网接口
echo "配置内网接口 $INTERNAL_IF..."
ip addr add $IPADDR/24 dev $INTERNAL_IF
ip link set $INTERNAL_IF up

# 打印网络接口信息
echo "当前网络接口信息:"
ip addr



# 测试外网连接
echo "测试外网连接..."
ping -c 4 8.8.8.8

echo "脚本执行完毕!"

Ahora puede ejecutar el script usando el siguiente comando:

./enable_nat_routing.sh eth0 192.168.52.2 eth1

Resultados de la ejecución del script:

root@btf:/opt# ./enable_nat_routing.sh
使用方法: ./enable_nat_routing.sh <内网接口名> <内网接口IP地址> <外网接口名>
root@btf:/opt# ./enable_nat_routing.sh eth0 192.168.52.2 eth1
启用IP转发...
清理旧的NAT规则...
设置NAT规则...
配置内网接口 eth0...
当前网络接口信息:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether aa:e4:19:76:54:43 brd ff:ff:ff:ff:ff:ff
3: can0: <NOARP,ECHO> mtu 16 qdisc noop state DOWN group default qlen 10
    link/can
4: can1: <NOARP,ECHO> mtu 16 qdisc noop state DOWN group default qlen 10
    link/can
5: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether f6:b2:f0:93:bb:ab brd ff:ff:ff:ff:ff:ff
    inet 192.168.52.2/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::f5d1:863c:90d8:c00e/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
6: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether f2:b2:f0:93:bb:ab brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.2/24 brd 192.168.1.255 scope global dynamic noprefixroute eth1
       valid_lft 86348sec preferred_lft 86348sec
    inet6 fe80::1b34:5d25:1cc3:eb3d/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
7: usb0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether ae:0c:29:a3:9b:6d brd ff:ff:ff:ff:ff:ff
当前路由信息:
default via 192.168.1.1 dev eth1 proto dhcp metric 102
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.2 metric 102
192.168.52.0/24 dev eth0 proto kernel scope link src 192.168.52.2
测试外网连接...
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=110 time=286 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=110 time=283 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=110 time=283 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=110 time=289 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 282.528/285.120/289.283/2.689 ms
脚本执行完毕!

Suplemento:
pruebas posteriores encontraron que las reglas de ruta desaparecían repentinamente y la IP ifconfig eth0 también desaparecía.

root@xxx:/opt# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         _gateway        0.0.0.0         UG    102    0        0 eth1
192.168.1.0     0.0.0.0         255.255.255.0   U     102    0        0 eth1

circunstancias normales

root@xxx:/opt# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         _gateway        0.0.0.0         UG    102    0        0 eth1
192.168.1.0     0.0.0.0         255.255.255.0   U     102    0        0 eth1
192.168.52.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0

Resumir:

Proporcionar acceso a la red a dispositivos conectados a un host Linux puede requerir varios pasos de configuración. Al examinar cuidadosamente cada configuración y realizar una solución de problemas paso a paso, podemos resolver con éxito este tipo de problemas.


¡Espero que este blog te sea útil!

Supongo que te gusta

Origin blog.csdn.net/SHH_1064994894/article/details/132535837
Recomendado
Clasificación