ฉันตั้งค่า kubernetes ด้วยพ็อดที่มีคอนเทนเนอร์ต่อไปนี้:
- ตู้ปลาหมึก
- transocks (เช่น redsocks); พร็อกซี SOCKS แบบโปร่งใส
ฉันใช้สิ่งนี้ใน k3s ในเครื่องบน linux PC และต้องการพร็อกซีทราฟฟิกขาออกทั้งหมดจากพีซีอย่างโปร่งใสผ่านพร็อกซีโปร่งใสนี้ ดังนั้นการรับส่งข้อมูลโฮสต์ขาออกจึงถูกบังคับให้ไปที่พอร์ต transocks บนพ็อด kubernetes ตอนนี้ใช้งานไม่ได้ การเชื่อมต่อหมดเวลา
ฉันรู้ว่ากฎ iptables ที่ฉันใช้นั้นดีเพราะกฎเหล่านั้นทำงานเมื่อฉันเรียกใช้คอนเทนเนอร์ด้านบนโดยตรงในนักเทียบท่าโดยใช้เครือข่ายโฮสต์ ผู้ใช้ Squid และ Transocks คือ uid 31 และ 32 ฉันสร้างกฎ iptables ต่อไปนี้:
#iptables -t nat -A OUTPUT -m เจ้าของ --uid-เจ้าของ 31 -j ยอมรับ
#iptables -t nat -A OUTPUT -m เจ้าของ --uid-เจ้าของ 32 -j ยอมรับ
#iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 12345
#iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-port 12345
ตำแหน่งที่ 12345 คือพอร์ตทรานส์ล็อกที่กำลังฟังอยู่ อีกครั้ง กฎเหล่านี้ใช้งานได้ดีภายใต้นักเทียบท่าโดยใช้เครือข่ายโฮสต์transocks ไปข้างหน้าเป็น 127.0.0.1:3128 (squid port) และมีการพร็อกซีอย่างโปร่งใส อย่างไรก็ตามเมื่อฉันลองใช้ kubernetes pod โดยใช้ nodeport (30345 สำหรับ transocks, 30128 สำหรับ Squid) ดูเหมือนจะไม่ทำงาน การเชื่อมต่อหยุดทำงานจนกว่าจะหมดเวลา
ฉันควรจะพูดถึงว่าฉันได้ลองใช้ DNS เหมือนกันโดยที่ฉันเปลี่ยนเส้นทางการรับส่งข้อมูลเอาต์พุตที่ผูกไว้สำหรับ 53 ไปยังพอร์ต 9053 (พอร์ต DNS ที่แมปในนักเทียบท่า) และใช้งานได้ แต่เมื่อฉันใช้ใน kubernetes และเปลี่ยนเส้นทางไปยัง nodeport (30053 ) มันแฮงค์ในลักษณะเดียวกัน ดังนั้นด้วยเหตุผลบางอย่าง พอร์ตโหนดดูเหมือนจะไม่ทำงานเมื่อคุณเปลี่ยนเส้นทางการรับส่งข้อมูลไปยังพอร์ตเหล่านั้น ฉันสงสัยว่าจะมีใครบอกฉันได้บ้างว่าฉันพลาดอะไรไปที่นี่ ฉันต้องไม่เข้าใจระบบเครือข่าย kubernetes เป็นอย่างดี
ในกรณีที่มีคนต้องการเห็นรายการ kuebrnetes ของฉัน พวกเขาอยู่ที่นี่
การปรับใช้
{
"apiVersion": "แอป/v1",
"ชนิด": "การปรับใช้",
"ข้อมูลเมตา": {
"ชื่อ": "ตัวกรองเว็บ",
"ป้ายกำกับ": {
"แอป": "ตัวกรองเว็บ"
}
},
"ข้อมูลจำเพาะ": {
"แบบจำลอง": 1,
"ตัวเลือก": {
"matchLabels": {
"แอป": "ตัวกรองเว็บ"
}
},
"เทมเพลต": {
"ข้อมูลเมตา": {
"ป้ายกำกับ": {
"แอป": "ตัวกรองเว็บ"
}
},
"ข้อมูลจำเพาะ": {
"คอนเทนเนอร์": [
{
"ชื่อ": "ปลาหมึก",
"ภาพ": "jusschwa/squid-ssl:ล่าสุด",
"พอร์ต": [
{
"พอร์ตคอนเทนเนอร์": 3128
}
]
}, {
"ชื่อ": "transocks",
"image": "jusschwa/transocks-proxy:ล่าสุด",
"พอร์ต": [
{
"คอนเทนเนอร์พอร์ต": 12345
}
]
}
]
}
}
}
}
บริการ
{
"apiVersion": "v1",
"ชนิด": "บริการ",
"ข้อมูลเมตา": {
"ชื่อ": "ตัวกรองเว็บ",
"ป้ายกำกับ": {
"แอป": "ตัวกรองเว็บ"
}
},
"ข้อมูลจำเพาะ": {
"ประเภท": "โหนดพอร์ต",
"ตัวเลือก": {
"แอป": "ตัวกรองเว็บ"
},
"พอร์ต": [
{
"ชื่อ": "ปลาหมึก",
"โปรโตคอล": "TCP",
"พอร์ต": 3128,
"พอร์ตเป้าหมาย": 3128,
"โหนดพอร์ต": 30128
},
{
"ชื่อ": "transocks",
"โปรโตคอล": "TCP",
"พอร์ต": 12345,
"targetPort": 12345,
"โหนดพอร์ต": 30345
}
]
}
}
กฎ iptables
iptables -t nat -A OUTPUT -m เจ้าของ --uid-เจ้าของ root -j ยอมรับ
iptables -t nat -A OUTPUT -m เจ้าของ --uid-เจ้าของ 31 -j ยอมรับ # ผู้ใช้ปลาหมึก
iptables -t nat -A OUTPUT -m เจ้าของ --uid-เจ้าของ 32 -j ACCEPT # ผู้ใช้ transocks
iptables -t nat -A OUTPUT -m เจ้าของ --uid-owner 32 -j ACCEPT # ผู้ใช้ที่ไม่ถูกผูกไว้
iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports 30345
iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-ports 30345
iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 30053
ขอขอบคุณอีกครั้งสำหรับความช่วยเหลือ