web-dev-qa-db-ja.com

一部のファイアウォールポートをローカルネットワーク接続のみを受け入れるように設定しますか?

一部のポートがローカルエリアネットワークからの接続のみに開かれ、外部からの接続に開かれないように、LAN内のシステムにファイアウォールを設定するにはどうすればよいですか?

たとえば、 Scientific Linux 6.1 (RHELベースのディストリビューション)を実行しているボックスがあり、そのSSHサーバーがlocalhostまたはLANからの接続のみを受け入れるようにしたいとします。どうすればよいですか?

18
hpy

カーネルの iptables 完全に空(iptables -F)を使用すると、次のようになります。

# iptables -A INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j DROP

これは、すべてのLANアドレスがTCPポート22と通信することを許可され、そのローカルホストが同じ考慮事項を取得する(はい、127。*だけではなく127.0.0.1))ことを示し、他のすべてのアドレスからのパケットは最初の2つのルールに一致すると、誤って ビットバケット にドロップされます。アクティブな拒否(TCP RST)が必要な場合は、REJECTの代わりにDROPを使用できます。 TCPポート22はパケットのブラックホールです。

LANが192.168.0。*ブロックを使用していない場合は、当然、最初の行のIPとマスクを変更して、LANのIPスキームに一致させる必要があります。

ファイアウォールにすでにいくつかのルールが構成されている場合、これらのコマンドは期待どおりに動作しない可能性があります。 (調べるには、ルートとしてiptables -Lと言います。)頻繁に発生するのは、既存のルールの1つが、フィルタリングしようとしているパケットを取得するため、新しいルールを追加しても効果がないことです。 iptablesコマンドで-Iの代わりに-Aを使用して、新しいルールを追加する代わりにチェーンの途中にスプライスすることができますが、通常、チェーンがどのように取得されるかを調べることをお勧めしますシステムの起動時に入力され、そのプロセスを変更して、新しいルールが常に正しい順序でインストールされるようにします。

RHEL 7以降

最近のRHELタイプのシステムでは、そのための最善の方法は firewall-cmd またはそれに相当するGUIを使用することです。これは、OSのfirewalldデーモンに必要なものを伝えます。これは、実際にiptables -Lを介して表示されているものを入力および操作するものです。

RHEL 6以前

古いRHELタイプのシステムでは、注文の際にファイアウォールチェーンを変更する最も簡単な方法は、/etc/sysconfig/iptablesを編集することです。 OSのGUIおよびTUIファイアウォールツールはかなり単純化されているため、このようなより複雑なルールを追加し始めたら、古き良き設定ファイルに戻ることをお勧めします。 OSのファイアウォールツールを使用して構成を変更すると、このような手作りのルールを処理する方法がわからなくなる可能性があるため、これを開始すると変更が失われる可能性があることに注意してください。

次のようなものをそのファイルに追加します。

-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -j DROP

追加するのは注意が必要です。そのファイルで--dport 22について話している行を見つけた場合は、単に上記の3行で置き換えてください。それ以外の場合は、-j ACCEPTで終わる既存の最初の行の前にあるはずです。一般に、 iptables の動作についてある程度理解しておく必要があります。その時点で、正しい挿入ポイントが明らかになります。

そのファイルを保存し、service iptables restartと言ってファイアウォールルールを再読み込みします。編集を太った指で操作する場合に備えて、コンソールにログインしているときに必ずこれを実行してください。 SSH経由でログインしている間、自分のマシンからロックアウトしたくない。

上記のコマンドとの類似性は偶然ではありません。このファイルのほとんどは、iptablesコマンドへの引数で構成されています。上記との違いは、iptablesコマンドが削除され、INPUTチェーン名が特別なRHEL固有のRH-Firewall-1-INPUTチェーンになることです。 (ファイルをさらに詳しく調べてみると、ファイルの前半で、基本的にINPUTチェーンの名前が変更されていることがわかります。なぜですか?言うことができません。)

25
Warren Young

Linuxでのファイアウォール設定の低レベルツールは iptables です。より高レベルのツールも利用できます。 Scientific Linuxに推奨されるファイアウォールツールがあるかどうかはわかりません。

このWebページ (6.1に適用されることは確認していません)によると、service iptables saveは現在のファイアウォールルールを保存し、保存されたルールは起動時に読み込まれます。したがって、iptablesコマンド(またはその他の方法)を使用して必要なルールを設定し、service iptables saveを実行して設定を永続化する必要があります。

Scott Packのブログ投稿 は、通常は不要であり、攻撃の一部である可能性が高い「奇妙な」パケットをドロップするための開始点です。さらに、すべての着信ポートを閉じて、必要なポートのみを開く必要があります。このようなもの:

# Accept everything on the loopback interface
iptables -A INPUT -i lo -j ACCEPT
# Accept ICMP
iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
# Drop oddball packets
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -f -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# Accept packets that are part of established connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accept selected incoming connections, e.g. ssh from 10.0.42.x
iptables -A INPUT -p tcp --dport 22 -s 10.0.42.0/24 -j ACCEPT
# Reject incoming connections that aren't explicitly accepted
iptables -A INPUT -j REJECT

これを行うための推奨される方法は、iptablesを使用することです。それは他の人たちによって適切にカバーされているように見えるので、完全を期すために、ほとんどのLinuxディストリビューションの多くのデーモンで利用できる代替のアクセス制御方法を指摘します。そのアクセス制御メソッドは、libwrapライブラリによって提供されます。

お気に入りのデーモンがlibwrapをサポートしているかどうかを確認するには、次のコマンドを実行してみてください。

_ldd `which sshd` | grep libwrap
_

次のような空ではない結果が得られた場合

_libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f84e7b0e000)
_

その後、あなたは間違いなく行ってもいいです。

sshdデーモンがlibwrapをサポートしていることはほぼ確実であるため、アクセス制御については_/etc/hosts.allow_および_/etc/hosts.deny_ファイルを参照する必要があります。ローカルLANネットワークが_192.168.100.0/24_であると仮定すると、denyすべてのクライアントへのsshdへのアクセスexceptローカルホストまたはローカル上のクライアント以下を_/etc/hosts.deny_ファイルに追加してLANを作成します。

_sshd: ALL EXCEPT 127.0.0.0/255.0.0.0, [::1]/128, 192.168.100.0/255.255.255.0
_

このメソッドしない実際にポートを開いたり閉じたりすることに注意してください。このアクセス制御の方法を使用するデーモンに、指定されたパターンに一致するクライアントからの接続試行を受け入れるか拒否するかを通知するだけです。

詳細については、hosts_access(5)で始まるマニュアルページを確認してください。

1
Steven Monday

独自のLinuxベースのファイアウォールを使用している場合は、iptablesをセットアップすることをお勧めします。そうでなく、ファイアウォールがルーターである場合は、ポート転送を明示的に有効にしない限り、おそらくデフォルトの構成で外部からのアクセスが既に禁止されています(最近の回答 この質問に対して で説明したとおり)。

上記の追加のセキュリティのために、LAN内接続に別のサブネットを使用できます。そのためには、各コンピューターに、ルーターではなくLAN内でのみ使用される2番目のIPアドレスを追加します。 LAN全体が192.168.0.xxxアドレスを使用していて、ルーター(ゲートウェイ、ファイアウォール)が192.168.0.1であるとします。したがって、各コンピュータに2つ目のアドレスを追加します-例:

ifconfig eth0:0 192.168.5.1/24

次に、sshd構成を編集して、このアドレスのみを使用するようにします(192.168.0.xxxでの接続を許可しないようにするため)-/etc/ssh/sshd_configを編集し、ListenAddressを新しいサブネット(上記の例では192.168.5.1)。それでおしまい!そのサブネットの通信をルーティングするようにゲートウェイを構成しない場合は、外部から分離する必要があります。

1
rozcietrzewiacz