สรุป
ฉันใช้ Nginx เป็น reverse proxy และโดยเฉพาะอย่างยิ่งการทำงานของมัน proxy_bind
เพื่อส่ง IP ไคลเอนต์จริงไปยังแบ็กเอนด์ ฉันตาม เอกสารนี้จาก nginx.com.
ทำงานได้ดีทั้งเมื่อโฮสต์เซิร์ฟเวอร์ HTTP บนเครื่องอื่นหรือบนพร็อกซีย้อนกลับเครื่องใดเครื่องหนึ่งโดยตรง ยกเว้นในกรณีที่สองหากเซิร์ฟเวอร์ HTTP รับฟังจาก localhost
=> ฉันไม่สามารถทำให้การกำหนดค่านี้ใช้งานได้:
# /etc/nginx/conf.d/nginx-revprox-test.conf
เซิร์ฟเวอร์ {
ฟัง 80;
ที่ตั้ง / {
proxy_pass http://127.0.0.1:8080;
proxy_bind $remote_addr โปร่งใส;
}
}
รายละเอียด
สมมติฐาน:
- ที่อยู่ IP:
- พร็อกซีย้อนกลับ/แบ็กเอนด์ในเครื่อง:
192.168.1.90 (eth0)
& 172.17.0.1 (เอท1)
- แบ็กเอนด์ภายนอก:
172.17.0.2
- ลูกค้า:
192.168.1.91
- พอร์ต:
- ส่วนหน้า:
80
(ไม่มี TLS)
- แบ็กเอนด์:
8080
กรณี n°1: เซิร์ฟเวอร์ HTTP โฮสต์บนแบ็กเอนด์ภายนอก (http://172.17.0.2:8080).
# /etc/nginx/conf.d/nginx-revprox-test.conf
เซิร์ฟเวอร์ {
ฟัง 192.168.1.90:80;
ที่ตั้ง / {
proxy_pass http://172.17.0.2:8080;
proxy_bind $remote_addr โปร่งใส;
}
}
เดอะ คู่มือ บอกว่าเราต้องกำหนดค่า iptables ดังนั้น:
iptables -t mangle -A PREROUTING -p tcp -s 172.17.0.2 --sport 8080 -j MARK --set-xmark 0x1/0xffffffff
กฎ ip เพิ่ม fwmark 1 ค้นหา 100
เส้นทาง ip เพิ่มในเครื่อง 0.0.0.0/0 dev lo table 100
=> ทำงานได้ดี
กรณี n°2: เซิร์ฟเวอร์ HTTP ถูกโฮสต์บนเครื่องเดียวกันกับพร็อกซีย้อนกลับและรับฟัง eth1
(http://172.17.0.1:8080).
# /etc/nginx/conf.d/nginx-revprox-test.conf
เซิร์ฟเวอร์ {
ฟัง 192.168.1.90:80;
ที่ตั้ง / {
proxy_pass http://172.17.0.1:8080;
proxy_bind $remote_addr โปร่งใส;
}
}
ตาม คำตอบนี้ และ แผนภาพนี้, เท่านั้น เอาต์พุต และ โพสต์ นำไปใช้กับแพ็กเก็ตที่สร้างขึ้นในเครื่อง เราจำเป็นต้องเปลี่ยนกฎ iptables ดังนั้น:
iptables -t mangle -A OUTPUT -p tcp -s 172.17.0.2 --sport 8080 -j MARK --set-xmark 0x1/0xffffffff
=> มันใช้งานได้เช่นกัน
กรณี n°3: เซิร์ฟเวอร์ HTTP ถูกโฮสต์ในเครื่องแต่รับฟัง แท้จริง
(http://127.0.0.1:8080).
# /etc/nginx/conf.d/nginx-revprox-test.conf
เซิร์ฟเวอร์ {
ฟัง 192.168.1.90:80;
ที่ตั้ง / {
proxy_pass http://127.0.0.1:8080;
proxy_bind $remote_addr โปร่งใส;
}
}
=> [!] ฉันไม่สามารถใช้งานได้แม้จะมี เอาต์พุต กฎใน iptables
ขด http://192.168.1.90:80
ไม่ทำงานจากไคลเอนต์ (ใช้งานได้จากเซิร์ฟเวอร์เท่านั้น แต่นั่นไม่ใช่ประเด็น)
ฉันพลาดบางอย่างเกี่ยวกับ iptables คุณช่วยฉันได้ไหม