dns(ポート53)、チームビューアポート(5938)、およびマイサーバーIP(ポート80)を除くiptables-block-all-inbound-and-outbound

dns(ポート53)、チームビューアポート(5938)、およびマイサーバーIP(ポート80)を除くiptables-block-all-inbound-and-outbound

以下を使用して、いくつかの例外を除いてすべてのトラフィックをブロックしてみましたiptables

  • ドメイン名システム
  • マイサーバー(ポート80のみを使用)
  • チームビューア(ポート5938)
  • adb接続を許可するポート5555

現在、次のコード行がありますが、必要な方法で動作しません。

// Allow my own server - this seems to work
iptables -A INPUT -s 1.1.1.1 -j ACCEPT
iptables -A OUTPUT -d 1.1.1.1 -j ACCEPT

// Allow DNS requests - dont know if it´s correct
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT

// Allow Teamviewer - same as above - dont know if it´s correct
iptables -A INPUT -p tcp --dport 5938 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 5938 -j ACCEPT
iptables -A OUTPUT -p udp --dport 5938 -j ACCEPT
iptables -A INPUT -p udp --dport 5938 -j ACCEPT

// Allow ADB - same as above - dont know if it´s correct
iptables -A INPUT -p tcp --dport 5555 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 5555 -j ACCEPT
iptables -A OUTPUT -p udp --dport 5555 -j ACCEPT
iptables -A INPUT -p udp --dport 5555 -j ACCEPT

// Block all other requests
iptables -P INPUT DROP
iptables -P OUTPUT DROP

Teamviewerが接続されず、名前解決が機能せず、adbは接続されません。何か問題があるようですが、それが何であるかよくわかりません。そのドメインをハードコーディングするときに機能する唯一の方法は、私のサーバーに接続することだけです/etc/hosts

ここの専門家の一人がiptables私を助けることができますか?

答え1

何が動作しませんか?実際に私の言葉が正しい場合、最初のiptableエントリはすべてのトラフィックtcp / udpを受け入れます。したがって、他のACEも攻撃しません。 HTTPトラフィックのみが必要な場合は、TCPポート80のみを許可する必要があります。

IPtablesは上から下に動作します。サーバーはIPアドレス1.1.1.1を持ち、すべてのパケットの送信元は1.1.1.1です。それ以外の場合、すべての着信トラフィックは送信元xxxxと宛先1.1.1.1を持つため、最初の2つのエントリはすべてのトラフィックと一致します。必要に応じて、最初の2つのルールなしで構成する必要があります。 DNSトラフィックは許可されています:

iptables -A OUTPUT -p udp --sport 1024:65535 --dport 53 -j ACCEPT

HTTP / HTTPSトラフィック用のサーバーを設定する必要があります。

iptables -A OUTPUT -p tcp --sport 1024:65535 -m multiport --dports 80,443 -j ACCEPT

Teamviewerは優先的に5938を介してTCP接続を取得するため、次のようにする必要があります。

iptables -A OUTPUT -o eth0 -p tcp --dport 5938 -m state --state NEW -j ACCEPT

私はADBに公開されていないので、ADBについてはよくわかりません。ただし、TCPストリームの場合は、次のようにする必要があります。

iptables -A OUTPUT -p tcp --dport 5555 -j ACCEPT

答え2

アウトバウンドトラフィックを正しく許可していますが、送信元ポートと宛先ポートを混同しているため、応答パケットをブロックしています。

リモートシステムのサービスに接続すると、通常はサービスの宛先ポートとしてソケットを開き、ソースポートは未定義です。つまり、カーネルはソースポートをランダムに割り当てます。その後、リモートサービスからの応答は、送信元ポートが宛先ポートであり、宛先ポートが送信元ポートであるネットワークパケットに再送信されます。ただし、ルールはサービス宛先ポートを戻りトラフィックの宛先ポートとしても使用しますが、これは実際のトラフィックと一致しないため機能しません。

理論的には、--sport戻りトラフィックの送信元ポートを一致させることはできますが、お勧めしません。これにより、ポート53を送信元ポート(または開いている他のサービス)として使用する限り、誰でもサーバー上のすべてのサービスにトラフィックを送信できます。

代わりに、接続追跡モジュールを使用することをお勧めします。

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

説明する:

  • -m conntrackconntrack:既知の接続状態を追跡するモジュールをロードするようにiptablesに指示します。
  • --ctstate RELATED,ESTABLISHED:既知のネットワーク接続の一部として送信されたパケットのみが一致します(ESTABLISHED)。または予想される新しい接続(RELATED)を作成します。 RELATEDは、複数のネットワーク接続を使用するFTPなどの操作に役立ちます。使用しているプロトコルとは何の関係もないと思うので、必要に応じて削除できます(ただし、100%はわかりません。だから……)

このルールを追加したら、最初の接続にルールを追加することを心配するだけです。

iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 5938 -j ACCEPT

(許可したいすべてのプロトコルに対してこの手順を繰り返します)

conntrack発信トラフィックをブロックしたい場合は、OUTPUTチェーンでも使用できます。

最後に一致させることができるINVALID状態もあることに注意してください。iptablesこのイベントは、ネットワーク接続の一部であると主張するパケットが到着したがステータスが見つからない場合にトリガされます。これは、状態テーブルのメモリが不足しているか、攻撃者がファイアウォールを迂回しようとするためです。何かを記録し、パケットをドロップしたいかもしれません。

関連情報