ฉันมีการติดตั้ง NFS บนอุโมงค์ Strongswan IPSec ซึ่งห่อหุ้มอยู่ในอุโมงค์ 6to4 IPSec เป็นเพราะฉันต้องการการเข้ารหัสสำหรับทราฟฟิก NFS 6to4 เป็นเพราะผู้ให้บริการ VPS จะไม่กำหนดคำนำหน้า IPv6 ดั้งเดิมให้กับเซิร์ฟเวอร์ของฉัน เนื่องจากฉันมีปัญหา MTU กับอุโมงค์ 6to4 ฉันจึงต้องลด MTU บนอินเทอร์เฟซอุโมงค์ให้เหลือน้อยที่สุด (1280 â หากฉันพยายามตั้งค่าอะไรที่ต่ำกว่านี้ ฉันได้รับข้อความ "ข้อผิดพลาด: mtu น้อยกว่าค่าต่ำสุดของอุปกรณ์" ).
NFS ยังคงต้องการส่งแพ็กเก็ตผ่าน MTU ฉันรู้เรื่องนี้เพราะฉันมีกฎ nftables เพื่อบันทึกแพ็กเก็ต ESP:
เอาต์พุตลูกโซ่ {
ประเภทตัวกรองลำดับความสำคัญของเอาต์พุตของตะขอตัวกรอง; นโยบายยอมรับ;
ip6 nexthdr esp ตัวนับแพ็กเก็ต 303367 ไบต์ 323173696 บันทึกการยอมรับ
}
ดังนั้นฉันจึงเห็นแพ็กเก็ตเหล่านี้เข้าสู่ระบบ syslog/journal:
29 มกราคม 21:41:18 เคอร์เนล nfsclient: IN= OUT=he-ipv6 SRC=fd48:2b50:6a95:a6db:0000:0000:0000:0004 DST=fdc8:d5f9:cbbf:b206:0000:0000:0000: 2001 LEN=1316 TC=0 HOPLIMIT=64 FLOWLBL=155038
(IPs ถูกเปลี่ยนเป็นส่วนตัวด้วยเหตุผลด้านความเป็นส่วนตัว)
ตอนนี้ฉันไม่เห็นแพ็กเก็ตที่บันทึกไว้ด้วย tcpdump
เนื่องจากถูกกล่าวหาว่าเคอร์เนลถูกทิ้งเนื่องจากเกิน MTUฉันถือว่า NFS พยายามปฏิบัติตามการตั้งค่า MTU แต่ไม่ทราบว่าแพ็คเกจของมันจะถูกห่อหุ้มใน IPSec ดังนั้นแม้ว่า NFS จะสร้างแพ็กเก็ตที่มีขนาดต่ำกว่า 1280 ไบต์ ส่วนหัวของ ESP ที่เพิ่มเข้าไปจะได้รับแพ็กเก็ตมากกว่า MTU ที่ตั้งไว้ ฉันยังสงสัยว่า NFS ตั้งค่าสถานะ DF บนแพ็กเก็ต เพราะมิฉะนั้นการแยกส่วนจะทำงานได้ (ผมทดสอบด้วย ping6 -M ต้องการ
และแพ็กเก็ตที่แยกส่วนผ่านไป) ดังนั้นฉันจึงไม่สามารถลด MTU ได้ NFS ยืนยันที่จะส่งแพ็กเก็ตที่จะผ่าน MTU เมื่อเข้ารหัสและแม้แต่ตั้งค่าสถานะ DF
ตอนนี้ฉันทำอะไรได้บ้าง สิ่งต่อไปนี้ที่ฉันคิดเกี่ยวกับ แต่ไม่รู้วิธีการใช้:
- กำหนดขนาดแพ็กเก็ตสูงสุดสำหรับ NFS เช่น ด้วยตัวเลือกการเมานต์ แต่ฉันไม่คิดว่าจะมีการตั้งค่าดังกล่าว ฉันค้นหาแล้ว
- กำหนดค่า Strongswan เพื่อจัดการกับสถานการณ์ แต่ฉันไม่พบตัวเลือกดังกล่าวเช่นกัน
- ตั้งกฎ nftables ที่แจ้ง NFS ว่าควรสร้างแพ็กเก็ตที่มีขนาดเล็กลง เช่น. รายงาน MTU ที่ต่ำกว่าสำหรับ NFS เมื่อค้นหา - ไม่ทราบว่าเป็นไปได้หรือไม่
- ลบแฟล็ก DF ออกจากแพ็กเก็ตเพื่อบังคับให้แยกส่วน ไม่ทราบว่าต้องทำอย่างไรครับ หรือเป็นไปได้ครับ
ฉันคิดว่า nftables เป็นวิธีที่จะไป แต่ถ้าสามารถแก้ไขได้ในระดับ NFS ก็จะดียิ่งขึ้น ฉันยังชื่นชมวิธีแก้ปัญหาด้วย iptables ฉันสามารถค้นหาสิ่งที่เทียบเท่ากับ nftables
เนื่องจากมีการถามในความคิดเห็น ฉันจึงให้ข้อมูลเกี่ยวกับอินเทอร์เฟซของฉัน
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP โหมด DEFAULT กลุ่มเริ่มต้น qlen 1000
ลิงค์/อีเธอร์ aa:00:11:4d:f7:01 brd ff:ff:ff:ff:ff:ff
4: he-ipv6@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1280 qdisc noqueue state UNKNOWN mode DEFAULT กลุ่มเริ่มต้น qlen 1000
ลิงค์/นั่ง 192.168.32.84 เพียร์ 216.66.84.42
และนี่คืออุโมงค์ (อุโมงค์ไอพี
):
sit0: ipv6/ip remote ใดๆ ในเครื่อง ttl ใดๆ 64 nopmtudisc 6rd-prefix 2002::/16
he-ipv6: ipv6/ip ระยะไกล 216.66.84.42 ท้องถิ่น 192.168.32.84 ttl 255 6rd-prefix 2002::/16
(เปลี่ยน IPv4 สาธารณะของฉันเป็นที่อยู่ส่วนตัว แต่ในความเป็นจริง ฉันมีที่อยู่ที่กำหนดเส้นทางได้ทั่วโลกสำหรับ ท้องถิ่น
; 216.66.84.42 เป็นเกตเวย์อุโมงค์ HE 6to4 ซึ่งเป็นที่รู้จักดีจึงทิ้งไว้ที่นี่)
และนี่คือเส้นทางเริ่มต้นที่ใช้สำหรับการรับส่งข้อมูล:
ค่าเริ่มต้นผ่าน fd48:2b50:6a95:a6db::1 dev he-ipv6 metric 1024 onlink pref medium
ดังนั้นแอปพลิเคชันเชื่อว่าแพ็กเก็ตของพวกเขาจะออกไป เขา-ipv6
ซึ่งมี MTU เท่ากับ 1280 แต่แพ็กเก็ตของแพ็กเก็ตจะถูกห่อหุ้มใน IPSec ESP ก่อน จากนั้นจึงส่งผ่าน เขา-ipv6
อุโมงค์. ผลลัพธ์คือแพ็กเก็ตข้อมูล NFS ที่เข้ารหัสด้วย IPSec ซึ่งห่อหุ้มอยู่ในแพ็กเก็ต 6to4 ซึ่งตัวมันเองออกไปที่ eth0
อินเตอร์เฟสไปยัง 216.66.84.42 (เกตเวย์ HE)