欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

iptables Segmentation fault

程序员文章站 2022-07-15 17:04:49
...

现象

执行iptables 命令出错

iptables -L
segmentation fault xxxxxx

原因

iptables 版本和内核不兼容,一般出现在新版的linux系统和Docker容器上,或者升级iptables问题。

新版版本包括:Ubuntu18和Debian10

说明

新版Debian和Ubuntu默认是 iptables-nft 

# 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

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

验证

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

#!/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" "[email protected]"

优先iptables-legacy

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