들어오는 FTP를 허용하는 iptables


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

포트 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"

20활성 연결 수신 및 발신을위한 FTP 포트 허용

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

@ @ 고쿨, 맞습니다. 클라이언트 연결을 수신 대기해야하는 포트에서 서버를 제어 할 수 있습니다. 그러나 수동 모드에서는 --sport방화벽 문제를 방지하고 클라이언트가 서버에 연결할 수 있도록 권한이없는 모드 여야합니다.
Valentin Bajrami

2
글쎄, 당신은 추가 할 수 NEW,ESTABLISHED있지만 그건 중요하지 않습니다. 연결은 항상 항상 NEW상태에 RELATED도달 한 다음 이 연결이 이미 허용 된 연결과 관련되어 있음을 나타냅니다. 연결 ESTABLISHED상태가 변경되면 양쪽 (서버 / 클라이언트)에서 연결이 설정되었음을 알려줍니다. -m state --state ...대신 시도해보십시오 .
Valentin Bajrami

1
NEW참으로 중요 않습니다. 그것 없이는 작동하지 않는 것 같습니다.
Leandros

1
@ val0x00ff의 필요성을 이해하지 못합니다 --sport 1024:. 클라이언트 포트가 규칙에 유용한 이유는 무엇입니까? 포트 80에서 서버의 수동 포트에 연결하는 경우에도 연결이 허용되어야합니다.
Yvan

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하고 모든 것이 예상대로 작동합니다.
Keeper

1
큰! 4.7는 Jessie kernel 4.9에서 해결할 수없는 문제였습니다!
Arunas Bartisius


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 모듈을로드하는 것을 잊어 버렸습니다. 이 모듈을 사용하면 "신규"유형을 제거하여 이전 FTP 세션을 설정하지 않고도 이러한 포트를 임의의 연결로부터 보호 할 수 있습니다.
Ryan Griggs

5

NEW를 추가하면 문제가 해결되었습니다.

이제 내 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:6553565535, 잎 많은 서비스가 명시 적으로 허용하지 않는 한 아마되어서는 안된다는 노출되는 : 모든 소스 포트에서 열린 65535 1024 - 20에서 모든 포트를 떠나고있다. 의도했던 것은--dport 1024:65535
itnAAnti

0

활성 및 수동 연결이 모두 필요하고 다음과 ESTABLISHED같은 연결을 이미 수락 한 경우 :

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

그런 다음 포트 21 만 열고 수동 포트에 대한 특별한 규칙을 추가하면됩니다. ESTABLISHED위 의 규칙 에서 이미 승인 한 포트 20에는 규칙이 필요하지 않습니다 .

먼저 다음에서 새 연결을 수락하십시오 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올바른 포트를 추측 할 방법이 없습니다 . 수동 포트https://serverfault.com/questions/811431/are-my-iptables-for-ftps-with-tls-ok를 사용하여 TLS를 통한 FTP를 허용하도록 IPTable 변경을 참조 하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.