web-dev-qa-db-ja.com

iptables Debian Linuxで送信SMTPを許可する方法

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
13
916 Networks

トラフィックを許可するルールはありますが、戻りトラフィックを許可するルールはありません。

代わりに、これらの2つのルールを-A INPUTにするつもりだったと思います:

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

ただし、リターントラフィックを許可する方法として送信元ポートを使用することは、システムを保護するための悪い方法です。誰かがしなければならないことは、これらの送信元ポートの1つを使用することだけであり、ファイアウォールルールセットは役に立たなくなります。

より良いアイデアは、すべての-A INPUT ... --sportルールを削除し、代わりにこの1つのルールのみを使用することです。

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

このルールが機能する方法は、システムがアウトバウンド接続を確立すると、カーネルがその接続をトラッキングテーブルに記録することです。次に、リモートシステムからのパケットが戻ってくると、それらのパケットがトラッキングテーブル内の接続に関連付けられているかどうかを調べます。
ESTABLISHEDビットは、セッションに直接関連するトラフィックを許可するビットです。これは、TCPパケットがストリームに戻ってくることになります。
RELATEDビットは、接続に関連しているが、接続自体の一部ではないトラフィックを通過させます。これは、「ICMPがフラグメント化できない」などのICMPパケットのようなものです。これらのパケットはTCPストリームの一部ではありませんが、ストリームを存続させるために非常に重要です(これもルールセットではカバーされていないことであり、これがないと奇妙な接続が表示されません)問題と損失)。

このルールはUDPトラフィックでも機能しますが、UDPはステートレスであるため、まったく同じではありません。代わりに、カーネルは発信されるUDPパケットを追跡する必要があり、UDPパケットが同じホスト/ポートの組み合わせで戻ってきたときに、それらが関連していると短時間で判断します。

18
Patrick