iptables에서 발신 SMTP를 허용하는 방법 Debian Linux tcp –dport 80

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



답변

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

나는이 두 가지 규칙이 -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 패킷이 동일한 호스트 / 포트 조합으로 돌아오고 짧은 시간 내에 관련되어 있다고 가정합니다.


답변