iptables
私のUbuntu 16.04ノートブックでは、デフォルトですべてのアプリケーションへのインターネットアクセスを拒否し、名前付きグループのみを許可するようにルールを設定しようとしていますinternet
。代わりにグループを使用またはsudo -g
アクセスします。必要に応じてインターネットsg
。たとえば、
sudo -g internet firefox
または
sg internet -c "firefox"
しかし、このアプローチは効果がありませんでした。iptables
私が追加したルールは次のとおりです。
/sbin/iptables -A OUTPUT -p tcp --dport 80 -m owner --gid-owner internet -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --dport 443 -m owner --gid-owner internet -j ACCEPT
/sbin/iptables -A OUTPUT -p udp --dport 53 -m owner --gid-owner internet -j ACCEPT
上記のルールをテストしましたが、所有者モジュールを削除すると正常に動作し、すべてのアプリでインターネットを許可します。ただし、所有者モジュールとgid-owner
フィルタを追加すると、どのアプリケーションもインターネットにアクセスできなくなります(上記とsg
コマンドsudo -g
を使用しても)。
私は何が間違っていましたか?
ベストアンサー1
すでに解決されているとマークされていますが、この問題を経験している他の人々の健全な精神のために、ここで詳しく説明し、発見した問題の実際の原因を説明する必要があると思いました。問題はiptables。特に、人間が期待する方法でグループIDフィルタリングを処理しません。これがWADかバグかはわかりません。 IMHOこれは間違いですiptables -m owner
拡張コード。
問題は処理にあります--gid-owner
。そうだiptables 拡張コードはグループIDを文字通りフィルタリングしません(つまり、グループのユーザーはYesまたはNoです)。モジュールの動作を見ると、より深く掘り下げてユーザー名の設定を調べて、ユーザーの基本グループメンバーシップに基づいて決定を下すことが明らかです。これは、グループのメンバーリストを文字通りに確認するのとは異なります(自分自身とこの問題を経験した他の人が期待するもの)。この動作は関連するマニュアルページに文書化されていません。
つまり、Ubuntuのiptables実装は確認だけです。メイングループ現在のネットワークパケットの所有者です。特定のユーザーグループが使用される分割VPNを作成するとします。VPNトラフィックをVPNインターフェイスに強制します。
所有者固有を指定すると、拡張の下のパラメータは--uid-owner
期待-m owner
どおりに機能します。次に、分岐したいユーザー名が複数あり、時間の経過とともにユーザーリストが変更される可能性があるとします。したがって、グループIDフィルタリングを使用する方が効率的であると判断します(--gid-owner
)。すべてのVPNトラフィックユーザーVPNiptablesパラメータを--gid-owner vpn
。ご覧のとおり、多くの場合、フィルタは期待どおりに機能しません。なぜ?
パケット所有者の基本/基本グループのみが比較されます。したがって、あなたが追加したすべてのユーザー名はVPNユーザーが作成された後、グループは次の場所になります。VPNセカンダリユーザーとしてグループ化グループに属していても分岐しません!
「root」ユーザーが機能しない理由は、デフォルト/基本グループが「root」であるためです。
例えば
ユーザー名があると仮定VPNジュニアグループでVPNとユーザー名テストダミージュニアグループでテストしかし、テストダミーやはりその組織の一員VPNグループ。到着テストダミー、VPNマイナーグループだ。
このiptablesルールはVPNユーザーではありませんが、テストダミー両方のユーザーがグループに属しているため、両方のユーザーのパケットがタグ付けされると本能的に考える場合も同様です。VPN:
iptables -t mangle -A OUTPUT ! -d 192.168.1.1 -m owner --gid-owner vpn -j MARK --set-mark 0x1
問題を解決するには、次の回避策などの他のルールを作成する必要があります。
iptables -t mangle -A OUTPUT ! -d 192.168.1.1 -m owner --gid-owner vpn -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT ! -d 192.168.1.1 -m owner --uid-owner testdummy -j MARK --set-mark 0x1