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正在执行,则传输失败。

Answers:


27

您的ftp服务器需要一个通道来传输数据。端口21用于建立连接。因此,要使数据传输成为可能,您还需要启用端口20。请参阅以下配置

首先加载以下模块,以确保不拒绝被动ftp连接

modprobe ip_conntrack_ftp

允许端口21传入和传出的FTP连接

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

@是Gokul,没错。我们可以控制服务器在应侦听客户端连接的端口上。但是,在被动模式下,我们必须使用--sport非特权模式来解决防火墙问题,并使客户端连接到服务器。
Valentin Bajrami

2
好了,您可以添加,NEW,ESTABLISHED但这没关系。连接首先始终处于NEW状态,然后跳转到RELATED该状态,表明该连接与已经允许的连接有关。当连接更改为ESTABLISHED状态时,它通知我们双方(服务器/客户端)均已建立连接。您可以试试看-m state --state ...
Valentin Bajrami

1
NEW确实重要。没有它似乎无法工作。
Leandros

1
@ val0x00ff我不了解的需求--sport 1024:。为什么客户端的端口对规则有用?如果他从端口80连接到服务器的被动端口,则也必须允许他连接。
伊万

15

我已经在多个Blog等中看到了如此广泛的规则,并且想知道为什么不简单地使用

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
您绝对值得为此提供一些支持。在对被动FTP连接和iptables连接跟踪进行故障排除时,忘记加载nf_conntrack_ftp模块是令人头疼的问题。使用此模块,您可以删除“ NEW”类型,以便在不建立先前的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 2013年

我相信接受的答案中有错字。我相信这--dport 20:65535将使1024:65535之间的任何源端口从20-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猜测正确的端口。请参阅更改IPTable以允许使用被动端口通过TLS进行FTPhttps://serverfault.com/questions/811431/are-my-iptables-for-ftps-with-tls-ok

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.