Score:0

แพ็กเก็ตขาออก Stunnel ถูกดัดแปลงอย่างแปลกประหลาด

ธง es

ฉันมีกล่องที่มีการตั้งค่า nics สองตัวเป็นบริดจ์ Ebtables เปลี่ยนเส้นทางการรับส่งข้อมูล http ไปยัง iptables ที่อยู่ IP ของ br0 คือ 10.10.10.10 ตั้งค่า Stunnel ด้วย transparent = source ยอมรับการเชื่อมต่อบน 127.1.1.1:8080 และเชื่อมต่อกับที่อยู่ IP เดียวกันเสมอ (10.10.20.20) บนพอร์ต 80

ฉันมีกฎ iptables ต่อไปนี้:

iptables -t nat -I PREROUTING -p tcp --dport 80 -i ens192 -j DNAT --to-destination 127.1.1.1:8080
iptables -t mangle -N ไดเวอร์ต
iptables -t mangle -A PREROUTING -p tcp -m ซ็อกเก็ต -j DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A DIVERT -j ยอมรับ

มีการตั้งค่าการกำหนดเส้นทางด้วย หากไคลเอนต์เชื่อมต่อกับกล่องบนพอร์ต 80 ทุกอย่างจะทำงานได้ Stunnel เชื่อมต่อกับปลายทาง (10.10.20.20) แต่ถ้าไคลเอ็นต์มีที่อยู่ปลายทางอื่น Stunnel จะยังคงพยายามเชื่อมต่อกับ 10.10.20.20 แต่ทำไม่ได้

ดังนั้นเมื่อฉันติดตาม Raw Packets เป็น 10.10.20.20 ฉันสามารถเห็นพฤติกรรมที่แตกต่างกัน สิ่งที่คาดหวัง:

ติดตาม id 71a8325b ip แพ็กเก็ตเอาต์พุตดิบ: oif "br0" ip saddr 10.10.10.10 ip daddr 10.10.20.20 ip dscp cs0 ip ecn ไม่ ect ip ttl 64 ip id 28971 ความยาวของ ip 60 tcp sport 51408 tcp dport 80 tcp syncs == หน้าต่าง tcp 64240
รหัสการติดตาม 71a8325b ip raw OUTPUT rule meta l4proto tcp ip daddr 10.10.20.20 counter packets 37 bytes 3265 meta nftrace set 1 (คำตัดสินดำเนินการต่อ)
ติดตาม id 71a8325b ip raw OUTPUT คำตัดสินดำเนินการต่อ
ติดตาม id 71a8325b ip raw นโยบายเอาต์พุตยอมรับ
รหัสการติดตาม 71a8325b ตัวกรอง IP แพ็กเก็ตเอาต์พุต: oif "br0" ip saddr 10.10.10.10 ip daddr 10.10.20.20 ip dscp cs0 ip ecn not-ect ip ttl 64 ip id 28971 ความยาวของ ip 60 tcp sport 51408 tcp dport 80 tcp syncs == หน้าต่าง tcp 64240
ติดตาม id 71a8325b กรอง ip คำตัดสิน OUTPUT ดำเนินการต่อ
ติดตาม id 71a8325b ตัวกรอง ip ยอมรับนโยบายเอาต์พุต
รหัสการติดตาม 71a8325b inet แพ็กเก็ตตัวกรองเอาต์พุต: oif "br0" ip saddr 10.10.10.10 ip daddr 10.10.20.20 ip dscp cs0 ip ecn not-ect ip ttl 64 ip id 28971 โปรโตคอล ip tcp ความยาว ip 60 tcp sport 51408 tcp tcp dport 80 == ซิงค์ tcp หน้าต่าง 64240
ติดตาม id 71a8325b inet กรองผลการตัดสินดำเนินการต่อ
รหัสการติดตาม 71a8325b inet ยอมรับนโยบายเอาต์พุตตัวกรอง

และสิ่งที่คาดไม่ถึงที่ stunnel ไม่สามารถเชื่อมต่อได้:

ติดตาม id fd9543bc ip แพ็กเก็ตเอาต์พุตดิบ: oif "br0" ip saddr 10.10.10.10 ip daddr 10.10.20.20 ip dscp cs0 ip ecn ไม่ ect ip ttl 64 ip id 26448 ความยาวของ ip 60 tcp sport 34188 tcp syn dport flags 80 tcp == หน้าต่าง tcp 64240
รหัสการติดตาม fd9543bc ip raw OUTPUT rule meta l4proto tcp ip daddr 10.10.20.20 counter packets 52 bytes 4540 meta nftrace set 1 (คำตัดสินดำเนินการต่อ)
ติดตาม id fd9543bc ip raw OUTPUT คำตัดสินดำเนินการต่อ
ติดตาม id fd9543bc ip raw นโยบายเอาต์พุตยอมรับ
ติดตาม id fd9543bc ตัวกรอง ip แพ็คเก็ตเอาต์พุต: oif "br0" ip saddr 10.10.10.10 ip daddr 127.1.1.1 ip dscp cs0 ip ecn ไม่ ect ip ttl 64 ip id 26448 ความยาวของ ip 60 tcp sport 34188 tcp dport 8080 tcp sync flags == หน้าต่าง tcp 64240
ติดตาม id fd9543bc กรอง ip คำตัดสิน OUTPUT ดำเนินการต่อ
นโยบายการติดตาม id fd9543bc ip filter OUTPUT ยอมรับ
ติดตาม id fd9543bc inet แพ็คเก็ตเอาต์พุตกรอง: oif "br0" ip saddr 10.10.10.10 ip daddr 127.1.1.1 ip dscp cs0 ip ecn ไม่ ect ip ttl 64 ip id 26448 โปรโตคอล ip tcp ความยาว ip 60 tcp sport 34188 tcp dport 8080 ธง == ซิงค์ tcp หน้าต่าง 64240
ติดตาม id fd9543bc inet กรองผลการตัดสินดำเนินการต่อ
รหัสการติดตาม fd9543bc inet ยอมรับนโยบายเอาต์พุตตัวกรอง

ดูเหมือนว่าที่อยู่ปลายทางจะถูก natted แต่ฉันไม่สามารถเข้าใจได้ว่าทำไมและเมื่อใด ฉันแค่ DNAT ในตาราง nat PREROUTING ตามความเข้าใจของฉัน แพ็กเก็ตนี้ไม่ควรละเมิดกฎนี้อีก แต่อย่างใด และเหตุใดสิ่งนี้จึงเกิดขึ้น ในเมื่อปลายทางเดิมไม่ใช่ที่อยู่ IP ของกล่อง ฉันคิดว่า stunnel อาจเปลี่ยนแพ็กเก็ตเอง

นี่คือเอาต์พุตบันทึก iptables แบบเต็ม

# สร้างโดย iptables-save v1.8.7 เมื่อพฤศจิกายน 18 22:40:01 2021
*แนท
: ยอมรับ [14:1295]
: ยอมรับอินพุต [14:1295]
: เอาต์พุตยอมรับ [2:196]
:หลังยอมรับ [4:316]
-A PREROUTING -i ens192 -p tcp -m tcp --dport 80 -j DNAT --to-ปลายทาง 127.1.1.1:8080
ให้สัญญา
# เสร็จสิ้นเมื่อ พฤ. 18 พ.ย. 22:40:01 น. 2564
# สร้างโดย iptables-save v1.8.7 เมื่อพฤศจิกายน 18 22:40:01 2021
* แหลกเหลว
: กำลังดำเนินการยอมรับ [15:1154]
: ยอมรับอินพุต [172:24172]
:ส่งต่อ ยอมรับ [0:0]
: ยอมรับเอาต์พุต [222:44999]
:หลังยอมรับ [222:44999]
:DIVERT - [0:0]
-A PREROUTING -p tcp -m ซ็อกเก็ต -j DIVERT
-A DIVERT -j MARK --set-xmark 0x1/0xffffffff
-A DIVERT -j ยอมรับ
ให้สัญญา
# เสร็จสิ้นเมื่อ พฤ. 18 พ.ย. 22:40:01 น. 2564

ความคิดใด ๆ ฉันจะทำสิ่งนี้ได้อย่างไร

A.B avatar
cl flag
A.B
ดูเหมือนคำถามอื่นๆ นี้จะล้าสมัยไปแล้วใช่ไหม https://serverfault.com/questions/1083810/iptables-modify-output-flow
es flag
ไม่ คำถามอื่นมุ่งเน้นไปที่ความเป็นไปได้ในการแก้ปัญหาด้วย iptables
Nikita Kipriyanov avatar
za flag
ตาม [การไหลของแพ็กเก็ต](https://upload.wikimedia.org/wikipedia/commons/3/37/Netfilter-packet-flow.svg) แพ็กเก็ตที่ผลิตภายนอกซึ่งถูกส่งไปยังเส้นทางจาก `broute` ควร ตีกฎ 'nat PREROUTING' (ครั้งเดียว เนื่องจากตาราง nat ถูกสำรวจสำหรับการเชื่อมต่อใหม่เท่านั้น) แต่แพ็กเก็ตที่สร้างขึ้นในเครื่องไม่มีทางที่จะตีกฎนั้น ดังนั้นพฤติกรรมที่คุณเห็นจึงเป็นไปตามคาด
es flag
ไม่ ไม่ใช่ เนื่องจากแพ็กเก็ตที่ดูเหมือนจะได้รับ DNATed เป็นแพ็กเก็ตที่สร้างขึ้นในเครื่อง ดังนั้นจึงต้องผ่านเชน OUTPUT เท่านั้น

โพสต์คำตอบ

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