Linuxでユーザーがインターネットにアクセスするのをブロックするにはどうすればよいですか?
私は次のことを試みています:
iptables -A OUTPUT -p tcp --dport 80,443 -m owner --uid-owner $USERNAME -j DROP
それは正しい構文またはコマンドですか?
そして、私はssh myhost.somewhere.onthe.internet.example.com -D 12345
、SOCKSプロキシを使用するようにブラウザを指定しますlocalhost:12345
、そして私は陽気な道を進みます。
つまり、特定のポートをブラックリストに登録するだけでは不十分です。あなたはブロックしたいかもしれませんallネットワークアクセス:
iptables -A OUTPUT -m owner --uid-owner $USERNAME -j DROP
特定のネットワークリソース(ローカルネットワーク共有など)にアクセスする必要がある場合があるため、それらをホワイトリストに登録する(またはローカルネットワークブロックをホワイトリストに登録する)必要がある場合があることに注意してください。
このコマンドは、ユーザーがインターネット全体ではなく、ワールドワイドウェブにアクセスするのをブロックするだけです。
それとは別に、同じマシンで実行されていると仮定すると、動作するはずです$USERNAME
は取り組んでいます。
まず第一に
iptables
は、その仕事をするための正しいコマンドです。ただし、一般的には、適切な量のコマンドを使用して完全なテーブルを設定します。 1つのコマンドは、テーブルの1つの代替です。
すでに配置されているテーブルと、一致するルールがない場合のデフォルトポリシーを確認するには、iptables -L
を使用します。通常、ineはすべてのiptables設定を含むbashスクリプトを記述します。ここで、最初にすべてのチェーンをフラッシュしてから、すべてを一度に入れます。これは、何が出入りしているかを見失うのを防ぐためです。
また、init実装をチェックして、電源を入れ直しても変更を永続化するために使用できるinitスクリプトがあるかどうかを確認します。 (通常、テーブルは再起動後に失われます)。
すべてのiptablesコマンドを含めるスクリプトを作成するだけです。
#!/bin/bash
# Flush all chains
iptables -F
#Set defaults policies
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
# Don't block localhost traffic
iptables -A INPUT -i lo -j ACCEPT
# Don't re-evaluate already accepted connections
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
#Allowed incomming tcp ports
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT # SSH
# Add watherver you wish to allow more
標準のiptableルールに関するその他のヒントについては、 this の記事を参照してください。
今あなたの質問に答える
まず、基本的なファイアウォールが稼働していることを確認する必要がありました。これで、ルールをスクリプトに追加して有効にすることができます。他の回答からの提案を考慮に入れてください。ユーザーは、プロキシまたは代替ポートを使用して、ブロックされた2つのポートを簡単にバイパスできます。
さらに、構文が正しくありませんでした。 --dportは1つのポートのみを使用できます。これを行うには、マルチポートモジュールを使用するか、複数のルールをチェーンする必要があります。
ただし、このユーザーのall発信接続をブロックすると、localhostまたは-にあるlo接続に依存するため、多くのアプリケーションが失敗します。 127.0.0.1。 (たとえば、KDM/KDEを使用している場合、ログイン中にシステムがフリーズします。)
したがって、ルールからloネットワークインターフェイスを除外する必要があります。それでもユーザーに特定のサービスへのアクセスのみを許可する場合は、ルールを作成するだけですbeforeそれらのポートを許可するDROPルール。私は次のことを提案します:
# Don't re-evaluate already ACCEPTed connections:
iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# Allow an outgoing connection, like SSH
iptables -A OUTPUT -p tcp --dport 22 -m owner --uid-owner $USERNAME -j ACCEPT
# Drop anything else that not on localhost
iptables -A OUTPUT ! -o lo -m owner --uid-owner $USERNAME -j DROP