一部のポートがローカルエリアネットワークからの接続のみに開かれ、外部からの接続に開かれないように、LAN内のシステムにファイアウォールを設定するにはどうすればよいですか?
たとえば、 Scientific Linux 6.1 (RHELベースのディストリビューション)を実行しているボックスがあり、そのSSHサーバーがlocalhostまたはLANからの接続のみを受け入れるようにしたいとします。どうすればよいですか?
カーネルの 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タイプのシステムでは、そのための最善の方法は firewall-cmd
またはそれに相当するGUIを使用することです。これは、OSのfirewalld
デーモンに必要なものを伝えます。これは、実際にiptables -L
を介して表示されているものを入力および操作するものです。
古い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
チェーンの名前が変更されていることがわかります。なぜですか?言うことができません。)
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)
で始まるマニュアルページを確認してください。
独自の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
)。それでおしまい!そのサブネットの通信をルーティングするようにゲートウェイを構成しない場合は、外部から分離する必要があります。