CentOS8でlegacyなiptablesを使用する。


CentOS8ではFireWallのバックエンドがnftableに変わっているためkubernetesのCNIが正常に動作しない。
(calicoはちょっとマニュフェスト修正すれば動く)
またCentOS8ではlegacyなiptablesのコマンド(xtables-legacy-multi)が存在しない.
そのため、ソースパッケージからコンパイルしてlegacyなiptablesのインストールを行う。

※正直こんなことするより素直に別ディストリビューション(Ubuntuとか)でkubernetes動かした方がいいです。


2020/04/01
yumのrepoのファイルパスに誤記があったので修正
コンパイルに必要なパッケージをインストールに不足があったので追記G


---

# 1.dnf(yum)のソースリポジトリの有効化

CentOS8.1の場合baseurlの先が存在しないので合わせて修正も行う。


~~~
vi /etc/yum.repos.d/CentOS-Sources.repo
~~~

以下の様に変更

・変更前

~~~
[BaseOS-source]
name=CentOS-$releasever - BaseOS Sources
baseurl=http://vault.centos.org/$contentdir/$releasever/BaseOS/Source/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

#AppStream
[AppStream-source]
name=CentOS-$releasever - AppStream Sources
baseurl=http://vault.centos.org/$contentdir/$releasever/AppStream/Source/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

#additional packages that may be useful
[extras-source]
name=CentOS-$releasever - Extras Sources
baseurl=http://vault.centos.org/$contentdir/$releasever/extras/Source/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

#additional packages that extend functionality of existing packages
[centosplus-source]
name=CentOS-$releasever - Plus Sources
baseurl=http://vault.centos.org/$contentdir/$releasever/centosplus/Source/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
~~~

・変更後

~~~
[BaseOS-source]
name=CentOS-$releasever - BaseOS Sources
#baseurl=http://vault.centos.org/$contentdir/$releasever/BaseOS/Source/
baseurl=http://vault.centos.org/8.1.1911/BaseOS/Source/
gpgcheck=1
#enabled=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

#AppStream
[AppStream-source]
name=CentOS-$releasever - AppStream Sources
#baseurl=http://vault.centos.org/$contentdir/$releasever/AppStream/Source/
baseurl=http://vault.centos.org/8.1.1911/AppStream/Source/
gpgcheck=1
#enabled=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

#additional packages that may be useful
[extras-source]
name=CentOS-$releasever - Extras Sources
#baseurl=http://vault.centos.org/$contentdir/$releasever/extras/Source/
baseurl=http://vault.centos.org/8.1.1911/extras/Source/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

#additional packages that extend functionality of existing packages
[centosplus-source]
name=CentOS-$releasever - Plus Sources
baseurl=http://vault.centos.org/$contentdir/$releasever/centosplus/Source/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
~~~


# 2.dnf(yum)のPowerToolsリポジトリの有効化


~~~
vi /etc/yum.repos.d/CentOS-PowerTools.repo
~~~


以下の様に変更


・変更前


~~~
[PowerTools]
name=CentOS-$releasever - PowerTools
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=PowerTools&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/PowerTools/$basearch/os/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
~~~

・変更後


~~~
[PowerTools]
name=CentOS-$releasever - PowerTools
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=PowerTools&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/PowerTools/$basearch/os/
gpgcheck=1
#enabled=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
~~~

# 3.開発環境のインストール

~~~
dnf groupinstall "RPM Development Tools" "Development Tools"
~~~

# 4.コンパイルに必要なパッケージをインストール

~~~
dnf install libpcap-devel libselinux-devel libmnl-devel libnetfilter_conntrack-devel libnfnetlink-devel libnftnl
~~~

# 5.yum-utilsのインストール

~~~
dnf install yum-utils
~~~

# 6.libnftnlのソースパッケージをダウンロード

iptablesのrpmパッケージを作成するにはlibnftnl-develが必要であるがCentOS8には存在しないパッケージのためソースをダウンロードして、この後の手順でコンパイル、インストールを行う。
存在しない理由の詳細は一番下の参考を参照

~~~
cd ~/
yumdownloader --source libnftnl
~~~

# 7.libnftnlのrpmパッケージ作成

※ソースパッケージ名は2020/04/01時点のバージョン

~~~
cd ~/
rpm -ivh libnftnl-1.1.1-4.el8.src.rpm
cd ~/rpmbuild/SPECS/
rpmbuild -bb libnftnl.spec
~~~

# 8.libnftnl-develのインストール

~~~
rpm -ivh ~/rpmbuild/RPMS/x86_64/libnftnl-devel-1.1.1-4.el8.x86_64.rpm
~~~

# 9.iptablesのソースパッケージをダウンロード

~~~
cd ~/
yumdownloader --source iptables
~~~

# 10.iptablesのSPECファイルの修正

※ソースパッケージ名は2020/04/01時点のバージョン

~~~
cd ~/
rpm -ivh iptables-1.8.2-16.el8.src.rpm
cd ~/rpmbuild/SPECS/
vi iptables.spec
~~~

以下のように修正する。


・10行目あたり

~~~
Release: 16%{?dist}

　↓

Release: 16_include_legacy%{?dist}
~~~

・301行目あたり

~~~
# drop all legacy tools
rm -f %{buildroot}%{_sbindir}/*legacy*
rm -f %{buildroot}%{_bindir}/iptables-xml
rm -f %{buildroot}%{_mandir}/man1/iptables-xml*
rm -f %{buildroot}%{_mandir}/man8/xtables-legacy*

　↓

# drop all legacy tools
#rm -f %{buildroot}%{_sbindir}/*legacy*
#rm -f %{buildroot}%{_bindir}/iptables-xml
#rm -f %{buildroot}%{_mandir}/man1/iptables-xml*
#rm -f %{buildroot}%{_mandir}/man8/xtables-legacy*
~~~

・374～407行目あたり

~~~
%files
   :
   :
%{_libdir}/xtables/libarpt*
%{_libdir}/xtables/libebt*
%{_libdir}/xtables/libipt*
%{_libdir}/xtables/libip6t*
%{_libdir}/xtables/libxt*

　↓

%files
   :
   :
%{_libdir}/xtables/libarpt*
%{_libdir}/xtables/libebt*
%{_libdir}/xtables/libipt*
%{_libdir}/xtables/libip6t*
%{_libdir}/xtables/libxt*
%{_sbindir}/*legacy*
%{_bindir}/iptables-xml
%doc %{_mandir}/man1/iptables-xml*
%doc %{_mandir}/man8/xtables-legacy*
~~~

# 11.iptablesのrpmパッケージ作成

~~~
rpmbuild -bb iptables.spec
~~~

# 12.iptablesのパッケージ更新

~~~
rpm -Fvh ~/rpmbuild/RPMS/x86_64/iptables-*
~~~

# 13.シンボリックリンクの変更

iptablesのリンク先をxtables-nft-multiからxtables-legacy-multiに変更

~~~
ln -nfs xtables-legacy-multi /usr/sbin/iptables
~~~

# 14.確認

~~~
iptables -V
~~~

以下のようにlegacyと表示されていること

~~~
iptables v1.8.2 (legacy)
~~~

# 15.dnf(yum)によるiptablesのパッケージの自動更新抑止

~~~
vi /etc/yum.conf
~~~

以下を設定する。

~~~
exclude=iptables*
~~~

# 16.libnftnl-develの削除
CentOS8には本来存在しないパッケージのためlibnftnl-develは削除する。
※dnf(yum)による更新時に依存関係でエラーが出る可能性があるため

~~~
rpm -evh libnftnl-devel
~~~

# 参考
Does RHEL8 provides legacy iptables(xtables-legacy-multi)?
https://access.redhat.com/solutions/4377321

Bug 1711361 - libnftnl-devel package not available to install via dnf install
https://bugzilla.redhat.com/show_bug.cgi?id=1711361