[완료] iptables 기본 정책이 DROP 일때 ftp passive 문제

maindb의 이미지

OS 는 CentOS 5.2 입니다.

iptables 기본 정책이 DROP 일대
내부적으로 랜덤포트를 open 하려 할때 생기는 문제 인듯 합니다.

/etc/sysconfig/iptables
파일의 내용은 아래와 같습니다.

*filter
:INPUT DROP [130:9717]
:FORWARD ACCEPT [0:0]
:OUTPUT DROP [105:11921]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -s 127.0.0.1 -p icmp -j ACCEPT
-A INPUT -s 111.222.333.0/24 -p icmp -j ACCEPT
-A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp --dport 20 -j ACCEPT
-A INPUT -p tcp --dport 21 -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -s 127.0.0.1 -p tcp --dport 3306 -j ACCEPT
-A INPUT -s localhost -p tcp --dport 3306 -j ACCEPT
-A INPUT -s 111.222.555.222 -p tcp --dport 3306 -j ACCEPT
-A INPUT -p udp --sport 53 -j ACCEPT
-A INPUT -p tcp --sport 53 -j ACCEPT
-A INPUT -p tcp --sport 25 -j ACCEPT
-A INPUT -p tcp --dport 25 -j ACCEPT

-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -p tcp --sport 22 -j ACCEPT
-A OUTPUT -p tcp --sport 20 -j ACCEPT
-A OUTPUT -p tcp --sport 21 -j ACCEPT
-A OUTPUT -p tcp --sport 80 -j ACCEPT
-A OUTPUT -p udp --dport 53 -j ACCEPT
-A OUTPUT -p tcp --dport 53 -j ACCEPT
-A OUTPUT -p tcp --sport 25 -j ACCEPT
-A OUTPUT -p tcp --dport 25 -j ACCEPT
COMMIT

보시는 바와 같이 기본정책이 일단 무조건 전부 DROP 인 상태에서
오픈을 해주는 것입니다.
위와같이 했을때 ftp 같은 경우

위와 같이 input,ouput 에 대하여 20,21 포트를 open 해주면 되는데
이건 접속할 수 있기만 할뿐(로그인 가능) 접속하고 나서
list 같은것을 받아 올수가 없죠.
뭐 그냥 접속이 안된다고 단순히 표현해도 되겠죠..
외냐하면 ftp 서버가 예를 들어 60013 같은 포트를 다시 오픈해야
되는데 그렇지 못하기 때문에 그렇겠죠.
(Passive 모드 접속을 하지 않으면 당연히 문제 없이 잘 되겠죠.)

이거 어떻게 해결할 방법이 없을까요?
그렇다고 막연히 60000~60050 정도 열어서 해결하긴 좀 그런것 같고 분명히 다른
방법이 있을것 같습니다. 상태추적테이블을 참고한다던지...
iptables 정책 설정만으로 어떻게 해결 할 방법이 없을까요?

조언 부탁드립니다.

maindb의 이미지


일단 귄찮아서...

ftp 서버 프로그램에 5000 에서 5500 까지 사용한다고 ftp 서버 프로그램의
conf 파일에 그렇게 설정하고

-A INPUT -p tcp --dport 5000:5500 -j ACCEPT

이렇게 넣어서 하고 있습니다.

어떻게 다른 방법이 없을까요?

istyles의 이미지

특정포트를 정해서 지정해주면 상관없지않을까요?

가령 10000:20000까지 쓴다는 가정하에서

10000~10030 까지는 패시모드를 위해서 열어주고 나머지는 일부로 지정해서 사용하면 되실듯합니다..
예전에 테스트해본결과 비슷한상황에서 그렇게 서비스한적이 있습니다..
가령 vsftp 같은경우 저는 이렇게 씁니다

일단 input,output 설정해두고.... 패시모드는 5000:50050포트까지 할당해주고 나머지는 꽁꽁 틀어막습니다....

필요에의한 포트만..열어주고..에러나는부분들은 포팅하여 처리합니다..
말씀하신 예로 고생한바 있기에..

istyles의 이미지

위에 언급하신대로 현재 서비스를 그렇게 하고있습니다..

패시모드는 50000:55000 포트까지 열어주고 vsftp conf 파일에 패시모드 이용포트를 저렇게 설정하여 서비스하고있습니다.^^:

ftp 는 정상로그인 되도 !### LIST가 안보이는경우가 있어서 ^^;해맨적이잇더라는..

istyles의 이미지

vsftp 예제입니다 conf파일..

# PASSIVE 모드 사용시 사용하는 포트 범위지정
pasv_min_port=50000
pasv_max_port=50100

그리고 iptables에서 50000:50100 포트까지만 허용해줬습니다 범위를..

monovision의 이미지

iptables 설정은 크게 문제가 없습니다.
xx_conntrack_ftp 모듈을 올려주시면 됩니다.

Cent OS 5.2 이시라면면 아마... nf_conntrack_ftp.ko 일겁니다.

해당 모듈을 올리시면 위의 설정으로도 무리 없이 사용이 가능합니다.
아 참고로 패킷은 state 의 RELATED 에 걸리게 됩니다.

man iptables

Quote:
RELATED meaning that the packet is starting a new connection, but is associated with an existing connection, such as an FTP data transfer, or an ICMP error.
academic의 이미지

CentOS 5.2에서는

/etc/sysconfig/iptables-config 파일의 IPTABLES_MODULES 항목에 ip_conntract_ftp 가 없다면 추가해주시면 됩니다.

위의 설정에선 20번 포트를 열어주는 부분은 빼도 되겠네요.

--
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

----
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

maindb의 이미지

감사합니다 :)

dvvbstation의 이미지

액티브에서는 20번포트를 데이터포트로 패시브에서는 특정포트를 범위 지정해서 쓰는 것으로 알고 있는데
위 같은 경우 패시브로 구성을 했으니 20번포트 오픈 설정이 필요없단 말씀이시군요.

조금 벗어날 수 있는 질문인지는 모르겠으나 궁금한게 있습니다.

공유기 물리면서 proftpd쓸 때 액티브로는 접속이 되긴 하더라도 리스트가 안됬던 적이 있던것 같습니다.
그래서 패시브로 썼던 것 같은데...

리스트가 출력이 안되는 것은 네트워크 단과 넷필터 포트설정만 완벽하다면 해결이 가능한 것인가요?
file zilla같은 프로그램은 리스트 보이고 다운로드 가능해도
터미널에서는 ftp 로 접속시 응답 대기중이라는 메시지와 함께 접속이 안되던 걸로 기억합니다.

monovision의 이미지

패시브 모드의 원리에 대해서 다시 한 번 살펴보시기 바랍니다.

패시브 모드에서 가정하고 있는 기본적인 전제 중 하나는....

" 대부분의 방화벽은 서버에서 외부로 나가는 패킷에 대해서는 정책이 없다 " 입니다.

만약 outbound 정책이 기본적으로 DROP 이라면 패시브 모드를 사용해도 리스팅 및 파일 전송이 안될 수가 있습니다.

리스트가 출력이 안되는 것은 네트워크 단과 넷필터 포트설정만 완벽하다면 해결이 가능한 것인가요?

네 맞습니다. 그렇게만 하면 완벽한데 이를 정하는게 쉽지 않습니다.
그래서... conntrack_xxx 계열의 모듈이 있으며, ftp 에서는 conntrack_ftp 모듈이 있습니다.

file zilla같은 프로그램은 리스트 보이고 다운로드 가능해도 
터미널에서는 ftp 로 접속시 응답 대기중이라는 메시지와 함께 접속이 안되던 걸로 기억합니다.

여기서 말씀하시는 터미널이라는게 정확하게 어떤것을 말씀하시는지는 모르겠지만.... 해당 터미널이 액티브 모드로 사용되었기 때문에 접속이 안되었다고 추측이 됩니다.
김정균의 이미지

iptables -A INPUT -p tcp --sport 1024:65535 --dport 1024:65535 \
         -m state --state ESTABLISHED,RELATED -j ACCEPT

요런식으로 하는 방법도 있습니다. RELATED 요게 중요한 거죠 :-) 매뉴얼 찾아 보시기를.. 저도 정확히는 모르겠지만 contract_ftp module 에서 지원하는 것이 아닐까 살짝 생각해 보았습니다. 이 룰을 넣으면 자동으로 contract_ftp module 이 올라오거든요. 코드를 까보지는 않아서.. 확실하지는 않습니다.

monovision의 이미지

conntrack_tftp 모듈에서도 RELATED 를 사용하면 공인 + 사설 망에서 tftp 사용이 가능해집니다. ^^
처음엔 tftp 가 왜 안되나 했었는데 이넘은 udp 를 사용하면서도 ftp 처럼 임의의 포트로 연결이 다시 하면서 사용을 하더군요 ㄷㄷ;;;;

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.