Score:1

การส่งต่อ IP ด้วย IPTables สำหรับโหมด lvs nat

ธง vn

ฉันกำลังเรียนรู้เกี่ยวกับตัวโหลดบาลานเซอร์ L3 และตอนนี้กำลังทำงานในโหมด Keepalived NAT โฟลว์แพ็กเก็ตควรเป็นไคลเอ็นต์ ------> L3(lvs DNAT)------> เซิร์ฟเวอร์จริง และโฟลว์ที่ส่งคืนควรถูกต้องทุกประการ ตรงข้ามกับโฟลว์คำขอ แต่ lvs DNAT เปลี่ยนเฉพาะ NAT ปลายทาง หมายความว่าเฉพาะ IP ปลายทางของแพ็กเก็ตเท่านั้นที่เปลี่ยนแปลง เช่น) [source=client ip,destination=real server ip] ดังนั้น หลังจากที่เซิร์ฟเวอร์จริงประมวลผลคำขอแล้ว ส่งต่อไปยังเกตเวย์เริ่มต้นแทนเซิร์ฟเวอร์ L3 และแพ็กเก็ตหลุด ฉันไม่ต้องการตั้งค่าเซิร์ฟเวอร์ L3 เป็นเกตเวย์เริ่มต้นของเซิร์ฟเวอร์จริง แต่ฉันต้องการโซลูชันที่เกี่ยวข้องกับตาราง IP เพื่อส่งต่อการรับส่งข้อมูลจากเซิร์ฟเวอร์จริงไปยัง L3 เซิร์ฟเวอร์เมื่อมาถึงพอร์ต 8443 และ 8080

ตาราง IP ให้วิธีการส่งต่อทราฟฟิกก่อนที่จะประมวลผลแพ็กเก็ตผ่าน PREROUTING แต่สิ่งที่ฉันต้องการคือการส่งต่อทราฟฟิกไปยัง L3 หลังจากที่เซิร์ฟเวอร์ประมวลผลคำขอ ฉันลองกับเชน OUTPUT โดยไม่มีโชค sudo iptables -t nat -A OUTPUT -p tcp --match multiport --sports 8443,8080 -j DNAT --to 172.24.248.201

172.24.248.201 เป็น ip ของเซิร์ฟเวอร์ L3

ขอบคุณล่วงหน้า

Score:1
ธง cl
A.B

มันคือ การกำหนดเส้นทาง ปัญหา. iptables ไม่ได้กำหนดเส้นทาง แต่การกำหนดเส้นทางอาจได้รับผลกระทบจากที่อยู่ที่สามารถเปลี่ยนแปลงได้ และนั่นคือสาเหตุ iptables มักถูกสันนิษฐานว่าทำการกำหนดเส้นทางอย่างผิดพลาด เพราะเหตุนี้ iptables ไม่สามารถ เดอะ วิธีแก้ไขปัญหา (แต่บางครั้งอาจเป็นส่วนหนึ่งของวิธีแก้ปัญหาดังกล่าว)

ยิ่งกว่านั้นความพยายามที่จะเปลี่ยนแปลงก ตอบ แพ็กเก็ตที่ใช้ NAT ของ Netfilter/iptables จะถูกละเว้น: the แนท ตารางจะถูกเรียกใช้สำหรับแพ็กเก็ตแรกของโฟลว์เท่านั้น ไม่ใช่สำหรับการตอบกลับ: iptables -t nat -A OUTPUT -p tcp --match multiport --sports 8443,8080 -j DNAT --to 172.24.248.201 จะไม่ตรงกัน และถ้าสามารถจับคู่ได้ สิ่งนี้จะไม่ทำงาน เนื่องจากปลายทางของการตอบกลับจะต้องเป็นต้นทางของข้อความค้นหาเริ่มต้นที่เซิร์ฟเวอร์จริงเห็น: ที่อยู่ IP ของไคลเอ็นต์ระยะไกลจริง ไม่ใช่ L3 LB

ด้านล่างนี้เป็นวิธีการง่ายๆ ในการดำเนินการอย่างถูกต้องบนเซิร์ฟเวอร์จริง: ด้วย การกำหนดเส้นทางนโยบาย.


ในปัญหาเฉพาะและคำตอบนี้ฉันจะถือว่า เคอร์เนลลินุกซ์ >= 4.17 สำหรับ "ขยายการสนับสนุนการจับคู่กฎ fib เพื่อรวมการแข่งขันกีฬา dport และ ip proto" ซึ่งหลีกเลี่ยงการใช้ที่ซับซ้อนของ iptables เพื่อทำเครื่องหมายแพ็คเก็ต (แต่ยังคงต้องมีการกำหนดเส้นทางนโยบายอยู่ดี)

เราต้องแน่ใจว่าพอร์ตเฉพาะของเซิร์ฟเวอร์จริงไม่สามารถทับซ้อนกับช่วงพอร์ตไดนามิกของเซิร์ฟเวอร์จริง (ใช้เมื่อเซิร์ฟเวอร์เป็นไคลเอ็นต์ เช่น สำหรับการสืบค้น DNS หรือการอัปเกรดระบบ):

# sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768 60999

ตรวจสอบให้แน่ใจว่าพอร์ตด้านล่างอยู่เหนือพอร์ตสูงสุดของเซิร์ฟเวอร์จริงที่ใช้สำหรับบริการ ที่นี่: 32768 > 8443 ก็ดีพอ

เพิ่มตารางเส้นทางสำหรับทราฟฟิกเฉพาะที่ต้องการใช้ L3 LB เป็นเกตเวย์ ตาราง 248201 เป็นค่าที่เลือกโดยพลการ ฉันสมมติว่าชื่ออินเทอร์เฟซของเซิร์ฟเวอร์จริง eth0โปรดดัดแปลง:

เส้นทาง ip เพิ่มค่าเริ่มต้นผ่าน 172.24.248.201 dev eth0 ตาราง 248201

เพิ่มตัวเลือก: หนึ่งรายการต่อช่วงพอร์ต อาจเป็นช่วงเดียวที่กว้าง (ตราบใดที่ไม่มีการโต้ตอบกับพอร์ตไดนามิก ก็ไม่เกี่ยว) หรือกฎ X สำหรับ X ที่แตกต่างกัน สำหรับช่วงเดียว:

กฎ ip เพิ่ม iif lo ipproto tcp sport 8000-8443 ค้นหา 248201

ที่ไหน ไอฟ โล เป็นไวยากรณ์พิเศษสำหรับทราฟฟิกขาออกที่เริ่มต้นในเครื่อง และไม่เกี่ยวกับ แท้จริง อินเตอร์เฟซ.

ตอนนี้ทราฟฟิกขากลับที่ตั้งใจไว้ทั้งหมดจะถูกกำหนดเส้นทางโดยใช้ L3 LB เป็นเกตเวย์ การรับส่งข้อมูลอื่น ๆ จะใช้เกตเวย์เริ่มต้นตามปกติหากจำเป็น


ฉันไม่คิดว่า สพร ควรเป็นปัญหาหากเปิดใช้งาน เว้นแต่ว่าเกตเวย์เริ่มต้นตามปกติของเซิร์ฟเวอร์จะใช้อินเทอร์เฟซอื่น ถ้านี่เป็นปัญหาก็เป็นไปได้ ตั้งเป็นโหมด Loose แทน.

จะทำเฉพาะในกรณีที่ไม่ได้ผล (และถึงอย่างนั้น eth0 อาจจะเพียงพอแทน ทั้งหมด ด้านล่าง):

sysctl -w net.ipv4.conf.all.rp_filter=2
chellathurai avatar
vn flag
หมายความว่าเราไม่สามารถตั้งค่า ip ต้นทางเป็น arbitary IP ได้ใช่ไหม ? คุณช่วยอธิบายวลีสั้น ๆ ได้ไหม _ที่อยู่ IPv4 ของ L3 LB ไม่ปรากฏในขั้นตอนการตอบกลับที่คาดไว้_
A.B avatar
cl flag
A.B
นี่คือตัวอย่าง หากไคลเอนต์ระยะไกลที่มีที่อยู่ 192.0.2.2 เชื่อมต่อกับ 172.24.248.201:443 ซึ่งเปลี่ยนเส้นทางโดยใช้ NAT ไปยัง (เช่น ฉันไม่มีข้อมูล) เซิร์ฟเวอร์จริงที่มีที่อยู่และพอร์ต 172.24.248.202:8443 เซิร์ฟเวอร์จริงนี้สามารถ 't send back the traffic to 172.24.248.201 : it must be send back to 192.0.2.2 : the address 172.24.248.201 is notปรากฏที่ใดก็ได้.ในขณะเดียวกันฉันเห็นว่าบางส่วนของคำอธิบายของฉันไม่ถูกต้อง. กฎ DNAT จะไม่ตรงกันเพราะในการตอบกลับ OUTPUT โฟลว์ไม่ได้อยู่ในสถานะใหม่ ฉันจะต้องแก้ไขจุดเริ่มต้นของคำตอบของฉัน ทางออกไม่เปลี่ยนแปลง
A.B avatar
cl flag
A.B
คำตอบที่แก้ไขแล้ว (ตัวโซลูชันเองไม่เปลี่ยนแปลง)
chellathurai avatar
vn flag
การกำหนดเส้นทางนโยบายช่วยแก้ปัญหา
chellathurai avatar
vn flag
**NAT ถูกละเว้น** เชน OUTPUT ดูเหมือนว่าจะทำงาน ฉันยืนยันโดยใช้ LOG แต่ NAT ที่ทำเสร็จใน OUTPUT ดูเหมือนจะไม่มีผล
A.B avatar
cl flag
A.B
คำตอบของฉันไม่ได้ใช้ NAT คำตอบของฉันไม่ได้ใช้ iptables คำตอบของฉันขึ้นอยู่กับ 2 คำสั่ง: คำสั่งหนึ่งขึ้นต้นด้วย `ip route` คำสั่งหนึ่งขึ้นต้นด้วย `ip rule` การกระทำเหล่านี้ทำที่ไหน?
chellathurai avatar
vn flag
ฉันได้ลอง NAT OUPUT chain ก่อนที่จะโพสต์ที่นี่นั่นคือสิ่งที่ฉันได้กล่าวถึง คุณช่วยจัดหาวิธีแก้ปัญหาแบบเดียวกันสำหรับ freebsd โดยใช้ ipfw ให้ฉันได้ไหม
A.B avatar
cl flag
A.B
ไม่ ฉันไม่มีความรู้เรื่อง FreeBSD คำถามถูกแท็ก *iptables* ซึ่งบอกเป็นนัยถึง Linux (และความพยายามของ iptables ก็เกิดขึ้นบน Linux ด้วย)

โพสต์คำตอบ

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