【问题标题】:Invoking iptables results in "operation not supported" in docker在 docker 中调用 iptables 导致“操作不支持”
【发布时间】:2020-07-13 16:52:53
【问题描述】:

在 pod 中使用 iptables 时遇到错误:

root@chris-sshuttle-k8stest:~# iptables -t nat -nL
iptables: Operation not supported.

如果我直接用 docker 运行图像,虽然它可以正常工作:

docker run --cap-add=NET_ADMIN -it --rm chrissound/sshuttle-k8stest:v2 /bin/bash
root@e857b0d4152a:/# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
...

另外capsh --print的输出是:

root@chris-sshuttle-k8stest:~# capsh --print
Current: = cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read+eip
Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read
Securebits: 00/0x0/1'b0
 secure-noroot: no (unlocked)
 secure-no-suid-fixup: no (unlocked)
 secure-keep-caps: no (unlocked)
uid=0(root)
gid=0(root)
groups=

哪个有net_admin:

root@chris-sshuttle-k8stest:~# capsh --print | grep net_admin
Current: = cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read+eip
Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read

pod.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: chris-sshuttle-k8stest
  labels:
    name: chris-sshuttle-k8stest 
spec:
  containers:
  - name: sshuttle
    image: chrissound/sshuttle-k8stest:v2
    command: ["sleep", "10000000"]
    securityContext:
      privileged: true
      capabilities:
        add: ["NET_ADMIN","NET_RAW"]

额外调试:

通过 SSH 连接到 k8s 节点并检查 docker 容器,一切似乎都是正确的:

$ docker inspect 6f96802d7e13 | grep -B 4 -A 4 NET_AD
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": [
                "NET_ADMIN",
                "NET_RAW"
            ],
            "CapDrop": null,
            "Dns": null,

【问题讨论】:

标签: docker kubernetes iptables


【解决方案1】:

似乎错误与 iptables 有关。非常感谢 @KFC_ 对此进行调查。

奇怪的是,当我在安装 iptables 后从 python:3.7-slim 图像再次运行它时:我得到了额外的输出:

# iptables -t nat -nL
# Warning: iptables-legacy tables present, use iptables-legacy to see them
iptables: Operation not supported.

在这里找到解决方案:https://github.com/docker/libnetwork/issues/2331

update-alternatives --set iptables /usr/sbin/iptables-legacy

【讨论】:

    【解决方案2】:

    我试图重现您尝试在 kubernetes 中启用 iptables 的完全相同的问题,但没有成功 - 我无法收到 iptables: Operation not supported. 错误,并且几乎没有类似的问题。

    但是,我设法使用 different docker image 使 iptables 工作,在本例中为 vimagick/iptables

    使用此图像,您只需传递要在容器内执行的命令。

    apiVersion: v1
    kind: Pod
    metadata:
     name: iptables-pod
    spec:
     containers:
       - name: pod
         image: vimagick/iptables
         command:
           - /bin/sh
           - -c
           - iptables -t nat -nL
         securityContext:
           capabilities:
             add: ["NET_ADMIN"]
    

    这个 pod 在申请后将其状态更改为Completed,因为它只执行iptables -t nat -nL 命令,但您可以通过查看 pod 的日志来检查它是否有效:

    kubectl logs iptables-pod
    
    Chain PREROUTING (policy ACCEPT)
    target     prot opt source               destination         
    
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination         
    
    Chain POSTROUTING (policy ACCEPT)
    target     prot opt source               destination
    

    我还设法使用简单的Ubuntu 图像并安装 iptables 包使其工作。

    【讨论】:

    • 有趣...您是否设法重现它与 Docker 映像本身一起正常工作 - docker run --cap-add=NET_ADMIN -it --rm chrissound/sshuttle-k8stest:v2 /bin/bash?只是好奇。谢谢!
    • 是的,在本地使用这个 docker 镜像得到了相同的输出。很高兴它对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-11-14
    • 2010-10-19
    • 2022-10-16
    • 2021-03-31
    • 2023-03-24
    • 2010-09-22
    • 2015-11-27
    • 1970-01-01
    相关资源
    最近更新 更多