Score:0

iptables และ Nginx reverse proxy สำหรับ localhost

ธง pk

สรุป

ฉันใช้ 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 คุณช่วยฉันได้ไหม

pk flag
ความแม่นยำ: กรณีที่สามที่ไม่มี `proxy_bind` ทำงานได้ดี แต่แน่นอนว่าเราสูญเสียความโปร่งใสของ IP
us flag
ฉันจะใช้การส่งที่อยู่ IP จริงในส่วนหัว จากนั้นแบ็กเอนด์จะใช้ที่อยู่ IP นั้น การแฮ็กตารางเส้นทางเพื่อให้บรรลุเป้าหมายนี้ทำให้เข้าใจโซลูชันได้ยากขึ้น
djdomi avatar
za flag
คุณไม่สามารถตั้งค่าส่วนหัวที่กำหนดเองได้หรือไม่ NGINX ทำได้ แต่แอปของคุณล่ะ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา