iptables에서 발신 SMTP를 허용하는 방법 Debian Linux


13

OUTPUT 체인 ( iptables -P OUTPUT ACCEPT) 메일 의 모든 트래픽을 허용하도록 선택하면 정상적으로 전송됩니다. 이러한 규칙으로 서버를 잠그면 발신 메일이 작동하지 않습니다. 그래도 다른 모든 기능이 작동합니다.

누구든지 여기에서 나가는 메일이 발송되지 않는 것을 보았습니까? 나는 혼란에 빠졌고, 이러한 규칙을 반복해서 살펴보고 많은 다른 버전을 시도했습니다.

 iptables -F
 iptables -P INPUT DROP
 iptables -P FORWARD DROP
 iptables -P OUTPUT DROP


 iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
 iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

 iptables -A INPUT  -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
 iptables -A OUTPUT -p tcp --sport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

 iptables -A INPUT  -p tcp --sport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
 iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

 iptables -A INPUT -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
 iptables -A OUTPUT -p tcp --sport 443 -m state --state NEW,ESTABLISHED -j ACCEPT

 iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
 iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT

 iptables -A OUTPUT -p tcp --sport 25 -j ACCEPT
 iptables -A OUTPUT -p tcp --sport 587 -j ACCEPT

 iptables -A OUTPUT  -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
 iptables -A INPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

 iptables -A OUTPUT  -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
 iptables -A INPUT  -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

 iptables -A INPUT -i lo -j ACCEPT
 iptables -A OUTPUT -o lo -j ACCEPT

 iptables -A OUTPUT -p udp  --dport 53 -j ACCEPT
 iptables -A INPUT -p udp  --sport 53 -j ACCEPT

 iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
 iptables -A INPUT -p tcp --dport 443 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT


 iptables -N LOGGING
 iptables -A INPUT -j LOGGING
 iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7
 iptables -A LOGGING -j DROP

답변:


18

트래픽을 내보내는 규칙이 있지만 반환 트래픽을 허용하는 규칙은 없습니다.

나는이 두 가지 규칙이 -A INPUT대신 해야한다고 생각 합니다.

iptables -A OUTPUT -p tcp --sport 25 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 587 -j ACCEPT

그러나 리턴 트래픽을 허용하는 방법으로 소스 포트를 사용하는 것은 시스템을 보호하는 나쁜 방법입니다. 누군가가해야 할 일은이 소스 포트 중 하나를 사용하는 것이므로 방화벽 규칙 세트는 쓸모 없게됩니다.

훨씬 더 좋은 아이디어는 모든 -A INPUT ... --sport규칙 을 제거하고 대신이 단일 규칙 만 사용하는 것입니다.

iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

이 규칙이 작동하는 방식은 시스템이 아웃 바운드 연결을 할 때 커널이 연결을 추적 테이블에 기록하는 것입니다. 그런 다음 원격 시스템의 패킷이 다시 들어 오면 해당 패킷이 추적 테이블의 연결과 연결되어 있는지 확인합니다. 비트는 세션과 직접 관련된 트래픽을 허용
하는 ESTABLISHED비트입니다. 이것은 스트림으로 다시 들어오는 TCP 패킷입니다.
그만큼RELATED비트는 연결과 관련이 있지만 연결 자체의 일부가 아닌 트래픽을 통과시킵니다. "ICMP는 조각화 할 수 없습니다"와 같은 ICMP 패킷과 같은 것일 수 있습니다. 이러한 패킷은 TCP 스트림의 일부는 아니지만 스트림을 유지하는 데 매우 중요합니다 (규칙 집합에서 다루지 않는 또 다른 문제이며 연결 문제 및 손실이 발생하지 않는 경우도 있음).

이 규칙은 UDP 트래픽에도 적용되지만 UDP는 상태 비 저장이므로 동일하지 않습니다. 대신 커널은 나가는 UDP 패킷을 추적해야하며 UDP 패킷이 동일한 호스트 / 포트 조합으로 돌아오고 짧은 시간 내에 관련되어 있다고 가정합니다.


답장을 보내 주셔서 감사합니다. 나가는 SMTP 연결 만 만들기 때문에 트래픽을 다시 수신하고 싶지 않다고 생각합니까? 입력 체인에 규칙을 추가하면 SMTP를 다시 허용 할 것이라고 생각했습니다. 이것은 메일을 보내기 위해 외부 SMTP 호스트에 연결하기 만하면되는 웹 서버입니다 .... thx!
916 Networks

리턴 트래픽을 다시 수신하지 않으면 시스템은 TCP 및 SMTP 프로토콜이 사용하는 모든 "예, 데이터가 있습니다"메시지를 어떻게 수신합니까?
Patrick

말이 되네요 방금 규칙을 추가하고 완전히 작동했습니다. 답변을 주셔서 감사합니다! 투표를하려고했지만 평판이 충분하지 않다고 말합니다 (Unix StackExchange를 처음 사용함)
916 Networks

그 규칙이 어떻게 작동하는지에 대한 설명을 추가했습니다.
Patrick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.