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


18

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

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

回答:


24

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

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

ファイアウォールにすでにいくつかのルールが設定されている場合、これらのコマンドは希望どおりに動作しない場合があります。(iptables -L見つけるためにルートとして言ってください。)頻繁に起こるのは、既存のルールの1つがフィルタリングしようとしているパケットを取得するため、新しいルールを追加しても効果がないことです。コマンドの-I代わりに使用-Aして、iptables新しいルールを追加する代わりにチェーンの中央にスプライスすることができますが、通常、システムの起動時にチェーンがどのように読み込まれるかを見つけて、新しいルールが常にインストールされるようにそのプロセスを変更することをお勧めします正しい順序。

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チェーンの名前を変更した場所が表示されます。理由はわかりません。)


4

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

よると、このWebページ(私はそれが6.1に適用されていることが確認されていない)、service iptables save現在のファイアウォールルールを保存し、これらの保存されたルールは、ブート時にロードされます。したがって、iptablesコマンド(またはその他の手段)を使用して必要なルールを設定し、実行service iptables saveしてセットアップを永続化する必要があります。

スコットパックのブログ投稿は、通常は必要なく、攻撃に参加するリスクが高い「奇数」パケットをドロップするための出発点です。さらに、すべての着信ポートを閉じて、必要なポートのみを開きます。このようなもの:

# 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

1
ジル、質問を少し間違えなかった?Scientific LinuxボックスはLAN上のコンピューターの1つですが、ファイアウォールではないことを理解しています。
rozcietrzewiacz

@Gillesはい、ボックスはLAN上のコンピューターの1つです。
hpy

@rozcietrzewiacz私は、ファイアウォールがサーバーと同じマシン上にあることを理解しています。この質問はある程度曖昧であることに同意しますが、penyuanは1台のマシンのOSのみに言及しているので、私はすべてがそのマシンで起こっていると思います。そうでなければ、これはunixの質問ではなく、これは指定不足のネットワーク管理者の質問になります。
ジル 'SO-悪であるのをやめる'

1

それを行うための好ましい方法は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であると仮定すると、ファイルに以下を入力することにより、ローカルホストまたはローカルLAN上のクライアントを除くすべてのクライアントへのアクセスを拒否できます。sshd/etc/hosts.deny

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

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

詳細については、から始まるmanページをご覧くださいhosts_access(5)


1

独自の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)- 新しいサブネットの1つを編集/etc/ssh/sshd_configおよび変更ListenAddressします(192.168.5.1上記の例)。それでおしまい!そのサブネットの通信をルーティングするようにゲートウェイを構成しない場合、外部から分離する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.