web-dev-qa-db-ja.com

1つのルールで複数のマルチポートを設定するiptables

マルチポート拡張には、指定できるポートの制限(15)があります。

しかし、1つのルールでさらに多くのポート番号を指定する必要があるため、次のように1つのルールで複数のマルチポートを使用しようとしました。

iptables -A INPUT -p tcp -m multiport --destination-ports 59100 -m multiport --destination-ports 3000 -m state --state NEW -j REJECT --reject-with tcp-reset

結果として iptables -L INPUT -n

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
REJECT     tcp  --  0.0.0.0/0            0.0.0.0/0           multiport dports 59100 multiport dports 3000 state NEW reject-with tcp-reset

しかし、クライアントから接続しようとしても、両方のポートが拒否されないことがわかりました。

バージョンはv1.4.2-rc1です。

回避策はありますか、または1つのルールで15を超えるポートを指定する必要がある場合はどうすればよいですか。

19
ning

この制限の回避策として、すべてのケースをカバーするために2つのルールを使用します。

たとえば、これらの18個のポートを許可または拒否する場合:

465,110,995,587,143,11025,20,21,22,26,80,443,3000,10000,7080,8080,3000,5666

以下のルールを使用します。

iptables -A INPUT -p tcp -i eth0 -m multiport --dports 465,110,995,587,143,11025,20,21,22,26,80,443 -j ACCEPT

iptables -A INPUT -p tcp -i eth0 -m multiport --dports 3000,10000,7080,8080,3000,5666 -j ACCEPT

上記のルールは、シナリオでも機能するはずです。最初と2番目のルールの両方で15ポートの制限に達した場合、別のルールを作成できます。

31
vinod garag

複数のルールを使用してORのようなセマンティクスを実装する必要があります。これは、ルール内で一致は常にANDで結合されるためです。または、ポートインデックス作成ipsets(ipset create blah bitmap:port)。

3
jørgensen

私の知る限り、複数の一致を記述することは論理AND演算です。したがって、ルールの意味は、宛先ポートが「59100」および「3000」の場合、tcp-resetを使用した接続を拒否することです。回避策は-mportオプションを使用しています。 manページをご覧ください。

0
neoinzion