อันดับแรก ฉันทราบว่ามีการถามคำถามที่คล้ายกันกับฉันที่อื่น (ฉันได้อ่านโพสต์เหล่านั้นมามากแล้ว!) แต่ฉันไม่สามารถหาวิธีแก้ไขปัญหาของฉันได้ ดังนั้นฉันจึงขอความช่วยเหลือ
การตั้งค่าของฉัน
ฉันมีสองเครือข่ายบน LAN ของฉัน 192.168.0.0/24 และ 10.11.12.0/24 อันแรกมี DHCP ที่ทำงานบนเราเตอร์ WAN ของฉัน ส่วนอันหลังรัน dnsmasq บน Ubuntu Server 20.04 ในกล่องที่ทำหน้าที่เป็นเราเตอร์ระหว่างซับเน็ตทั้งสอง ฉันได้กำหนดค่า dnsmasq ให้ให้บริการ DHCP บนเครือข่าย 10.11.12.0/24 เท่านั้นด้วยตัวเลือก no-dhcp-interface=wlp3s0 โดย wlp3s0 เป็นอินเทอร์เฟซในด้าน
สรุป:
WAN Router (เกตเวย์ไปยัง WAN) คือ 192.168.0.1/24
เรียกใช้ DHCP สำหรับไคลเอนต์บน 192.168.0.0/24
เราเตอร์ (b/w subnets):
Ubuntu Server 20.04 พร้อมสองอินเตอร์เฟส
wlp3s0: 192.168.0.2/24 (IP แบบคงที่)
eno1: 10.11.12.1/24 (IP แบบคงที่)
ฉันได้กำหนดค่า iptables เป็น FWD และ NAT แล้ว
iptables -t nat -A โพสต์ -o wlp3s0 -j MASQUERADE
iptables -A FORWARD -i wlp3s0 -o eno1 -m state --state RELATED,ESTABLISHED -j ยอมรับ
iptables -A ไปข้างหน้า -i eno1 -o wlp3s0 -j ยอมรับ
ฉันอนุญาต DHCP ผ่านไฟร์วอลล์ด้วย ufw อนุญาต 67/udp
:
ถึงการดำเนินการจาก
-- ------ ----
67/udp อนุญาตในทุกที่
ทุกอย่างดูเหมือนจะทำงานได้ดี อย่างไรก็ตาม จากประสบการณ์ ฉันทราบว่าการเรียกใช้เซิร์ฟเวอร์ DHCP สองเซิร์ฟเวอร์ในลักษณะนี้อาจทำให้เกิดข้อขัดแย้งได้ เว้นแต่จะแยกออกจากกันอย่างเคร่งครัด (ไคลเอนต์ที่มีไว้สำหรับเครือข่าย 192.168.0.0/24 จะไม่พอใจถ้า DHCP ให้ที่อยู่ IP บนเครือข่าย 10.11.12.0/24!)
การค้นพบปัญหา
ดังนั้นฉันจึงทำสิ่งต่อไปนี้เพื่อทดสอบฉันตั้งค่าการฟัง tcpdump บนอินเทอร์เฟซ wlp3s0 (192.168.0.2) และใช้ nmap เพื่อจำลองคำขอ DHCP Discover ที่มาจากอินเทอร์เฟซ eno1 (10.11.12.1/24) เช่น:
sudo tcpdump -i wlp3s0 -n udp พอร์ต 67 หรือพอร์ต 68
sudo nmap --script Broadcast-dhcp-ค้นพบ -e eno1
ตามที่คาดไว้ ฉันได้รับข้อเสนอ DHCP จาก dnsmasq ที่ทำงานบน 10.11.12.1 จนถึงตอนนี้ดีมาก!
รายละเอียดบางอย่างถูกตัดออกจากเอาต์พุตเพื่อความกระชับ (เขากล่าว)
เริ่ม Nmap 7.80 ( https://nmap.org ) เวลา 12-2021-2021 16:19 UTC
ผลลัพธ์ของสคริปต์ล่วงหน้า:
| ออกอากาศ dhcp ค้นพบ:
| ตอบกลับ 1 จาก 1:
| IP ที่ให้บริการ: 10.11.12.53
| ประเภทข้อความ DHCP: DHCPOFFER
| ตัวระบุเซิร์ฟเวอร์: 10.11.12.1
| ที่อยู่ออกอากาศ: 10.11.12.255
| ซับเน็ตมาสก์: 255.255.255.0
| เซิร์ฟเวอร์ชื่อโดเมน: 10.11.12.1
|_ เราเตอร์: 10.11.12.1
อย่างไรก็ตาม tcpdump แสดงว่าเซิร์ฟเวอร์ DHCP ทั้งสองตอบสนองต่อคำขอค้นพบ (อันที่จริง เราเตอร์ WAN ของฉันส่งการตอบกลับ 2 ครั้ง!)
16:19:43.517029 IP 10.11.12.1.68 > 255.255.255.255.67: BOOTP/DHCP คำขอจาก de:ad:c0:de:ca:fe ความยาว 316
16:19:46.486227 IP 10.11.12.1.67 > 255.255.255.255.68: BOOTP/DHCP ตอบกลับ ความยาว 321
16:19:46.794207 IP 192.168.0.1.67 > 255.255.255.255.68: BOOTP/DHCP ตอบกลับ ความยาว 323
16:19:46.794207 IP 192.168.0.1.67 > 255.255.255.255.68: BOOTP/DHCP ตอบกลับ ความยาว 323
ดูเหมือนว่าคำขอค้นพบ DHCP จะถูกส่งต่อไปยังเครือข่าย 192.168.0.0/24 ผ่านอินเทอร์เฟซ wlp3s0 เมื่อดูกฎ iptables และไฟร์วอลล์ของฉัน ฉันไม่เห็นเหตุผลที่จะต้องแปลกใจกับสิ่งนี้ อย่างไรก็ตามสิ่งที่ฉันกำลังดิ้นรนจริงๆคือการหาวิธีป้องกัน
สิ่งที่ฉันได้ลอง
ฉันได้ลองใช้การเรียงสับเปลี่ยนกฎต่างๆ ทั้งใน ufw และ iptables แต่ไม่สำเร็จ อาจเป็นเพราะฉันไม่เข้าใจทั้ง iptables หรือ ufw อย่างถ่องแท้ ตัวอย่างบางส่วนของสิ่งที่ฉันพยายาม:
(กฎ ufw/iptables ทั้งหมดถูกเพิ่มที่ด้านบนสุดของชุดกฎ/เชนที่เกี่ยวข้องเพื่อให้แน่ใจว่ากฎเหล่านั้นถูกโจมตี)
ufw:
# จำกัด 67/udp ไว้ที่หนึ่งอินเทอร์เฟซ
ufw อนุญาตใน eno1 proto udp จาก 0.0.0.0/0 ถึง 0.0.0.0/0 พอร์ต 67
# ปฏิเสธการกำหนดเส้นทาง
เส้นทาง ufw ปฏิเสธใน eno1 ออกบน wlp3s0 ถึง 0.0.0.0/0 พอร์ต 67 proto udp
iptables:
# ป้องกันการส่งต่อพอร์ต UDP 67/68
iptables -I FORWARD 1 -p udp --match multiport --dports 67,68 -j DROP
# วางพอร์ต UDP ขาออก 67
iptables -I OUTPUT 1 -p udp --match multiport --dports 67,68 -o wlp3s0 -j DROP
ฉันต้องขาดความเข้าใจพื้นฐานบางอย่างเกี่ยวกับวิธีการทำงาน เนื่องจากไม่มีสิ่งที่กล่าวมาข้างต้นที่ป้องกันไม่ให้เราเตอร์ WAN DHCP รับการค้นพบและเสนอ IP บนซับเน็ต 192.168.0.0/24
ฉันอ่านที่ไหนสักแห่งว่าเซิร์ฟเวอร์ DHCP อาจฟังบนซ็อกเก็ตดิบ (หรือแพ็คเก็ต?) ซึ่งไม่อยู่ภายใต้ iptables นั่นไม่ใช่กรณีของ dnsmasq ตามที่บันทึกไว้ที่นี่ https://github.com/imp/dnsmasq/blob/master/FAQ#L195. ฉันยังพิสูจน์ด้วยการลบกฎ allow 67/udp ใน ufw หลังจากนั้น dnsmasq จะหยุดตอบสนองต่อการค้นพบ DHCP อาจเป็นเรื่องที่น่าแปลกใจ (หรือไม่) แม้จะลบกฎการอนุญาตใน ufw แล้ว เราเตอร์ WAN ของฉันยังคงรับและตอบสนองต่อการค้นพบ DHCP อาจเป็นเพราะฉันมีกฎ iptables ที่กำหนดค่าให้ส่งต่อการรับส่งข้อมูลทั้งหมด แต่ไม่มีกฎ INPUT ที่เทียบเท่า (จนกว่าฉันจะเพิ่มกฎโดยใช้ ufw)
สิ่งที่ฉันต้องการบรรลุ
ฉันต้องการป้องกันไม่ให้ DHCP ค้นพบการออกอากาศบนเครือข่าย 10.11.12.0/24 ไม่ให้ไปถึงเครือข่าย 192.168.0.0/24
หากพิสูจน์ได้ยาก ฉันยินดีที่จะป้องกันไม่ให้ข้อเสนอ DHCP จากเราเตอร์ WAN เข้าถึงเครือข่าย 10.11.12.0/24
โปรดทราบว่าฉันไม่มีปัญหากับเครือข่าย 192.168.0.0/24 เนื่องจากฉันได้กำหนดค่า dnsmasq ไม่ให้เสนอ DHCP บนอินเทอร์เฟซ wlp3s0 (192.168.0.2) ดูเหมือนว่าจะใช้งานได้และ DHCP ค้นพบใน wlp3s0 (192.168.0.2/24) ไม่ได้รับการตอบกลับจาก dnsmasq
แล้วฉันพลาดอะไรไป? ฉันทำสิ่งนี้ผิดไปทั้งหมดหรือฉันแค่ทำไม่ถูก? ความช่วยเหลือใด ๆ ที่ชื่นชมมาก
สุขสันต์วันหยุด!
อัปเดต
ในการตอบคำถามในความคิดเห็นจาก @sleepyhead นี่คือการตั้งค่า iptables nat ของฉัน
เชน PREROUTING (นโยบายยอมรับแพ็กเก็ต 13452, 4312K ไบต์)
pkts bytes target prot เลือกใช้ปลายทางต้นทาง
Chain INPUT (นโยบายยอมรับ 48 แพ็กเก็ต, 12715 ไบต์)
pkts bytes target prot เลือกใช้ปลายทางต้นทาง
Chain OUTPUT (นโยบายยอมรับ 87 แพ็กเก็ต, 10884 ไบต์)
pkts bytes target prot เลือกใช้ปลายทางต้นทาง
Chain POSTROUTING (นโยบายยอมรับ 55 แพ็กเก็ต, 8622 ไบต์)
pkts bytes target prot เลือกใช้ปลายทางต้นทาง
32 2262 สวมหน้ากากทั้งหมด -- * wlp3s0 0.0.0.0/0 0.0.0.0/0
อัปเดต 2
เป็นไปได้ไหมว่านี่เป็นสิ่งประดิษฐ์จากวิธีการทดสอบของฉัน สิ่งที่ทำให้ฉันสงสัยคือ IP ต้นทางของเอาต์พุต tcpdump เป็นไปได้ไหมที่การเรียกใช้ DHCP Discover บนอินเทอร์เฟซที่มี IP อยู่แล้วให้ผลลัพธ์ที่แตกต่างจากที่ไม่มี อย่างไรก็ตาม หากฉันสามารถปรับเปลี่ยน Raspberry Pis อันใดอันหนึ่งใหม่ได้ ฉันจะทำการทดสอบนี้โดยใช้ไคลเอนต์ DHCP และดูว่าฉันได้ผลลัพธ์เดียวกันหรือไม่ แม้ว่าฉันจะสงสัยว่าจะทำหรือไม่