14

Pythonを介してシステムに構成されている現在のiptablesチェーンを取得しようとしています。iptablesコマンドをstraceすると、次のように出力されます。

strace iptables -L INPUT
socket(PF_INET, SOCK_RAW, IPPROTO_RAW)  = 3
getsockopt(3, SOL_IP, 0x40 /* IP_??? */, "filter\0\377`\2\351\1\0\210\377\377\210}\313\276\0\210\377\377\354\206\0\201\377\377\377\377"..., [84]) = 0

ここに完全な出力:http://pastebin.com/e7XEsaZV

Pythonで、ソケットobjを作成し、getsockoptを呼び出そうとすると、エラーが発生します。

>>> s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
>>> s.getsockopt(socket.SOL_IP, 0x40)
Traceback (most recent call last):
  File "<pyshell#46>", line 1, in <module>
    s.getsockopt(socket.SOL_IP, 0x40)
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
error: [Errno 22] Invalid argument
>>>
>>> s = socket.socket(2, socket.SOCK_RAW, socket.IPPROTO_RAW)
>>> s.getsockopt(socket.SOL_IP, 0x41)
Traceback (most recent call last):
  File "<pyshell#48>", line 1, in <module>
    s.getsockopt(socket.SOL_IP, 0x41)
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
error: [Errno 22] Invalid argument
>>> 

これは不可能ですか?

4

2 に答える 2

18

python-iptablesを見たことがありますか?

Python-iptablesは、LinuxでのiptablesへのPythonバインディングを提供します。iptablesとの相互運用性は、iptablesバイナリを呼び出してその出力を解析するのではなく、iptables Cライブラリ(libiptc、libxtables、およびiptables拡張機能)を使用して実現されます。

于 2011-05-05T02:14:22.817 に答える
0

エラー22の理由は明らかです。getsockopt()タイプを指定した呼び出しにIPT_SO_GET_INFOは、へのポインターの3番目の引数が必要struct ipt_getinfoです。構造体は私のLinuxのインクルードファイルを持っています/usr/include/linux/netfilter_ipv4/ip_tables.h

さらに、より多くの要件があります。呼び出しに指定されたバッファーサイズgetsockopt()は、私のマシンでは84バイトの構造体のサイズと一致する必要があります。この呼び出しが実際に失敗する理由は、構造体メンバーの要件が、クエリに関心のあるテーブルを示さ.name なければならないためです。テーブル名のサイズとランダムバイトが指定されていない場合、このエラーが発生します22。

Pythonでは、の引数としてユーザー定義のバイトを入力するためのAPIがないため、最終的にこれはすべて失敗しますgetsockopt()。うまくいくと仮定するIPT_SO_GET_INFOと、自然な次のステップは、テーブルのすべてのチェーンを。で読み取るIPT_SO_GET_ENTRIESことです。これもPythonでは不可能です。Pythongetsockopt()は、1024バイトを超えるバッファを許可しません。IPtablesを使用する実際のLinuxでは、チェーンルールがその1KiBの制限を簡単に超える可能性があります。

IPtablesルールの読み方に関する良いCの例は、https://github.com/mozilla/rr/blob/master/src/test/netfilter.cにあります。

于 2020-01-19T14:29:34.547 に答える