การรับส่งข้อมูลบนอินเทอร์เฟซต่าง ๆ ขึ้นอยู่กับพอร์ตปลายทาง


23

คำถามของฉันเป็นพื้นเดียวกับที่อนุญาตเฉพาะการจราจรขาออกบางอย่างในการเชื่อมต่อบางอย่าง

ฉันมีสองอินเตอร์เฟสeth1(10.0.0.2) และwlan0(192.168.0.2) eth1เส้นทางเริ่มต้นของผมคือ สมมติว่าผมต้องการให้ทุก https wlan0การจราจรที่จะไปผ่าน ตอนนี้ถ้าฉันใช้โซลูชันที่แนะนำในคำถามอื่นการรับส่งข้อมูลของ https จะผ่านwlan0แต่จะยังคงมีแหล่งที่อยู่ของeth1(10.0.0.2) เนื่องจากที่อยู่นี้ไม่สามารถกำหนดเส้นทางได้สำหรับwlan0เกตเวย์คำตอบจะไม่กลับมา วิธีที่ง่ายคือการตั้งค่า bind-addr อย่างถูกต้องในแอปพลิเคชัน แต่ในกรณีนี้มันไม่สามารถใช้ได้

ฉันคิดว่าฉันต้องเขียน src-addr ใหม่:

# first mark it so that iproute can route it through wlan0
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2

ตอนนี้ tcpdump เห็นว่าแพ็กเก็ตที่ส่งออกมานั้นใช้ได้ดีและแพ็คเก็ตที่มีอินพุทมาถึง 192.168.0.2 แต่พวกเขาอาจไม่เคยลงเอยในแอปพลิเคชันเพราะสิ่งที่ฉันได้เห็นคือแอปพลิเคชันนั้นกำลังส่งแพ็กเก็ต SYN แม้ว่า ACK ได้รับแล้ว

ดังนั้นฉันคิดว่าฉันอาจต้องเขียนที่อยู่ขาเข้าใหม่ด้วย:

iptables -A PREROUTING -t nat -i wlan0 -p tcp --sport 443 -j DNAT --to 10.0.0.2

แต่นั่นก็ไม่ได้ผลเช่นกัน ดังนั้นฉันติดอยู่ที่นี่ ข้อเสนอแนะใด ๆ

คำตอบ:


24

คุณสนิทแล้ว

เหตุผลที่แท้จริงที่แอปพลิเคชันไม่เห็นการรับส่งคืนเป็นเพราะเคอร์เนลมีการป้องกันการปลอมแปลง IP ในตัว นั่นคือปริมาณการรับส่งข้อมูลกลับไม่ตรงกับตารางเส้นทางดังนั้นจึงลดลง คุณสามารถแก้ไขได้โดยปิดการป้องกันการปลอมแปลงดังนี้:

sudo sysctl net.ipv4.conf.wlan0.rp_filter=0

แต่ฉันจะไม่แนะนำที่นี่ วิธีที่เหมาะสมกว่าคือการสร้างอินสแตนซ์การกำหนดเส้นทางสำรอง

  1. เครื่องหมายเป็นสิ่งที่จำเป็น เก็บมันไว้.
  2. แหล่ง NAT ก็จำเป็นเช่นกัน
  3. DNAT สุดท้ายนั้นไม่จำเป็นดังนั้นคุณสามารถลบได้

ตรวจสอบให้แน่ใจว่าคุณได้iprouteติดตั้งแพ็คเกจแล้ว หากคุณมีipคำสั่งแล้วคุณจะตั้งค่า (ซึ่งดูเหมือนว่าคุณ แต่ถ้าไม่ได้รับก่อน)

แก้ไข/etc/iproute2/rt_tablesและเพิ่มตารางใหม่โดยต่อท้ายบรรทัดต่อไปนี้:

200 wlan-route

จากนั้นคุณต้องกำหนดค่าตารางเส้นทางใหม่ของคุณที่wlan-routeมีเกตเวย์เริ่มต้นและสร้างกฎเพื่อส่งทราฟฟิกไปยังตารางนั้นตามเงื่อนไข ฉันจะสมมติว่าเกตเวย์เริ่มต้นของคุณคือ 192.168.0.1 โดยปกติสิ่งนี้จะต้องตรงกับเครือข่ายที่แท้จริงของคุณไม่ใช่เพียงแค่สมมติฐานของฉัน

ip route add default via 192.168.0.1 dev wlan0 table wlan-route
ip rule add fwmark 0x1 table wlan-route

สคริปต์คำอธิบายประกอบสุดท้ายของคุณจะเป็นดังนี้:

# Populate secondary routing table
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
# Anything with this fwmark will use the secondary routing table
ip rule add fwmark 0x1 table wlan-route
# Mark these packets so that iproute can route it through wlan-route
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2

ขอขอบคุณที่สละเวลาพิจารณาเรื่องนี้ อย่างไรก็ตามนี่เป็นสิ่งที่ฉันใช้อยู่แล้ว (ตามที่อธิบายไว้ในคำถามอื่น ๆ ) ดังนั้นฉันจึงมีการตั้งค่าเส้นทางเพิ่มเติม แต่ก็ยังคงเหมือนเดิม SYN-ACKs กลับไปที่ 192.168.0.2 แต่เห็นได้ชัดว่าไม่เคยเข้าถึงแอปพลิเคชัน
rumpel

กลับไปอ่านคำตอบของฉันอีกครั้ง ฉันพูดเรื่องนั้น
บาฮามาต

ส่วนที่เกี่ยวกับการป้องกันการปลอมแปลง? ไม่มีการเปลี่ยนแปลงแม้หลังจากพยายาม ขออภัยอ่านมันสองสามครั้ง แต่ยังไม่ได้สิ่งที่ฉันพลาด
rumpel

คุณต้องเพิ่มsrcตัวเลือกในip routeคำสั่งเพื่อระบุที่อยู่แหล่งที่ถูกต้อง
David Schwartz

@DavidSchwartz: POSTROUTING SNATจะดูแลมัน
บาฮามาต

8

คำตอบของบาฮามาตนั้นถูกต้อง อย่างไรก็ตามโปรดทราบว่าวิธีเดียวที่ฉันจะทำให้งานนี้คือการปิดการใช้งาน rp_filter สำหรับทุก ๆ อินเทอร์เฟซในระบบไม่เพียง แต่สอง (eth1 และ wlan0 ในกรณีนี้) ที่เกี่ยวข้องกับ NATing

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
echo 1 > /proc/sys/net/ipv4/route/flush

(ดูหมายเหตุสำคัญที่ท้ายหน้านี้: การกำหนดเส้นทางขั้นสูง Howto - ลิงก์ที่โพสต์ไม่มีอยู่อีกต่อไป แต่ฉันพบผ่านเครื่อง wayback)


ขอบคุณสำหรับคำตอบนี้ฉันก็สามารถได้รับการแก้ปัญหา bahamats พิจารณาคำตอบของคุณเท่านั้น
Dynalon

สำหรับฉันบนกล่อง ubuntu 12.04 LTS ที่ค่อนข้างมาตรฐานนอกจากนี้เพื่อปิดการใช้งาน rp_filter และการล้างแคชเส้นทางฉันยังต้องตัดชื่ออินเตอร์เฟสออกจากอาร์กิวเมนต์ iptables ไม่มีเวลาพอที่จะตรวจสอบสาเหตุ
Costin Gușă

0

หนึ่งข้อเสนอแนะ: คุณควรใช้--sportแทน--dportในห่วงโซ่เอาท์พุทเสมอ

NATs เปลี่ยนdportและนั่นจะทำให้กฎของคุณไม่ราบรื่น


2
มีบางอย่างที่ฉันไม่ได้รับใช่ไหม dport ที่อยู่ในพอร์ตปลายทางไม่สามารถเปลี่ยนแปลงได้ เป็นพอร์ตของบริการที่เซสชันพยายามเข้าถึงเช่น http, ssh, smtp ไม่ว่าคุณจะเล่นกีฬาและงงงงหรือว่าฉันขาดอะไรที่ชัดเจน : P
คนที่

0

ฉันคิดว่าจำเป็นต้องใช้ด้านล่าง:

ip ru add from 192.168.0.2 table 3 prio 300
ip ro add table 3 default via 192.168.0.1 dev wlan0
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.