iptables에 대한 궁금증입니다.

똘군의 이미지

iptables -t nat -A PREROUTING -p tcp -d 172.16.3.15 --dport 80 -j DNAT --to 192.168.3.100:80
내부에있는 웹사이트를 포워딩 시켜 잘되는것을 확인 했습니다.


iptables -t nat -A PREROUTING -p tcp -d 172.16.3.15 --dport 21 -j DNAT --to 192.168.3.100:21

그 다음에 ftp서버를 만들어서 포워딩을 했는데 "작업시간이 초과되어 종료되었습니다" 라고 메시지가 뜨면서
접속이 안되내요.....

도와주세요~ 8)

eezen의 이미지

ftp는 포트 하나로는 안되는 걸로 압니다.
udp 21도 열어야 하고
udp,tcp 20번도 열어야 하는 걸로...
(물론 포트 번호는 바꿀 수 있지만, data 포트를 별도로 열어주어야 한다죠)

elflord의 이미지

eezen님이 위에 잘써주셨듯이
FTP는 기본적으로 20번포트를 데이터커넥션, 21번포트를 제어커넥션으로 이용합니다.
고로 FTP를 사용하시려면 상기2개 포트를 같이 열어두시되 TCP만 열어두시면 됩니다.

TFTP를 쓰시려면 69번도 열어두셔야 하고요.


===== ===== ===== ===== =====
그럼 이만 총총...[竹]
http://elflord.egloos.com

익명 사용자의 이미지

eezen wrote:
ftp는 포트 하나로는 안되는 걸로 압니다.
udp 21도 열어야 하고
udp,tcp 20번도 열어야 하는 걸로...
(물론 포트 번호는 바꿀 수 있지만, data 포트를 별도로 열어주어야 한다죠)

udp 는 필요 없습니다. 죽었다.. 깨어나도..
익명 사용자의 이미지

elflord wrote:
eezen님이 위에 잘써주셨듯이
FTP는 기본적으로 20번포트를 데이터커넥션, 21번포트를 제어커넥션으로 이용합니다.
고로 FTP를 사용하시려면 상기2개 포트를 같이 열어두시되 TCP만 열어두시면 됩니다.

TFTP를 쓰시려면 69번도 열어두셔야 하고요.


20번 열어도 별 소용이 없습니다.
20번은 서버에서 외부(클라이언트)로 접속을 시도하기 때문에
열어둬봐야 별반 소용이 없습니다.
대신 conntrack 모듈과 RELATED 쪽으로 검색해서
공부해보세요.
elflord의 이미지

무단포옹 wrote:
elflord wrote:
eezen님이 위에 잘써주셨듯이
FTP는 기본적으로 20번포트를 데이터커넥션, 21번포트를 제어커넥션으로 이용합니다.
고로 FTP를 사용하시려면 상기2개 포트를 같이 열어두시되 TCP만 열어두시면 됩니다.

TFTP를 쓰시려면 69번도 열어두셔야 하고요.


20번 열어도 별 소용이 없습니다.
20번은 서버에서 외부(클라이언트)로 접속을 시도하기 때문에
열어둬봐야 별반 소용이 없습니다.
대신 conntrack 모듈과 RELATED 쪽으로 검색해서
공부해보세요.

20번포트는 최초에 서버에서 클라이언트로 세션을 열긴 하지만 이후 세션종료전까지 서로 데이터를 주고받는 통로가 됩니다. iptable에서 20번포트의 입력을 막아버리면 클라이언트에서 날리는 모든 데이터 패킷이 버려질텐데 어떻게 FTP통신이 이루어질 수 있을까요?
이해하기 힘듭니다만... 혹 잘못알고 있는것이라면 간단히라도 설명 부탁드립니다.


===== ===== ===== ===== =====
그럼 이만 총총...[竹]
http://elflord.egloos.com

익명 사용자의 이미지

elflord wrote:
무단포옹 wrote:
elflord wrote:
eezen님이 위에 잘써주셨듯이
FTP는 기본적으로 20번포트를 데이터커넥션, 21번포트를 제어커넥션으로 이용합니다.
고로 FTP를 사용하시려면 상기2개 포트를 같이 열어두시되 TCP만 열어두시면 됩니다.

TFTP를 쓰시려면 69번도 열어두셔야 하고요.


20번 열어도 별 소용이 없습니다.
20번은 서버에서 외부(클라이언트)로 접속을 시도하기 때문에
열어둬봐야 별반 소용이 없습니다.
대신 conntrack 모듈과 RELATED 쪽으로 검색해서
공부해보세요.

20번포트는 최초에 서버에서 클라이언트로 세션을 열긴 하지만 이후 세션종료전까지 서로 데이터를 주고받는 통로가 됩니다. iptable에서 20번포트의 입력을 막아버리면 클라이언트에서 날리는 모든 데이터 패킷이 버려질텐데 어떻게 FTP통신이 이루어질 수 있을까요?
이해하기 힘듭니다만... 혹 잘못알고 있는것이라면 간단히라도 설명 부탁드립니다.


FTP서버의 동작 방식은 서버의 20번 포트를 data 채널로 사용하는 active(능동),
그리고 서버의 일반적으로 1024보다 높은 포트번호를 data 채널로 사용하는 passive(수동) 방식 이 두가지를 사용합니다.
20번을 사용하는 active 방식의 문제는 서버 쪽의 20번 포트에서
클라이언트의 포트(협상으로 정해진)로 접속을 시도한다는 점입니다.
방화벽 뒤에 있는 클라이언트나 공유기 뒤의 사설 IP를 사용하는 클라이언트는
active 방식의 서버가 20번 포트에서 쏘아주는 패킷을 받기 어렵습니다. 신경써서 만들어진 방화벽,공유기는 괜찮겠지만요.

이와는 달리 passive 방식은 데이터 채널을 열때 협상을 한 후 서버는 정해진 포트에 소켓을 열고 기다리며 클라이언트가 그 포트로 접속을 시도합니다.
이때문에 iptables로 방화벽 안쪽에 ftp 서버를 운영하면서 passive 방식을 적용하는 경우에는 connection tracking 모듈과
related 규칙을 사용해서 21번에 대응하는 data port 를 연관시켜 주는 것이지요.

elflord의 이미지

무단포옹 wrote:

이와는 달리 passive 방식은 데이터 채널을 열때 협상을 한 후 서버는 정해진 포트에 소켓을 열고 기다리며 클라이언트가 그 포트로 접속을 시도합니다.
이때문에 iptables로 방화벽 안쪽에 ftp 서버를 운영하면서 passive 방식을 적용하는 경우에는 connection tracking 모듈과
related 규칙을 사용해서 21번에 대응하는 data port 를 연관시켜 주는 것이지요.

음... 저역시 FTP의 패시브모드 정도는 알고 있다고 생각합니다. 말씀하신대로 방화벽때문에 생겨난 방식이지요. 하지만 이건 클라이언트쪽에 방화벽이 있어서 서버에서 먼저 포트를 여는 세션 통신이 불가능할 경우 서버측의 데이터 포트를 20번이 아니라 다른포트를 클라이언트에 알려준 후 그 포트를 대기(Listen)상태로 기다리고 클라이언트에서 먼저 데이타세션의 포트를 여는 방식입니다. 결코 서버측 21번 포트만으로 제어와 데이터통신을 모두 하는 방식이 아니라 서버측 20번포트를 사용하지 않는것 뿐 다른 포트를 열고 수동적(Passive)으로 기다리므로 클라이언트가 세션을 연다는 것이 다를 뿐 결국 서버측 역시 2개포트가 필요합니다.

게다가 처음 질문하신 분은 전포트를 봉쇄한 후 필요한 포트만 개별로 여는 iptables을 구성하고 계십니다. 그런경우 서버가 랜덤하게 데이터포트를 지정하는 패시브모드는 사용하기 힘들텐데요.


===== ===== ===== ===== =====
그럼 이만 총총...[竹]
http://elflord.egloos.com

익명 사용자의 이미지

20번 막아도 상관없지만,
대부분의 ftp클라이언트들은 강제로 passive를 지정해 주지 않으면,
정상 동작을 하지 않습니다.

20/21 1024:65535가 열려 있으면
ftp는 active/passive 모두 정상 동작합니다.

그러나 다른 서비스들도 1024이상의 포트를 이용하는 경우가 있음으로,
ftp서버의 passive포트와 방화벽포트를 적절히 조정해주는 것도
방법입니다.

제가 관리하는 서버는 30000:65535를 사용하도록,
ftp서버와 방화벽이 모두 세팅되어 있습니다.

elflord의 이미지

원래 질문하신분의 답변에 간단히 답하기 위해서 20번포트에 대한 언급을 했습니다만 손님분들과의 질답과정에서 조금 옆길로 새버린 듯한 느낌이 들어서 정리를 해보고자 합니다.

FTP의 기본모드인 ACTIVE모드에서는 클라이언트의 임의의 포트에서 서버의 21번 포트로 세션을 연결한 후 제어정보를 주고 받은 후 여기서 정한 정보대로 클라이언트의 임의의 포트에서 서버의 20번포트로 세션을 연결하고 데이터전송을 합니다. 데이터전송이 끝나면 20번 포트의 데이터세션은 종료되나 21번포트의 제어세션은 완전히 양측이 통신을 마치기 전까지 종료되지 않죠. 이게 FTP의 기본입니다.

그러나 클라이언트측에 파이어월이 존재할경우 21번포트의 제어세션은 클라이언트측에서 먼저 연결하므로 문제가 없으나 20번포트의 데이터세션은 서버에서 클라이언트의 임의의 포트로 연결하는 과정에서 파이어월에 의해 부정억세스로 거부당하므로 ACTIVE모드에서는 통신이 불가능합니다. 여기서 PASSIVE모드가 해결책으로 등장하죠.

FTP의 PASSIVE모드에서는 클라이언트가 서버에게 21번포트 제어세션을 통해 PASV코맨드를 전달하고 이를 통지받은 서버는 자신의 임의의 포트를 대기(LISTEN)상태로 만든후 클라이언트에게 포트번호를 알려줍니다. 그러면 클라이언트측에서 세션을 열어서 서버가 알려준 임의의 포트로 접속해서 데이터세션을 연결하므로 클라이언트측 파이어월에 막히는 일없이 무사히 통신이 가능합니다.

마지막에 다른 손님이 알려주신 30000:65535를 통해 제어와 데이터통신을 주고받은 예는 클라이언트가 서버에서 현재 제어포트로써 어느포트를 열고 있는지를 미리 알고 있었을때 가능한 예로 (농담조로 하면 짜고치는 고스톱) 마치 HTTP에서 URI만 입력하면 자동으로 서버의 80번포트를 연결하는 체제에서 서버가 HTTP용 포트를 강제로 8080으로 바꿈에 따라 클라이언트의 웹브라우저에서도 원래는 필요없었던 포트입력 8080을 입력해야 웹통신이 가능한것과 같은 이치입니다.

어째튼 정리하면 FTP통신에는 몇번포트가 되었던 기본적으로 2개의 포트가 열려야 통신이 가능하며 이의 디폴트인 ACTIVE모드에서의 포트가 20,21번이라는 겁니다. 손님분들이 말씀하신대로 20번포트가 없어도 괜찮다는건 완전히 틀린말은 아니지만 결국은 20번 포트대신 다른 포트를 열어야 합니다.

최초질문자께서 21번포트이외에 다른포트는 전부 막으신것이 (웹포트는 제외) FTP통신에 실패한 이유중에 한가지라고 말씀드리고 싶었습니다. 다른 서버및 클라이언트측 설정없이 기본설정만으로 FTP통신을 하시려면 20번포트를 열거나 20,21이 아닌 다른 특정포트를 열기 위해서는 iptables의 변경은 반드시 필요하고 제어포트마저 변경하려면 클라이언트측에서 최초에 서버의 제어포트를 알고 그 포트로 접속해야할 필요가 있습니다.


===== ===== ===== ===== =====
그럼 이만 총총...[竹]
http://elflord.egloos.com

무한포옹의 이미지

elflord wrote:
무단포옹 wrote:

이와는 달리 passive 방식은 데이터 채널을 열때 협상을 한 후 서버는 정해진 포트에 소켓을 열고 기다리며 클라이언트가 그 포트로 접속을 시도합니다.
이때문에 iptables로 방화벽 안쪽에 ftp 서버를 운영하면서 passive 방식을 적용하는 경우에는 connection tracking 모듈과
related 규칙을 사용해서 21번에 대응하는 data port 를 연관시켜 주는 것이지요.

음... 저역시 FTP의 패시브모드 정도는 알고 있다고 생각합니다. 말씀하신대로 방화벽때문에 생겨난 방식이지요. 하지만 이건 클라이언트쪽에 방화벽이 있어서 통신이 불가능할 경우 서버측의 데이터 포트를 20번이 아니라 다른포트를 클라이언트에 알려준 후 그 포트를 대기(Listen)상태로 기다리고 클라이언트에서 먼저 데이타세션의 포트를 여는 방식입니다. 결코 서버측 21번 포트만으로 제어와 데이터통신을 모두 하는 방식이 아니라 서버측 20번포트를 사용하지 않는것 뿐 다른 포트를 열고 수동적(Passive)으로 기다리므로 클라이언트가 세션을 연다는 것이 다를 뿐 결국 서버측 역시 2개포트가 필요합니다.

게다가 처음 질문하신 분은 전포트를 봉쇄한 후 필요한 포트만 개별로 여는 iptables을 구성하고 계십니다. 그런경우 서버가 랜덤하게 데이터포트를 지정하는 패시브모드는 사용하기 힘들텐데요.


간과하시는 점은 masq 를 통해 나간 data 패킷에 대한 응답이
iptables 머신의 20번 포트로 돌아오느냐 하는 점입니다.
이 점은 생각해보셨습니까? 이 것이 보장되어야 masq머신의 20번
포트에 대해 내부 ftp서버의 20번 포트로 포워딩이 가능합니다.
단순한 방화벽에서 내부의 ftp서버를 위해 20번 포트를 여는 것과
NAT안의 ftp서버로 20번을 포워딩하는 건 별개의 문제입니다.

-------------------------------
== warning 대부분 틀린 얘기입니다 warning ===

익명 사용자의 이미지

elflord wrote:
원래 질문하신분의 답변에 간단히 답하기 위해서 20번포트에 대한 언급을 했습니다만 손님분들과의 질답과정에서 조금 옆길로 새버린 듯한 느낌이 들어서 정리를 해보고자 합니다.

FTP의 기본모드인 ACTIVE모드에서는 클라이언트의 임의의 포트에서 서버의 21번 포트로 세션을 연결한 후 제어정보를 주고 받은 후 여기서 정한 정보대로 클라이언트의 임의의 포트에서 서버의 20번포트로 세션을 연결하고 데이터전송을 합니다. 데이터전송이 끝나면 20번 포트의 데이터세션은 종료되나 21번포트의 제어세션은 완전히 양측이 통신을 마치기 전까지 종료되지 않죠. 이게 FTP의 기본입니다.

그러나 클라이언트측에 파이어월이 존재할경우 21번포트의 제어세션은 클라이언트측에서 먼저 연결하므로 문제가 없으나 20번포트의 데이터세션은 서버에서 클라이언트의 임의의 포트로 연결하는 과정에서 파이어월에 의해 부정억세스로 거부당하므로 ACTIVE모드에서는 통신이 불가능합니다. 여기서 PASSIVE모드가 해결책으로 등장하죠.

FTP의 PASSIVE모드에서는 클라이언트가 서버에게 21번포트 제어세션을 통해 PASV코맨드를 전달하고 이를 통지받은 서버는 자신의 임의의 포트를 대기(LISTEN)상태로 만든후 클라이언트에게 포트번호를 알려줍니다. 그러면 클라이언트측에서 세션을 열어서 서버가 알려준 임의의 포트로 접속해서 데이터세션을 연결하므로 클라이언트측 파이어월에 막히는 일없이 무사히 통신이 가능합니다.

여기까지는 정확하십니다.

elflord wrote:
마지막에 다른 손님이 알려주신 30000:65535를 통해 제어와 데이터통신을 주고받은 예는 클라이언트가 서버에서 현재 제어포트로써 어느포트를 열고 있는지를 미리 알고 있었을때 가능한 예로 (농담조로 하면 짜고치는 고스톱) 마치 HTTP에서 URI만 입력하면 자동으로 서버의 80번포트를 연결하는 체제에서 서버가 HTTP용 포트를 강제로 8080으로 바꿈에 따라 클라이언트의 웹브라우저에서도 원래는 필요없었던 포트입력 8080을 입력해야 웹통신이 가능한것과 같은 이치입니다.

어째튼 정리하면 FTP통신에는 몇번포트가 되었던 기본적으로 2개의 포트가 열려야 통신이 가능하며 이의 디폴트인 ACTIVE모드에서의 포트가 20,21번이라는 겁니다. 손님분들이 말씀하신대로 20번포트가 없어도 괜찮다는건 완전히 틀린말은 아니지만 결국은 20번 포트대신 다른 포트를 열어야 합니다.

최초질문자께서 21번포트이외에 다른포트는 전부 막으신것이 (웹포트는 제외) FTP통신에 실패한 이유중에 한가지라고 말씀드리고 싶었습니다. 다른 서버및 클라이언트측 설정없이 기본설정만으로 FTP통신을 하시려면 20번포트를 열거나 20,21이 아닌 다른 특정포트를 열기 위해서는 iptables의 변경은 반드시 필요하고 제어포트마저 변경하려면 클라이언트측에서 최초에 서버의 제어포트를 알고 그 포트로 접속해야할 필요가 있습니다.

약간은 설명이 이상한 것 같습니다.

완전히 Passive로만 동작하는 클라이언트는 20포트가 필요가 없습니다.
이는 간단히 telnet과 netstat등으로 확인이 가능합니다.

단지 일반적으로 자동으로 설정되어 있는 클라이언트는
우선적으로 active로 동작하는데, 이때 서버의 20번 포트가
막혀 있으면, fallback으로 passive로 넘어가지 않는
문제가 생기는 경우가 있습니다. 물론 넘어가는 클라이언트도 있습니다.

elflord wrote:
클라이언트가 서버에서 현재 제어포트로써 어느포트를 열고 있는지를 미리 알고 있었을때 가능한 예로

이건 PASV명령이나 서버의 동작방식에 약간의 오해가 있어서 입니다.

ftp 서버는 자신이 passive를 사용할 때 할당할 수 있는
포트 번호를 지정할 수 있는 기능이 대부분 있습니다.
(일반적으로는 1024~65535사이의 값으로 할당합니다.)

이는 클라이언트의 PASV명령에 응답할 때,
설정에 지정된 포트 범위내에서만 Passive 통신을 허용하게 하는 것입니다.

그리고, 이 범위내에서 포트를 열고, 이 포트 번호를
PASV명령 응답에 알려줍니다.
따라서, 클라이언트는 해당서버의 PASV응답때 넘어온 포트번호로
접속을 하기 때문에 짜고 치는 고스톱이 아닙니다.

물론, 방화벽에서 FTP가 패시브모드시 사용하는 포트들도 열려 있어야 합니다.
이 범위를 조정할 수 있다는 것이 제글의 요지입니다.

elflord wrote:
손님분들이 말씀하신대로 20번포트가 없어도 괜찮다는건 완전히 틀린말은 아니지만 결국은 20번 포트대신 다른 포트를 열어야 합니다.

만약 이글이 전통적인 Active방식의 ftp data 포트대신 다른 ftp data를 사용해야 한다라는 의미라면,
틀린 말이 되고, 다른 ftp data포트가 Passvie에 사용하는 서버측 포트를 의미한다면 맞는 말이 됩니다.

익명 사용자의 이미지

아래는 PASSIVE 모드로만 동작하는 ftp의 과정을 telnet으로 재현한 것입니다.

$ telnet ftp.bora.net 21
Trying 203.233.108.145...
Connected to ftp.bora.net.
Escape character is '^]'.
220 ProFTPD 1.2.7 Server (FTP.Bora.Net) [ftp5]
USER anonymous
331 Anonymous login ok, send your complete email address as your password.
pass foobar
230 Anonymous access granted, restrictions apply.
PASV
227 Entering Passive Mode (203,233,108,145,239,122).
LIST
150 Opening ASCII mode data connection for file list
226 Transfer complete.
QUIT
221 Goodbye.
Connection closed by foreign host.

PASV명령다음에 돌아 온 응답값을 가지고
다른 창에서 텔넷을 엽니다.
재빨리 하지 않으면 포트가 닫히므로 신속히 해야 합니다.

227 Entering Passive Mode (203,233,108,145,239,122)
이 명령에서 앞에 4개는 IP 뒤의 두개는 포트입니다.
포트는 5번째꺼 * 256 + 6번째입니다.

$ telnet 203.233.108.145 `expr  239 \* 256 + 122`
Trying 203.233.108.145...
Connected to 203.233.108.145.
Escape character is '^]'.
drwxrwxrwt   9 root     root          240 Jan  3  2005 Mirror_site
drwxr-xr-x   4 ftpadm   ftp           152 Feb 14 01:27 pub
Connection closed by foreign host.

LIST 커맨드의 응답값이 20포트가 아니라 다른 포트로 넘어 오는 것을 알 수 있습니다.

아래의 경우는 20번 포트가 막혀 있을 경우의 응답값입니다.

$ telnet ftp.bora.net 21
Trying 203.233.108.144...
Connected to ftp.bora.net.
Escape character is '^]'.
220 ProFTPD 1.2.2rc1 Server (FTP.Bora.Net) [ftp4.bora.net]
USER anonymous
p331 Anonymous login ok, send your complete email address as your password.
ass foobar
230 Anonymous access granted, restrictions apply.
LIST
425 Can't build data connection: Connection refused
QUIT
221 Goodbye.
Connection closed by foreign host.

425 에러 메세지에 PASV로 fallback하는 클라이언트들은
정상적으로 20번 포트가 막혀 있어도 동작하고,
fallback못하는 클라이언트들은 통신할 수 없다는 에러만 뿌려지고 맙니다.

익명 사용자의 이미지

무단포옹 wrote:
udp 는 필요 없습니다. 죽었다.. 깨어나도..

경우에 따라서는 필요할 수 있습니다.

TCP의 3way 핸드쉐이킹 중 앞의 두단계를 생략하고
접속을 시도하는 경우도 있습니다. (rfc 문서 참조)

이럴 경우, UDP가 블록되어 있으면 통신이 안되는 경우가 생깁니다.

elflord의 이미지

30000:65535 손님. wrote:
elflord wrote:
마지막에 다른 손님이 알려주신 30000:65535를 통해 제어와 데이터통신을 주고받은 예는 클라이언트가 서버에서 현재 제어포트로써 어느포트를 열고 있는지를 미리 알고 있었을때 가능한 예로 (농담조로 하면 짜고치는 고스톱) 마치 HTTP에서 URI만 입력하면 자동으로 서버의 80번포트를 연결하는 체제에서 서버가 HTTP용 포트를 강제로 8080으로 바꿈에 따라 클라이언트의 웹브라우저에서도 원래는 필요없었던 포트입력 8080을 입력해야 웹통신이 가능한것과 같은 이치입니다.

어째튼 정리하면 FTP통신에는 몇번포트가 되었던 기본적으로 2개의 포트가 열려야 통신이 가능하며 이의 디폴트인 ACTIVE모드에서의 포트가 20,21번이라는 겁니다. 손님분들이 말씀하신대로 20번포트가 없어도 괜찮다는건 완전히 틀린말은 아니지만 결국은 20번 포트대신 다른 포트를 열어야 합니다.

최초질문자께서 21번포트이외에 다른포트는 전부 막으신것이 (웹포트는 제외) FTP통신에 실패한 이유중에 한가지라고 말씀드리고 싶었습니다. 다른 서버및 클라이언트측 설정없이 기본설정만으로 FTP통신을 하시려면 20번포트를 열거나 20,21이 아닌 다른 특정포트를 열기 위해서는 iptables의 변경은 반드시 필요하고 제어포트마저 변경하려면 클라이언트측에서 최초에 서버의 제어포트를 알고 그 포트로 접속해야할 필요가 있습니다.

약간은 설명이 이상한 것 같습니다.

완전히 Passive로만 동작하는 클라이언트는 20포트가 필요가 없습니다.
이는 간단히 telnet과 netstat등으로 확인이 가능합니다.

손님께서 하신말이 틀렸다는게 아닙니다. 다만 제글을 약간 오해하신듯. 말씀하신대로 패시브로만 동작시 20번포트는 필요없으며 서버에서 대기로 여는 임의의 패시브포트만이 유효해지죠. 제가 짜고 치는 고스톱 운운한 것은 20번포트를 말한게 아니라 21번 제어포트를 말한것입니다. 클라이언트에서 21번포트대신 다른 포트로 접속하려면 그 포트번호를 클라이언트도 알고 있어야 한다는 뜻이었습니다. (고스톱운운은 바로 이부분) 데이터통신용 포트야 물론 말씀해주신대로 패시브의 경우 서버가 넘겨준 포트번호로 서버가 접속하니까요.

제가 최초에 20번포트가 필요하다고 한건 액티브모드가 최초 디폴트이므로 이상황을 가정하고 말한것이었습니다만... 말할수록 자꾸 꼬이는게 제가 생각을 글로 표현하는 능력이 많이 부족한듯 합니다. 사과드립니다.


===== ===== ===== ===== =====
그럼 이만 총총...[竹]
http://elflord.egloos.com

똘군의 이미지

여러분들의 도움덕에 조금이나마 FTP에 대해서 알 수 있었습니다.
헌데 위의 분들 말씀중에 21포트와 20포트를 iptable을 이용해서 포워딩을 했습니다. 그러고도 불구하고 FTP는 실행이 되질 않네요...

iptables -t nat -A PREROUTING -p tcp -d 172.16.3.15 --dport 21 -j DNAT --to 192.168.3.15:21

iptables -t nat -A PREROUTING -p tcp -d 172.16.3.15 --dport 20 -j DNAT --to 192.168.3.15:20

답변을 보고 이해를 못한건지...-_- 아니면 FTP서버가 이상한건지는 모르겟는데 포트 21번 20포트를 열어 주어도 똑같은 에러메시지가 뜨내요...

ps : 저기 제가 지금 구성한 서버를 말씀드릴테니 좀더 쉽게알려주시분 없나요 ..???;;;;

도와주세요~ 8)

긍정적인 삶 내 인생 최대의 목표

익명 사용자의 이미지

누구게? = 30000:65536 wrote:
무단포옹 wrote:
udp 는 필요 없습니다. 죽었다.. 깨어나도..

경우에 따라서는 필요할 수 있습니다.

TCP의 3way 핸드쉐이킹 중 앞의 두단계를 생략하고
접속을 시도하는 경우도 있습니다. (rfc 문서 참조)

이럴 경우, UDP가 블록되어 있으면 통신이 안되는 경우가 생깁니다.


필요한 경우가 있지만 지금같이 NAT안에서 CONNTRACK을
써야할 경우 UDP는 고려대상이 아닌 듯 합니다.
지리즈의 이미지

똘군 wrote:
iptables -t nat -A PREROUTING -p tcp -d 172.16.3.15 --dport 21 -j DNAT --to 192.168.3.15:21

iptables -t nat -A PREROUTING -p tcp -d 172.16.3.15 --dport 20 -j DNAT --to 192.168.3.15:20

21번은 동작할 것입니다.
(telnet으로 확인가능)

그러나 20번은 역입니다. 즉 192.168.3.15:20에서 출발한 패킷이
172.16.3.15 21번으로 요청한 IP의 쪽이나 날라가야합니다.

그런데, 이게 어느쪽에서 날라 왔는지 위의 방식의 설정으로는 알 수 없습니다.
따라서 별도의 NAT 모듈의 도움을 빌려와야 합니다.

직접 룰을 작성하시는 것도 좋지만, oops.org에 가서
oops firewall을 사용해 보시고,

정상동작하면,

iptables -L -v 같은 옵션으로 역으로 NAT 구성을 추정해보는 것이
더 빠르게 공부할 수 있는 방법입니다.

There is no spoon. Neo from the Matrix 1999.

지리즈의 이미지

무단포옹 wrote:
누구게? = 30000:65536 wrote:
경우에 따라서는 필요할 수 있습니다.

TCP의 3way 핸드쉐이킹 중 앞의 두단계를 생략하고
접속을 시도하는 경우도 있습니다. (rfc 문서 참조)

이럴 경우, UDP가 블록되어 있으면 통신이 안되는 경우가 생깁니다.


필요한 경우가 있지만 지금같이 NAT안에서 CONNTRACK을
써야할 경우 UDP는 고려대상이 아닌 듯 합니다.

NAT(forward) 체인단에서는 고려하지 않더라도,

input / output 체인 단에서는 고려해야 할 것입니다.
그러나 요즘은 UDP로 안하고,
그냥 tcp에 -y 옵션같은 것을 붙여서, tcp 패킷차원에서 통과시키지 않나요?

There is no spoon. Neo from the Matrix 1999.

똘군의 이미지

지리즈 wrote:

그런데, 이게 어느쪽에서 날라 왔는지 위의 방식의 설정으로는 알 수 없습니다.

설명을 하자면 리눅스가 설치된 컴퓨터가 있고 윈도우2003이 설치된 컴퓨터가 있습니다 리눅스에 masq를 구축하고 윈도우2003에서 FTP서버를 IIS로 만들었습니다. 그리고 리눅스에서 포워딩을 하여 외부에있는 다른 컴퓨터에서 FTP접속을 시도 할려고 하는 것입니다. 즉 내부에서 외부[포워딩이 그런 개념아닌가요..?]로 날라간다고 생각하시면 되지 않을까 생각하는데... 제가 말씀드린게 바르게 설명이 되었는지가 의문이군요...

FTP를 포워딩 하는데 이리 힘들줄이야... 웹서버는 비교적 쉽게 진행이 된거 같아서 FTP도 해보려 한건데... 제가 해매는 건지... 계속 이상하게 오류가 나게 되내요 ㅡㅡ;;;;

긍정적인 삶 내 인생 최대의 목표

지리즈의 이미지

ftp/irc가 그중에서 가장 어렵습니다.

이놈들이 어려운 것은 일방향이 아니라 양방향이라서 입니다.
(ftp는 패시브로만 돌리면 일방향이 됩니다.)

즉, 클라이언트에서 서버쪽으로만 접속하는 방식의 http는 설정이
매우 간단하지만,
클라이언트와 서버가 서로 접속이 필요한 방식의 ftp/irc 등은
일반적인 NAT룰로는 구현할 수가 없습니다.

"그런데, 이게 어느쪽에서 날라 왔는지 위의 방식의 설정으로는 알 수 없습니다. "

일단, 이게 어떤 의미이냐 하면,
최초의 172.16.3.15 21번으로 요청한 IP가 있습니다.
그러면 NAT는 이를 192.168.3.15:21로 포워딩해줍니다.
그럼 192.168.3.15는 20포트로 부터 패킷을 NAT에게로 보냅니다.
그런데, 이 NAT는 처음의 요청한 IP로 돌려 보내줘야 하는데.
이 순간 NAT는 요청한 IP를 모르는 것이 한계입니다.
따라서 이를 모른다는 표현을 사용했습니다.

즉 위와 같은 룰로는 ftp를 포워딩할 수가 없습니다.

이를 처리할려면 conntrack 과 같은 NAT모듈이 필요합니다.
이 모듈이 하는 일은 NAT의 21번으로 호출이 들어 올때,
이 주소를 기억하고 있다가, ftp 서버가 NAT에 20번으로 응답을 할때,
NAT의 21번으로 호출한 주소쪽의 특정한 포트로 다시 포워딩룰을 동적으로
재 설정하는 것입니다.

ps)
제 경험으로 비추어 볼때,
문제는 포워딩만 해결하는 것이 전부는 아닙니다.

NAT도 보호를 받아야 합니다.
또한 잘 못된 내부 트래픽이 외부로 새어 나가는 것도 막아야 합니다.

만약 방화벽을 공부하시는 것이 목적이시라면,
네트워크 관련 서적을 한번 읽어 보시고,
man iptables 를 읽어 보시던가,
아니면, 위키의 iptables howto를 읽어 보시기 바랍니다.

그런 목적이 아니라 단순히 구축에 의의를 두신다면,
oops firewall이 비교적 안전하고 설치도 구현도 쉬운 방법이라 생각합니다.

There is no spoon. Neo from the Matrix 1999.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.