Iptables が特定の IP からの受信をブロックできない

Iptables が特定の IP からの受信をブロックできない

こんにちは。ゲートウェイとして使用しているオンラインサーバーがあり、iptablesの動作がおかしいです。

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j BLOCK_CHAIN
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j BLOCK_CHAIN
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i tun+ -j ACCEPT
-A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 443 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A BLOCK_CHAIN -s 173.230.154.149/32 -j REJECT --reject-with icmp-host-prohibited
-A BLOCK_CHAIN -m state --state NEW -j ACCEPT

しかし、173.230.154.149は80または443でApacheサーバーにアクセスできます。

-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j BLOCK_CHAIN
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j BLOCK_CHAIN

そして

-A BLOCK_CHAIN -s 173.230.154.149/32 -j REJECT --reject-with icmp-host-prohibited

はい、これはすべてのウェブサービスをOpenVPN経由で個人のより大きなサーバーにルーティングするオンラインサーバーです。

すべては期待通りに動作しますが、明らかにサーバーを攻撃している特定の IP からの着信接続をブロックできません。

ネットワークの類型は

外部 IP XX.XX.X.XX VPN 10.0.0.0/24

-A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.100
-A PREROUTING -i eth0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.0.0.100

答え1

ローカル プロセスによって受信されるのではなくルーティングされるパケットは、NAT の使用によって発生した場合でも、filter/FORWARD チェーンを通過し、filter/INPUT チェーンを通過しません。そのため、filter/INPUT の現在のブロック ルールは効果がありません。これらのルール:

-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j BLOCK_CHAIN
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j BLOCK_CHAIN

次のように置き換えるだけです:

-A FORWARD -i eth0 -p tcp -m tcp --dport 443 -j BLOCK_CHAIN
-A FORWARD -i eth0 -p tcp -m tcp --dport 80 -j BLOCK_CHAIN

当然ながら、効果を発揮するには、Web サーバーへのアクセスを許可するルールの前に追加する必要があります。少なくとも以下の前に追加してください。

-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 443 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT

最初の接続が受け入れられると、それ以降のすべてのパケットは次のルールによって短絡されます。

-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

したがって、最初に表示されたときにブロックする必要があります。


追加コメント:

  • 冗長なルール

    -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A FORWARD -i tun+ -j ACCEPT
    -A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
    

    上記の 1 番目のルールと 2 番目のルールをそれぞれ個別に適用すると、3 番目のルールは不要になります。

    同じく:

    -A FORWARD -i eth0 -o tun+ -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
    -A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
    -A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 443 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
    

    最初のルールにより、次の 2 つのルールは不要になります。

    しかし、これはすべて、現在の問題をテストするためのものだったのかもしれません。

  • 非常に最近のカーネル (問題が修正されているカーネル) を実行しない限り、いかなる REJECT ルールも INVALID 状態のパケットを拒否することはできません。このようなパケットは「単に」DROP される必要があります。そうしないと、正当なトラフィックのまれなランダムな接続障害が発生する可能性があります。

    これは現在、iptables-extensions(8):

    警告: 接続状態が INVALID と分類されているパケットに REJECT ターゲットを無差別に適用しないでください。代わりに、これらのパケットは DROP のみにしてください。

    (その後、マニュアル ページでさらに詳しい説明が提供されます。)

    典型的には、

    -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    

    続いて以下が続きます:

    -A FORWARD -m conntrack --ctstate INVALID -j DROP
    

関連情報