现象
执行iptables 命令出错
1 2 | iptables -L segmentation fault xxxxxx |
原因
iptables 版本和内核不兼容,一般出现在新版的linux系统和Docker容器上,或者升级iptables问题。
新版版本包括:Ubuntu18和Debian10
说明
新版Debian和Ubuntu默认是 iptables-nft
1 2 3 4 | # update-alternatives --set iptables /usr/sbin/iptables-nft # update-alternatives --set ip6tables /usr/sbin/ip6tables-nft # update-alternatives --set arptables /usr/sbin/arptables-nft # update-alternatives --set ebtables /usr/sbin/ebtables-nft |
解决
切换成 iptables-legacy
1 2 3 4 | update-alternatives --set iptables /usr/sbin/iptables-legacy update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy update-alternatives --set arptables /usr/sbin/arptables-legacy update-alternatives --set ebtables /usr/sbin/ebtables-legacy |
验证
1 2 3 4 5 6 7 8 9 10 | iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination |
封装脚本
iptables-wrapper
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #!/bin/sh set -e num_legacy_lines=$( (iptables-legacy-save || true; ip6tables-legacy-save || true) 2>/dev/null | grep '^-' | wc -l) if [ "${num_legacy_lines}" -ge 10 ]; then mode=legacy else num_nft_lines=$( (timeout 5 sh -c "iptables-nft-save; ip6tables-nft-save" || true) 2>/dev/null | grep '^-' | wc -l) if [ "${num_legacy_lines}" -ge "${num_nft_lines}" ]; then mode=legacy else mode=nft fi fi update-alternatives --set iptables "/usr/sbin/iptables-${mode}" > /dev/null update-alternatives --set ip6tables "/usr/sbin/ip6tables-${mode}" > /dev/null exec "$0" "$@" |
优先iptables-legacy
1 2 3 4 5 6 7 8 | update-alternatives \ --install /usr/sbin/iptables iptables /usr/sbin/iptables-wrapper 100 \ --slave /usr/sbin/iptables-restore iptables-restore /usr/sbin/iptables-wrapper \ --slave /usr/sbin/iptables-save iptables-save /usr/sbin/iptables-wrapper update-alternatives \ --install /usr/sbin/ip6tables ip6tables /usr/sbin/iptables-wrapper 100 \ --slave /usr/sbin/ip6tables-restore ip6tables-restore /usr/sbin/iptables-wrapper \ --slave /usr/sbin/ip6tables-save ip6tables-save /usr/sbin/iptables-wrapper |