web-dev-qa-db-ja.com

iptablesですべての着信接続を拒否しますか?

すべての着信接続を拒否し、発信を許可するいくつかの単純なiptablesルールを作成したいと思います。どうやってやるの?

17
polyglot

Rootアクセスでこれを試してください:

# Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Accept on localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Allow established sessions to receive traffic
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

これは実行中の接続をすべて残酷に切断するであることに注意してください-これには、サーバーの管理に使用できるSSH接続などが含まれます。これは、ローカルコンソールにアクセスできる場合にのみ使用してください。

SSHの例外を追加する方法については、Miphixの回答を参照してください。

27
Yohann

SSH経由でリモートで作業している場合は、これを追加することができます(-Iは、INPUTの他のすべてのルールの前に挿入します)。

iptables -I INPUT -p tcp --dport 22 -j ACCEPT

SSHサービスが別のポートでリッスンしている場合は、22ではなく、そのポートを使用する必要があります。

そうしないと、誤ってアクセスできなくなる可能性があります。

13
Miphix

他の回答はIPv6をカバーしていないことに注意してください!システムがIPv6トラフィックを受け入れる場合、単一のiptablesルールはipv6トラフィックに適用されません。

iptables/ip6tablesを直接使用する代わりに、iptables-restoreを使用して保存することをお勧めします。これらのツールを使用すると、複数のルールでiptables構成を指定し、1つのコマンドで簡単にロードできます。

次の内容のファイル(名前はiptables.rules)を作成します。

*filter

# drop forwarded traffic. you only need it of you are running a router
:FORWARD DROP [0:0]

# Accept all outgoing traffic
:OUTPUT ACCEPT [623107326:1392470726908]


# Block all incoming traffic, all protocols (tcp, udp, icmp, ...) everything.
# This is the base rule we can define exceptions from.
:INPUT DROP [11486:513044]

# do not block already running connections (important for outgoing)
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# do not block localhost
-A INPUT -i lo -j ACCEPT

# do not block icmp for ping and network diagnostics. Remove if you do not want this
# note that -p icmp has no effect on ipv6, so we need an extra ipv6 rule
-4 -A INPUT -p icmp -j ACCEPT
-6 -A INPUT -p ipv6-icmp -j ACCEPT

# allow some incoming ports for services that should be public available
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

# commit changes
COMMIT

ICMPと特定のポートへのトラフィックを許可する場合は、追加の例を追加していることに注意してください。

今、あなたはこれらのコマンドでそれをロードすることができます:

iptables-restore < iptables.rules
ip6tables-restore < iptables.rules

これで、ルールはipv6にも対応し、管理が簡単になりました。

Debianユーザーへの追加の注記:ルールに満足している場合は、apt install iptables-persistentしたがって、再起動後にルールが復元されます。ルールはシャットダウン時に自動保存されないため、netfilter-persistent save永続的なルールを更新します。

3
bhelm

上記の両方の答えはどういうわけか正しいですが、Originが答えるほど正確ではありません。 (申し訳ありませんが、コメントを追加するのに十分な評判がないため、完全な回答を書きます)。

私のケースでは、過負荷のApacheサーバーに出会い、cronジョブで溢れ、CPUを過剰に使用していました。スレッドの制限はSQLデータベースに保存されましたが、接続の制限に達しました。ローカルホスト(この部分はオプションです)からの着信Apache接続を制限したかったのですが、他のすべての接続は可能にしてください。実際に設立されたものも含みます。

コマンドでやった

Sudo iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j REJECT

つまり、ポート80の各着信tcpパッケージについて、stateモジュールをロードし、これが最初のパッケージ(着信接続)の場合は拒否します。 localhostの場合は、-s 127.0.0.0/8を使用します

また、実際の使用では、「悪意のある」パッケージを送信してルールを迂回できるため、州に「無効」を追加する場合がありますNEW,INVALID。また、-j DROPに置き換えて、送信トラフィックを節約します(拒否ビーコンを送信しません)

1
Offenso