在 docker 中调用 iptables 结果是 "operation not supported"
Invoking iptables results in "operation not supported" in docker
我在 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,
我试图重现与您完全相同的问题,试图在 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 包使其工作。
似乎错误与 iptables 有关。非常感谢@KFC_ 调查此事。
St运行gely 当我在安装 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
我在 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,
我试图重现与您完全相同的问题,试图在 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 包使其工作。
似乎错误与 iptables 有关。非常感谢@KFC_ 调查此事。
St运行gely 当我在安装 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