LANのシステムにファイアウォールを設定して、一部のポートが外部からではなくローカルエリアネットワークからの接続に対してのみ開かれるようにするにはどうすればよいですか?
たとえば、Scientific Linux 6.1(RHELベースのディストリビューション)を実行しているボックスがあり、そのSSHサーバーがローカルホストまたはLANからの接続のみを受け入れるようにします。どうすればいいですか?
LANのシステムにファイアウォールを設定して、一部のポートが外部からではなくローカルエリアネットワークからの接続に対してのみ開かれるようにするにはどうすればよいですか?
たとえば、Scientific Linux 6.1(RHELベースのディストリビューション)を実行しているボックスがあり、そのSSHサーバーがローカルホストまたは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との通信を許可され、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タイプのシステムでは、それを行うための最良の方法は、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
してセットアップを永続化する必要があります。
スコットパックのブログ投稿は、通常は必要なく、攻撃に参加するリスクが高い「奇数」パケットをドロップするための出発点です。さらに、すべての着信ポートを閉じて、必要なポートのみを開きます。このようなもの:
# 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
であると仮定すると、ファイルに以下を入力することにより、ローカルホストまたはローカル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)
。
独自の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
上記の例)。それでおしまい!そのサブネットの通信をルーティングするようにゲートウェイを構成しない場合、外部から分離する必要があります。