ฉันมีสะพานเชื่อมระหว่างeth0& wlan0. ต่อไปนี้คือifconfig

[email protected]:~ $ ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.24.11.15  netmask 255.255.255.0  broadcast 10.24.11.255
        inet6 fe80::1fd4:f47a:59d2:1de8  prefixlen 64  scopeid 0x20<link>
        ether b8:27:eb:8e:38:ee  txqueuelen 1000  (Ethernet)
        RX packets 2571  bytes 308138 (300.9 KiB)
        RX errors 0  dropped 230  overruns 0  frame 0
        TX packets 2511  bytes 289807 (283.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether b8:27:eb:db:6d:bb  txqueuelen 1000  (Ethernet)
        RX packets 6268  bytes 1641477 (1.5 MiB)
        RX errors 0  dropped 39  overruns 0  frame 0
        TX packets 7141  bytes 1630895 (1.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

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 454  bytes 30843 (30.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 454  bytes 30843 (30.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
        inet 10.20.1.226  netmask 255.255.255.224  destination 10.20.1.226
        inet6 fe80::ea4d:bb87:d649:5308  prefixlen 64  scopeid 0x20<link>
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 100  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1407  bytes 94382 (92.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether b8:27:eb:8e:38:ee  txqueuelen 1000  (Ethernet)
        RX packets 5095  bytes 1401614 (1.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5124  bytes 1660553 (1.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ตารางเส้นทาง:

[email protected]:~ $ sudo ip route
0.0.0.0/1 via 10.20.1.225 dev tun0
default via 10.24.11.1 dev br0 src 10.24.11.15 metric 204
10.20.1.224/27 dev tun0 proto kernel scope link src 10.20.1.226
10.24.11.0/24 dev br0 proto kernel scope link src 10.24.11.15 metric 204
52.36.18.24 via 10.24.11.1 dev br0
128.0.0.0/1 via 10.20.1.225 dev tun0

และ

[email protected]:~ $ sudo route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.20.1.225     128.0.0.0       UG    0      0        0 tun0
0.0.0.0         10.24.11.1      0.0.0.0         UG    204    0        0 br0
10.20.1.224     0.0.0.0         255.255.255.224 U     0      0        0 tun0
10.24.11.0      0.0.0.0         255.255.255.0   U     204    0        0 br0
52.36.18.24     10.24.11.1      255.255.255.255 UGH   0      0        0 br0
128.0.0.0       10.20.1.225     128.0.0.0       UG    0      0        0 tun0

ซับเน็ต10.2.0.0/16สามารถเข้าถึงได้ผ่านช่องสัญญาณที่tun0สามารถ ping IP 10.2.1.145จากกล่องนี้ได้ แต่ไม่สามารถ ping 10.2.1.145จากอุปกรณ์ที่เชื่อมต่อกับกล่องนี้wlan0ได้ ยังสามารถ ping 10.24.11.15จากอุปกรณ์ที่เชื่อมต่อกับกล่องนี้ได้บนwlan0

หากฉันเปิดtraceroute 10.2.1.145อุปกรณ์ที่เชื่อมต่อกับกล่องนี้wlan0การเชื่อมต่อจะผ่านeth0IP สาธารณะ

eth0มี10.24.11.15แต่หลังจากสร้างสะพาน มันเลื่อนไปที่br0

เส้นทางสิ่งที่ฉันหายไปที่นี่ที่จะผลักดัน10.2.0.0/16การจราจรผ่านtun0?

นี่คือผลลัพธ์เพิ่มเติม:

[email protected]:~ $ ip route get 10.2.1.145 from 10.24.11.23 iif br0
10.2.1.145 from 10.24.11.23 via 10.20.0.225 dev tun0
    cache  iif br0

[email protected]:~ $ sudo ip netconf show dev tun0
ipv4 dev tun0 forwarding on rp_filter off mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off
[email protected]:~ $

[email protected]:~ $ sudo ip netconf show dev br0
ipv4 dev br0 forwarding on rp_filter off mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off

Ping จากไคลเอนต์ WiFi และtcpdumpจาก ubuntu :

[email protected]:~# ping 10.2.1.145

[email protected]:~ $ sudo tcpdump -ni br0 'icmp and ip host 10.2.1.145'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:30:56.903893 IP 10.24.11.23 > 10.2.1.145: ICMP echo request, id 34567, seq 8, length 64
15:30:57.904278 IP 10.24.11.23 > 10.2.1.145: ICMP echo request, id 34567, seq 9, length 64
15:30:58.904826 IP 10.24.11.23 > 10.2.1.145: ICMP echo request, id 34567, seq 10, length 64


[email protected]:~# ping 10.2.1.145

[email protected]:~ $ sudo tcpdump -nei eth0 'icmp and ip host 10.2.1.145'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:26:55.356091 ac:bc:32:bf:ad:57 > 18:b1:69:75:7a:f4, ethertype IPv4 (0x0800), length 98: 10.24.11.147 > 10.2.1.145: ICMP echo request, id 5646, seq 169, length 64

iptables บันทึก:

[email protected]:~ $ sudo iptables-save
# Generated by iptables-save v1.6.0 on Mon May  6 15:37:25 2019
*nat
:PREROUTING ACCEPT [1299:221082]
:INPUT ACCEPT [290:32450]
:OUTPUT ACCEPT [4762:319088]
:POSTROUTING ACCEPT [680:45560]
-A POSTROUTING -o eth0 -j MASQUERADE
-A POSTROUTING -o tun0 -j MASQUERADE
COMMIT
# Completed on Mon May  6 15:37:25 2019
[email protected]:~ $ uname -a
Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux

[email protected]:~ $ sudo ip rule ls
0:  from all lookup local
32766:  from all lookup main
32767:  from all lookup default

[email protected]:~ $ sudo ip route ls table all
0.0.0.0/1 via 10.20.2.129 dev tun0
default via 10.24.11.1 dev br0 src 10.24.11.15 metric 204
10.20.2.128/27 dev tun0 proto kernel scope link src 10.20.2.130
10.24.11.0/24 dev br0 proto kernel scope link src 10.24.11.15 metric 204
52.37.118.218 via 10.24.11.1 dev br0
128.0.0.0/1 via 10.20.2.129 dev tun0
broadcast 10.20.2.128 dev tun0 table local proto kernel scope link src 10.20.2.130
local 10.20.2.130 dev tun0 table local proto kernel scope host src 10.20.2.130
broadcast 10.20.2.159 dev tun0 table local proto kernel scope link src 10.20.2.130
broadcast 10.24.11.0 dev br0 table local proto kernel scope link src 10.24.11.15
local 10.24.11.15 dev br0 table local proto kernel scope host src 10.24.11.15
broadcast 10.24.11.255 dev br0 table local proto kernel scope link src 10.24.11.15
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1
fe80::/64 dev br0 proto kernel metric 256  pref medium
fe80::/64 dev tun0 proto kernel metric 256  pref medium
local ::1 dev lo table local proto kernel metric 0  pref medium
local fe80::1fd4:f47a:59d2:1de8 dev br0 table local proto kernel metric 0  pref medium
local fe80::54bf:cf69:4385:4b1c dev tun0 table local proto kernel metric 0  pref medium
ff00::/8 dev br0 table local metric 256  pref medium
ff00::/8 dev tun0 table local metric 256  pref medium

[email protected]:~ $ sudo ip -4 a ls
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    inet 10.24.11.15/24 brd 10.24.11.255 scope global br0
       valid_lft forever preferred_lft forever
5: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
    inet 10.20.2.130/27 brd 10.20.2.159 scope global tun0
       valid_lft forever preferred_lft forever
[email protected]:~ $

อีกด้านหนึ่งของ VPN ไม่ใช่openvpn serverเพราะฉันลองใช้กับAWS Client VPN Endpointที่นี่ ฉันทำงานsudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADEบนโฮสต์อูบุนตู ไม่มีการเข้าถึงเซิร์ฟเวอร์ VPN

อัปเดต :

บนไคลเอนต์ wifi

    [email protected]:~ $ ifconfig
    eth0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether b8:27:eb:d2:02:8c  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

     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 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

    wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.24.11.201  netmask 255.255.255.0  broadcast 10.24.11.255
        inet6 fe80::f9e2:e7af:ab5f:7865  prefixlen 64  scopeid 0x20<link>
        ether b8:27:eb:87:57:d9  txqueuelen 1000  (Ethernet)
        RX packets 86  bytes 7978 (7.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 97  bytes 16637 (16.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[email protected]:~ $ ip -4 route list
default via 10.24.11.1 dev wlan0 src 10.24.11.201 metric 303
10.24.11.0/24 dev wlan0 proto kernel scope link src 10.24.11.201 metric 303

ฉันลบsudo route del default gw 10.24.11.1 wlan0และเพิ่มsudo route add default gw 10.24.11.15 wlan0ในไคลเอนต์ wifi

[email protected]:~ $ ip -4 route list
default via 10.24.11.15 dev wlan0
10.24.11.0/24 dev wlan0 proto kernel scope link src 10.24.11.201 metric 303

แล้วพยายาม

[email protected]:~# ping 10.2.1.145
PING 10.2.1.145 (10.2.1.145): 56 data bytes

[email protected]:~ $ sudo tcpdump -ni br0 'icmp'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br0, link-type EN10MB (Ethernet), capture size 262144 bytes
13:40:03.832209 IP 10.24.11.201 > 10.2.1.145: ICMP echo request, id 614, seq 121, length 64
13:40:04.879329 IP 10.24.11.201 > 10.2.1.145: ICMP echo request, id 614, seq 122, length 64
13:40:05.911833 IP 10.24.11.201 > 10.2.1.145: ICMP echo request, id 614, seq 123, length 64

[email protected]:~ $ sudo tcpdump -ni tun0 'icmp'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
13:40:49.539044 IP 10.24.11.201 > 10.2.1.145: ICMP echo request, id 618, seq 1, length 64
13:40:50.553286 IP 10.24.11.201 > 10.2.1.145: ICMP echo request, id 618, seq 2, length 64
13:40:51.597073 IP 10.24.11.201 > 10.2.1.145: ICMP echo request, id 618, seq 3, length 64

วิ่งบน Ubuntu

1 iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

2 sudo iptables -A FORWARD -i br0 -o tun0 -j ACCEPT

3 sudo iptables -A FORWARD -i tun0 -o br0 -j ACCEPT

[email protected]:~ $ sudo iptables-save -c
# Generated by iptables-save v1.6.0 on Mon May 13 20:30:31 2019
*filter
:INPUT ACCEPT [32:2202]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [49:4174]
[0:0] -A FORWARD -i br0 -o tun0 -j ACCEPT
[0:0] -A FORWARD -i tun0 -o br0 -j ACCEPT
COMMIT
# Completed on Mon May 13 20:30:31 2019
# Generated by iptables-save v1.6.0 on Mon May 13 20:30:31 2019
*nat
:PREROUTING ACCEPT [7:1109]
:INPUT ACCEPT [2:144]
:OUTPUT ACCEPT [20:1340]
:POSTROUTING ACCEPT [4:268]
[0:0] -A POSTROUTING -o eth0 -j MASQUERADE
[16:1072] -A POSTROUTING -o tun0 -j MASQUERADE
COMMIT
# Completed on Mon May 13 20:30:31 2019

[email protected]:~ $ ping 10.2.1.145
PING 10.2.1.145 (10.2.1.145) 56(84) bytes of data.

[email protected]:~ $ sudo iptables-save -c
# Generated by iptables-save v1.6.0 on Mon May 13 20:31:24 2019
*filter
:INPUT ACCEPT [119:7998]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [218:19046]
[0:0] -A FORWARD -i br0 -o tun0 -j ACCEPT
[0:0] -A FORWARD -i tun0 -o br0 -j ACCEPT
COMMIT
# Completed on Mon May 13 20:31:24 2019
# Generated by iptables-save v1.6.0 on Mon May 13 20:31:24 2019
*nat
:PREROUTING ACCEPT [10:1331]
:INPUT ACCEPT [5:366]
:OUTPUT ACCEPT [45:3015]
:POSTROUTING ACCEPT [9:603]
[0:0] -A POSTROUTING -o eth0 -j MASQUERADE
[36:2412] -A POSTROUTING -o tun0 -j MASQUERADE
COMMIT
# Completed on Mon May 13 20:31:24 2019

แล้ว :

[email protected]:~ $ ping 10.20.1.225

[email protected]:~ $ sudo tcpdump -ni br0 'icmp'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br0, link-type EN10MB (Ethernet), capture size 262144 bytes
09:42:07.498023 IP 10.24.11.201 > 10.20.1.225: ICMP echo request, id 15212, seq 208, length 64
09:42:08.537648 IP 10.24.11.201 > 10.20.1.225: ICMP echo request, id 15212, seq 209, length 64
09:42:09.577700 IP 10.24.11.201 > 10.20.1.225: ICMP echo request, id 15212, seq 210, length 64

[email protected]:~ $ sudo tcpdump -ni tun0 'icmp'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
^C
0 packets captured
0 packets received by filter
0 packets dropped by kernel

และ

[email protected]:~ $ ping 10.2.1.145

[email protected]:~ $ sudo tcpdump -ni br0 'icmp'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br0, link-type EN10MB (Ethernet), capture size 262144 bytes
09:43:32.055291 IP 10.24.11.201 > 10.2.1.145: ICMP echo request, id 15215, seq 12, length 64
09:43:33.099422 IP 10.24.11.201 > 10.2.1.145: ICMP echo request, id 15215, seq 13, length 64
09:43:34.135264 IP 10.24.11.201 > 10.2.1.145: ICMP echo request, id 15215, seq 14, length 64

[email protected]:~ $ sudo tcpdump -ni tun0 'icmp'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
^C
0 packets captured
0 packets received by filter
0 packets dropped by kernel

ดูเหมือนว่าICMP echo requestแพ็คเกจจะไม่ถูกส่งต่อไปยังtun0.

answer

มาลองแก้ปัญหาของคุณกัน เพื่อความเข้าใจที่ดีขึ้น ฉันได้วาดไดอะแกรมทอพอโลยีเครือข่าย เพื่อชี้แจงว่าเกิดอะไรขึ้น ฉันได้แยกการประมวลผล l2 และ l3 แบบกราฟิกภายในโฮสต์ Ubuntu ของคุณ ซึ่งจะช่วยในการให้เหตุผลเพิ่มเติม

โทโพโลยีเครือข่าย

ตรวจสอบขั้นตอนต่อไปนี้:

  • ตรวจสอบการกำหนดเส้นทางบนไคลเอนต์ wifi (ที่นี่และอื่น ๆ - 10.24.11.X- แทนที่ที่อยู่ IP จริงของอุปกรณ์นี้) โครงการของคุณต้องใช้ทั้งสอง posibilites: default route via 10.24.11.15หรือดีกว่า 10.2.0.0/16 via 10.24.11.15(ฉันคิด)

  • ตรวจสอบการส่งต่อบนโฮสต์ Ubuntu ด้วยip route get 10.2.1.145 from 10.24.11.X iif br0และip route get 10.24.11.X from 10.2.1.145 iif tun0คำสั่ง ควรส่งคืนบางสิ่งเช่น10.2.1.145 from 10.24.11.X via 10.20.1.225 dev tun0(เส้นทางที่ถูกต้อง) หากส่งคืนเช่น แสดงRTNETLINK answers: No route to hostว่าคุณไม่ได้เปิดใช้งานการส่งต่อ IP (ทั่วโลกหรือต่ออินเทอร์เฟซ) เปิดใช้งานด้วยsysctlคำสั่ง ตรวจสอบการส่งต่อบนtun0และbr0อินเทอร์เฟซด้วยคำสั่งip netconf show dev ...(ควรมีforwarding onสตริง)

  • รันping 10.2.1.145คำสั่งบนไคลเอนต์ wifi และรัน the tcpdump -ni br0 'icmp and ip host 10.24.11.X'และtcpdump -ni tun0 'icmp'บนโฮสต์ Ubuntu คุณควรเห็นบางแพ็กเก็ตicmp echo requestจากไคลเอนต์ wifi ไปยัง10.2.1.145โฮสต์ หากคุณไม่เห็น ให้ตรวจสอบไฟร์วอลล์ด้วยiptables-saveคำสั่ง (และวางผลลัพธ์ลงในคำถามเพื่อรับความช่วยเหลือเกี่ยวกับกรณีของคุณ) หากคุณเห็นicmp echo requestแต่ไม่เห็นicmp echo replyใน tcpdump คุณต้องตรวจสอบไซต์ระยะไกล

  • แผนของคุณยังต้องการการตั้งค่าการกำหนดเส้นทางที่ฝั่งระยะไกล (บนopenvpn server) ควรจะมีเส้นทาง10.24.11.0/24 via 10.20.1.226บนเซิร์ฟเวอร์ OpenVPN ตัวเองและเส้นทางไป subnet เดียวกันผ่านsome remote host openvpn serverวิธีอื่นในการเชื่อมต่อ - การใช้ NAT บนโฮสต์ Ubuntu (แต่จะอธิบายในภายหลัง)

  • บนเซิร์ฟเวอร์ openvpn ให้รันคำสั่งip route get 10.2.1.145 from 10.24.11.X iif tunXand ip route get 10.24.11.X from 10.2.1.145 iif ethZ(โดยที่tunXและethZอินเทอร์เฟซที่สอดคล้องกันคือเซิร์ฟเวอร์ open vpn) ทั้งสองคำสั่งควรแสดงเส้นทางที่ถูกต้อง มิฉะนั้น ให้ตรวจสอบการเปิดใช้งานการส่งต่อด้วยip netconf showคำสั่ง (และเปิดใช้งานด้วยsysctl)

  • รันtcpdump -ni tunX 'icmp and ip host 10.2.1.145'คำสั่งบนเซิร์ฟเวอร์ openvpn คุณควรเห็นขาเข้าicmp echo requestsจากไคลเอนต์ wifi ระยะไกลและขาออกicmp echo replyจาก10.2.1.145โฮสต์ หากคุณไม่เห็น ให้icmp echo replyเรียกใช้ tcpdump (หรือ wireshark) บนsome remote hostและตรวจสอบการตั้งค่าไฟร์วอลล์ในนั้น

  • หากคุณไม่มีสิทธิ์เข้าถึงระดับผู้ดูแลระบบในด้านอื่น ๆ และไม่สามารถตั้งค่าการกำหนดเส้นทางได้ คุณควรใช้ NAT บนโฮสต์ของ Ubuntu คุณควรเพิ่มกฎถัดไปในชุดกฎไฟร์วอลล์ (ใช้ดีกว่าiptables-saveและiptables-applyคำสั่งเพื่อความปลอดภัย):

iptables -t nat -A POSTROUTING \
         -o tun0 \
    -j MASQUERADE
  • ขั้นตอนสุดท้ายคือการตรวจสอบไฟร์วอลล์ การตั้งค่าของคุณต้องอนุญาตการส่งต่อแพ็กเก็ตผ่านโฮสต์ Ubuntu ลดความซับซ้อนของกฎ:
iptables -A FORWARD -i br0 -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -o br0 -j ACCEPT
  • จากนั้นตรวจสอบตัวนับกฎไฟร์วอลล์ในผลลัพธ์ของiptables-save -cคำสั่ง [packets:bytes]ตัวเลขในวงเล็บจับคู่เคาน์เตอร์ของการปกครองในรูปแบบ รีสตาร์ทpingและตรวจสอบ อย่างน้อยก็ต้องตีกฎ NAT ลำดับของกฎเป็นสิ่งสำคัญมาก!

  • หากขั้นตอนข้างต้นไม่ได้ช่วยแก้ปัญหาของคุณ โปรดเพิ่มข้อมูลเพิ่มเติมในคำถาม แล้วเราจะให้ขั้นตอนเพิ่มเติมในการแก้ปัญหา