Ubuntuでiptablesを使用して出力ルールをどのように設定しますか?
そこにある出力ルールとiptablesに関する情報を見つけようとしていましたが、情報が不完全または不正確でした。少し掘り下げてsshセッションを数回切断した後、私はそれを理解し、ServerFaultで共有すると思いました。
出力ルールはセキュリティポリシーの鍵であり、多くのセキュリティ基準(PCI DSSなど)を満たすために必要です。
注:ここでのコマンドは、Debianベースのディストリビューション(Ubuntuサーバーなど)を想定しています。 iptablesコマンドはディストリビューション間で同じである必要がありますが、これらの手順が異なるため、iptablesを保存およびロードする方法については、独自のディストリビューションのリファレンスガイドを確認してください。誰かがこれをwikifyして、RHまたは他のdistの違いを追加したい場合は、それを選択してください。
以下の例では、実際にパッケージの更新を取得するだけでよいサーバーに対して、かなり一般的なルールを設定します。これらは大文字と小文字を区別するコマンドであり、入力する順序は評価される順序であることに注意してください(つまり、SSH経由で接続している場合は、最初に-A OUTPUT -j REJECTを実行しないでください)。
サンプルルールセット
Sudo iptables -A OUTPUT -o lo -p all -j ACCEPT
Sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Sudo iptables -A OUTPUT -p tcp --dport 80 -d security.ubuntu.com -j ACCEPT
Sudo iptables -A OUTPUT -p tcp --dport 80 -d us.archive.ubuntu.com -j ACCEPT
Sudo iptables -A OUTPUT -j REJECT
重要:これらのルールに/etc/hosts
エントリを作成しない限り、security.ubuntu.comまたはus.archive.ubuntu.comルールを追加しないでください(ただし、DNSクエリを開く方法については「その他の出力ルール」を参照してください)。 iptablesはそれらのアドレスのIPを評価することに注意してくださいATルールが適用される時間IS適用されます。したがって、ubuntuがこれらのアドレスを変更した場合は、それらを再作成する必要があります。ルールを設定するか、コンピューターを再起動します(ルールは起動時に適用されます)。
これらの各ルールを見てみましょう。
ローカルインターフェイスルール
Sudo iptables -A OUTPUT -o lo -p all -j ACCEPT
これは、ローカル(127.0.0.1)インターフェイスでアウトバウンドになりたいすべてのトラフィックを受け入れる必要があることを示すエントリを追加しています。一部のアプリケーションはこのインターフェースを使用して情報を交換しますが、それらを壊したくありません。
シークレットソースルール(確立/関連セッション)
Sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
これはしばしば忘れられるルールであり、セッションの切断と混乱につながります。これは、すでに確立されているセッションまたは確立されたセッションに関連するアウトバウンドトラフィックを許可することを意味します。たとえば、サーバーにSSHがある場合、インバウンドのポート22を開くことができますが、サーバーはどのようにデータをクライアントに送り返しますか(後続の通信用に別の上位ポートを提案する場合もあります)。それがこのルールで許可されていることです。
Ubuntu apt-get updateを許可する
Sudo iptables -A OUTPUT -p tcp --dport 80 -d security.ubuntu.com -j ACCEPT
Sudo iptables -A OUTPUT -p tcp --dport 80 -d us.archive.ubuntu.com -j ACCEPT
これらのルールは、ubuntuの更新サーバーのポート80に向かうトラフィックを許可するようにiptablesに指示するだけです。これらはお住まいの地域によって異なる場合があり、さらにある場合もあるため、これを行った後、それが機能することを確認するためにapt-get update
を実行する必要があります。重要:前述したように、最初に適切なIPをマッピングするエントリを/etc/hosts
に配置せずに、このルールを有効にしないでください。また、UbuntuがこれらのIPを変更した場合、iptablesはルールが適用されたときにアドレスを評価するため、ホストエントリを更新し、これらのルールを再起動または再作成する必要があります。
「キラー」ルール
Sudo iptables -A OUTPUT -j REJECT
これは、他のすべてのトラフィックを強制終了するルールです。これは間違いなくチェーンの最後のルールである必要があります。そうしないと、他のルールは機能しません。
次のことを忘れないでください。
Sudo sh -c “iptables-save >/etc/iptables.rules”
ルールを維持したい場合は、次を追加します。
pre-up iptables-restore < /etc/iptables.rules
/etc/network/interfaces
のインターフェース(eth0など)の下。
その他の出力ルール
「ping」を(サーバーから)機能させるには:
Sudo iptables -A OUTPUT -p icmp --icmp echo-request -j ACCEPT
Sudo iptables -A OUTPUT -p icmp --icmp echo-reply -j ACCEPT
DNSが(サーバーから)機能できるようにするため。これらを追加すると、上記の例で/etc/hosts
を使用する必要はありませんが、おそらく安全性が低下することに注意してください。
Sudo iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
Sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
NTPクライアントの時刻同期を許可するには:
Sudo iptables -A OUTPUT -p udp -m owner --uid-owner systemd-timesync -j ACCEPT
(自由に追加してください)