การตั้งค่าเลเยอร์ 2 MitM:
++++
| โฮสต์ |
++--------|------| ++--------+
| ลูกค้า | <--> | MITM | <--> | เซิร์ฟเวอร์ |
+++++ +++++ ++--------
TLDR:
Rasperry Pi's eth0
เชื่อมต่อกับอินเทอร์เน็ตและ wlan0
ทำหน้าที่เป็นจุดเชื่อมต่อโดยใช้ hostapd การเชื่อมอินเทอร์เฟซทั้งสองทำงานได้ดี การเปลี่ยนทิศทางทราฟฟิก HTTP(S) บนบริดจ์ไปยัง Python mitmproxy ไม่ทำงาน คำสั่งต่อไปนี้ให้ไคลเอนต์เชื่อมต่อกับอินเทอร์เน็ตจุดเข้าใช้งาน แต่ไม่มีการรับส่งข้อมูลผ่าน Python mitmproxy ที่ฟังอยู่ 8080
:
brctl บวกbr br0
brctl บวก br0 eth0
ลิงค์ ip ตั้งค่า dev br0 ขึ้น
echo "ปฏิเสธอินเทอร์เฟซ wlan0 eth0" >> /etc/dhcpcd.conf
echo "อินเทอร์เฟซ br0" >> /etc/dhcpcd.conf
echo "bridge=br0" >> /etc/hostapd/hostapd.conf
iptables -A PREROUTING -i br0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -A PREROUTING -i br0 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 8080
iptables -A โพสต์ -o eth0 -j MASQUERADE
สิ่งที่ฉันได้ลองไปแล้ว:
- ถอยหลังไปสองก้าวและตั้งค่าเลเยอร์ 3 NAT MitM
- ก้าวไปข้างหน้าหนึ่งก้าวและตั้งค่าบริดจ์เครือข่ายอย่างง่าย
- พยายามตั้งค่า Layer 3 MitM อีกครั้งและค้นหาปัญหา
การตั้งค่าเลเยอร์ 3 MitM:
+++++ +++++ ++--------
| ลูกค้า | <--> | MITM | <--> | เซิร์ฟเวอร์ |
+++++ +++++ ++--------
การตั้งค่าเลเยอร์ 3 ใช้ไม่ได้กับกฎ iptable ต่อไปนี้:
iptables -t nat -A โพสต์ -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -i wlan0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -A PREROUTING -i wlan0 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 8080
[อ้างอิง]
[อ้างอิง]
หลังจากเพิ่มกฎเพิ่มเติมต่อไปนี้แล้ว ก็ใช้งานได้ดี และทราฟฟิก HTTP(S) ทั้งหมดของไคลเอ็นต์ที่เชื่อมต่อกับจุดเข้าใช้งานของ Pi ส่งผ่าน Python mitmproxy:
iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ยอมรับ
iptables -A FORWARD -i wlan0 -o eth0 -j ยอมรับ
มีคนอธิบายเรื่องนี้ไหม? ฉันไม่เข้าใจว่าทำไม เพราะสำหรับการกำหนดเส้นทาง NAT การมีกฎข้อเดียวก็เพียงพอแล้ว:
iptables -t nat -A โพสต์ -o eth0 -j MASQUERADE
การตั้งค่าบริดจ์เลเยอร์ 2
ต่อไป ฉันได้ตั้งค่าบริดจ์อย่างง่ายโดยไม่ตั้งใจที่จะสกัดกั้นทราฟฟิก HTTP(S):
brctl บวกbr br0
brctl บวก br0 eth0
ลิงค์ ip ตั้งค่า dev br0 ขึ้น
echo "ปฏิเสธอินเทอร์เฟซ wlan0 eth0" >> /etc/dhcpcd.conf
echo "อินเทอร์เฟซ br0" >> /etc/dhcpcd.conf
echo "bridge=br0" >> /etc/hostapd/hostapd.conf
systemctl daemon-โหลดซ้ำ
การตั้งค่านี้ทำงานได้ดี
การตั้งค่าเลเยอร์ 2 MitM:
brctl บวกbr br0
brctl บวก br0 eth0
ลิงค์ ip ตั้งค่า dev br0 ขึ้น
echo "ปฏิเสธอินเทอร์เฟซ wlan0 eth0" >> /etc/dhcpcd.conf
echo "อินเทอร์เฟซ br0" >> /etc/dhcpcd.conf
echo "bridge=br0" >> /etc/hostapd/hostapd.conf
iptables -A PREROUTING -i br0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -A PREROUTING -i br0 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 8080
iptables -A โพสต์ -o eth0 -j MASQUERADE
[อ้างอิง]
ไคลเอนต์ของจุดเชื่อมต่อของ Pi มีการเข้าถึงอินเทอร์เน็ต แต่ทราฟฟิกไม่ผ่าน Python mitmproxy
ด้วยความช่วยเหลือของ Google ฉันพบว่า iptables ตามค่าเริ่มต้นใช้ไม่ได้กับบริดจ์เลเยอร์ 2 และฉันต้องเปิดใช้งาน:
modprobe br_netfilter
เสียงสะท้อน 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
[อ้างอิง]
การปรับแต่งเพิ่มเติมบางอย่างไม่สามารถแก้ปัญหาได้:
เสียงสะท้อน 0 > /proc/sys/net/ipv4/conf/default/rp_filter
เสียงสะท้อน 0 > /proc/sys/net/ipv4/conf/all/rp_filter
[อ้างอิง]
สิ่งต่าง ๆ เลวร้ายลงเนื่องจากไม่มีไคลเอนต์ที่เชื่อมต่อกับจุดเชื่อมต่อของ Pi ที่มีการเข้าถึงอินเทอร์เน็ต
ฉันไม่เห็นว่ามีปัญหาอะไร ความคิดใด ๆ ?
อาจช่วยได้:
$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 10 (บัสเตอร์)"