Iptables เพื่ออนุญาตให้ FTP ที่เข้ามา


32

ฉันต้องการอนุญาตการรับส่งข้อมูล FTP ที่เข้ามา

CentOS 5.4:

นี่คือ/etc/sysconfig/iptablesไฟล์ของฉัน

# Generated by iptables-save v1.3.5 on Thu Oct  3 21:23:07 2013
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [133:14837]
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -p tcp -m tcp --sport 20 -j ACCEPT
COMMIT
# Completed on Thu Oct  3 21:23:07 2013

นอกจากนี้ตามค่าเริ่มต้นโมดูล ip_conntrack_netbios_n กำลังโหลดขึ้นมา

#service iptables restart

Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules:                          [  OK  ]
Loading additional iptables modules: ip_conntrack_netbios_n[  OK  ]

แต่ปัญหาไม่ได้อยู่กับโมดูลนั้นเพราะฉันพยายามขนถ่ายมันออกไปและก็ยังไม่มีโชค

หากฉันปิดใช้งาน iptables ฉันสามารถถ่ายโอนข้อมูลสำรองของฉันจากเครื่องอื่นไปยัง FTP ได้ หาก iptables บังคับใช้การถ่ายโอนจะล้มเหลว

คำตอบ:


27

เซิร์ฟเวอร์ ftp ของคุณต้องการช่องทางในการถ่ายโอนข้อมูล พอร์ต21ถูกใช้เพื่อสร้างการเชื่อมต่อ ดังนั้นเพื่อให้การถ่ายโอนข้อมูลเป็นไปได้คุณจะต้องเปิดใช้งานพอร์ต20ด้วย ดูการกำหนดค่าต่อไปนี้

ก่อนอื่นให้โหลดโมดูลต่อไปนี้เพื่อให้แน่ใจว่าการเชื่อมต่อ ftp แบบพาสซีฟจะไม่ถูกปฏิเสธ

modprobe ip_conntrack_ftp

อนุญาตการเชื่อมต่อ FTP ที่พอร์ต21ขาเข้าและขาออก

iptables -A INPUT  -p tcp -m tcp --dport 21 -m conntrack --ctstate ESTABLISHED,NEW -j ACCEPT -m comment --comment "Allow ftp connections on port 21"
iptables -A OUTPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 21"

อนุญาตให้พอร์ต FTP 20สำหรับการเชื่อมต่อที่ใช้งานเข้าและออก

iptables -A INPUT  -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -m comment --comment "Allow ftp connections on port 20"
iptables -A OUTPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 20"

ในที่สุดก็อนุญาตให้ FTP ทราฟฟิกขาเข้า

iptables -A INPUT  -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment "Allow passive inbound connections"
iptables -A OUTPUT -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -m comment --comment "Allow passive inbound connections"

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับปัญหา FTP และไฟร์วอลล์โปรดดูที่: http://slacksite.com/other/ftp.html#active

แก้ไข:เพิ่มเข้าNEWกับกฎอินพุต 21 พอร์ต


2
ฉันลืมที่จะพูดถึงนั่น --sport 1024: and --dport 1024:หมายความว่าเรารวมพอร์ตทั้งหมดในช่วง 1024:32535ที่เป็นพอร์ตที่ไม่มีสิทธิ์หมายความว่าผู้ใช้ที่ไม่มีสิทธิ์การเข้าถึงสามารถใช้พอร์ตเหล่านี้เพื่อทดสอบแอปพลิเคชันของตน
Valentin Bajrami

@Being Gokul ถูกต้องแล้ว เราสามารถควบคุมเซิร์ฟเวอร์ของเราเกี่ยวกับพอร์ตที่ควรรับฟังสำหรับการเชื่อมต่อของลูกค้า อย่างไรก็ตามในโหมดพาสซีฟเราต้องใช้--sportเป็นโหมดที่ไม่มีสิทธิพิเศษเพื่อแก้ไขปัญหาไฟร์วอลล์แบบไพรเวตและอนุญาตให้ไคลเอ็นต์เชื่อมต่อกับเซิร์ฟเวอร์
Valentin Bajrami

2
คุณสามารถเพิ่มได้NEW,ESTABLISHEDแต่นั่นไม่สำคัญ การเชื่อมต่ออยู่ในNEWสถานะแรกเสมอจากนั้นจะข้ามไปRELATEDซึ่งบ่งชี้ว่าการเชื่อมต่อนี้เกี่ยวข้องกับการเชื่อมต่อที่อนุญาตแล้ว เมื่อการเชื่อมต่อเปลี่ยนไปเป็นESTABLISHEDสถานะจะแจ้งให้เราทราบว่ามีการสร้างการเชื่อมต่อทั้งสองด้าน (เซิร์ฟเวอร์ / ไคลเอ็นต์) คุณอาจลอง-m state --state ...แทน
Valentin Bajrami

1
NEWไม่แน่นอนเรื่อง ดูเหมือนจะไม่ทำงานหากไม่มีมัน
Leandros

1
@ val0x00ff --sport 1024:ฉันไม่เข้าใจความจำเป็นในการ เหตุใดพอร์ตของไคลเอ็นต์จึงมีประโยชน์สำหรับกฎ หากเขาเชื่อมต่อจากพอร์ต 80 ไปยังพอร์ตแบบพาสซีฟของเซิร์ฟเวอร์เขาจะต้องได้รับอนุญาตให้เชื่อมต่อด้วย
วาน

15

ฉันเห็นกฎมากมายเช่นนี้ในบล็อกหลาย ๆ อันและสงสัยว่าทำไมไม่ใช้

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT

พร้อมกับnf_conntrack_ftpโมดูล นี่คือรัดกุมและอ่านได้ซึ่งโดยทั่วไปเป็นสิ่งที่ดีโดยเฉพาะอย่างยิ่งกับไฟร์วอลล์ ...

FWIW ดูเหมือนว่ามีการเปลี่ยนแปลงในเคอร์เนล 4.7 ดังนั้นคุณต้องตั้งค่าnet.netfilter.nf_conntrack_helper=1ผ่านsysctl(เช่นใส่ไว้ใน/etc/sysctl.d/conntrack.conf) หรือใช้

iptables -A PREROUTING -t raw -p tcp --dport 21 -j CT --helper ftp

(ดูที่นี่สำหรับรายละเอียดเพิ่มเติม)


1
ข้อมูลเกี่ยวกับเคอร์เนล 4.7 ช่วยชีวิตฉันได้พยายามหลายชั่วโมงเพื่อให้มันใช้งานได้ ง่ายecho "1" > /proc/sys/net/netfilter/nf_conntrack_helperและทุกอย่างทำงานตามที่คาดไว้
ผู้ดูแล

1
ที่ดี! 4.7 เป็นปัญหาที่ฉันไม่สามารถแก้ไขได้ในเคอร์เนล Jessie 4.9!
Arunas Bartisius

@Jakob มีปัญหากับการเชื่อมต่อที่เกี่ยวข้องที่อาจใช้ในการเข้าถึงบริการอื่น ๆ : home.regit.org/wp-content/uploads/2011/11/…และgithub.com/rtsisyk/linux-iptables-contrack-exploit
Yvan

6

ไคลเอนต์ FTP:

lsmod | grep ftp
modprobe nf_conntrack_ftp
lsmod | grep ftp
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 21 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

เซิร์ฟเวอร์ FTP:

lsmod | grep ftp
modprobe nf_conntrack_ftp
lsmod | grep ftp
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 21 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m conntrack --ctstate ESTABLISHED -j ACCEPT

เพื่อสลับระหว่างโหมดพาสซีฟและแอคทีฟที่ฝั่งไคลเอ็นต์

ftp> passive
Passive mode on.
ftp> passive
Passive mode off.

3
คุณสมควรได้รับการโหวตอย่างสูงจากเรื่องนี้ การลืมโหลดโมดูล nf_conntrack_ftp เป็นแหล่งของอาการปวดหัวเมื่อแก้ไขปัญหาการเชื่อมต่อ FTP แบบพาสซีฟและการติดตามการเชื่อมต่อ iptables การใช้โมดูลนี้ช่วยให้คุณสามารถลบประเภท "ใหม่" เพื่อให้พอร์ตเหล่านี้ได้รับการปกป้องจากการเชื่อมต่อโดยไม่ต้องมีเซสชัน FTP ก่อนหน้านี้
Ryan Griggs

5

ฉันเชื่อว่าการเพิ่มใหม่คงที่

ตอนนี้ไฟล์ iptables ของฉันมีลักษณะเช่นนี้ ..

# Generated by iptables-save v1.3.5 on Thu Oct  3 22:25:54 2013
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [824:72492]

-A INPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --sport 1024:65535 --dport 20:65535 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 1024:65535 --dport 20:65535 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Thu Oct  3 22:25:54 2013

พิมพ์เป็นคำตอบเนื่องจากอักขระจำนวนมากไม่ได้รับอนุญาตในความคิดเห็น .. ขอบคุณมากสำหรับความช่วยเหลือของคุณ


2
มันทำงานได้ดีและดีใจที่ฉันชี้ให้คุณไปในทิศทางที่ถูกต้อง โปรดทำเครื่องหมายคำตอบของคุณเองว่าได้รับการแก้ไขแล้วเพื่อช่วยให้ผู้อื่นที่ต้องการคำตอบที่ถูกต้อง
Valentin Bajrami

ฉันเชื่อว่ามีคำพิมพ์ผิดในคำตอบที่ยอมรับได้ ฉันเชื่อว่า--dport 20:65535จะเปิดพอร์ตทั้งหมดตั้งแต่ 20 - 65535 เปิดจากพอร์ตต้นทางใด ๆ ระหว่าง 1024: 65535 ซึ่งทำให้บริการจำนวนมากเปิดเผยซึ่งอาจไม่ควรเว้นแต่จะได้รับอนุญาตอย่างชัดเจน ฉันเชื่อว่าสิ่งที่ตั้งใจคือ--dport 1024:65535
itnAAnti

0

หากคุณต้องการทั้งการเชื่อมต่อที่ใช้งานและแฝงตัวและยอมรับESTABLISHEDการเชื่อมต่ออยู่แล้วเช่น:

iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

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

ก่อนอื่นให้ยอมรับการเชื่อมต่อใหม่ในport 21:

iptables -A INPUT -p tcp --dport 21 -j ACCEPT

จากนั้นเพิ่มตัวช่วย CT สำหรับพอร์ตแฝง1024::

iptables -A PREROUTING -t raw -p tcp --dport 21 -j CT --helper ftp
iptables -A INPUT -p tcp -m conntrack --ctstate RELATED -m helper --helper ftp --dport 1024: -j ACCEPT

ดูสิ่งนี้ด้วย:

หมายเหตุ:คุณต้องตั้งค่า1024:เป็นในเซิร์ฟเวอร์ FTP ของคุณ: ค้นหาพอร์ตแฝงเริ่มต้นในการกำหนดค่า FTP ของคุณ มิฉะนั้นคุณจะเปิดพอร์ตมากเกินไปซึ่งอาจไม่ใช่ FTP ที่เกี่ยวข้อง

หมายเหตุสำคัญ:ฉันไม่ได้เพิ่มกฎเป็นค่าเริ่มต้นของฉันไปกับOUTPUT iptables -P OUTPUT ACCEPTหมายความว่าฉันเชื่อในสิ่งที่เกิดขึ้นจากกล่องของฉัน นั่นอาจไม่ใช่ตัวเลือกที่ดีโดยเฉพาะในการตั้งค่า NAT

หมายเหตุสำคัญ: FTPS จะไม่ทำงานกับการตั้งค่าดังกล่าวเนื่องจากพอร์ตแฝงถูกซ่อนไว้ (เข้ารหัส) ดังนั้นจึงไม่มีวิธีiptablesเดาพอร์ตที่ดี ดูการเปลี่ยน IPTables เพื่ออนุญาต FTP ผ่าน TLS โดยใช้พอร์ตแบบพาสซีฟและhttps://serverfault.com/questions/811431/are-my-iptables-for-ftps-with-tls-ok

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.