○ iptablesのインストール 4 Xen

・xenのファイアウォール (iptables) の設定をします
・iptables-1.6.1をソースからインストールし、設定します
・xend,xendomainsの起動の前に設定します
・ドメイン0の設定です
・コマンドが統合され、xtables-multiが大元になっています
・make はメンテナンスマシンで行っています

・ソースの取得、削除は省略します
・エディタ、ファイラーの操作は省略します
・ソースを展開したら説明文を読みましょう
・Enterキーを省略します

・ログイン端末で "#" はroot、"$" は一般ユーザのプロンプトの記号です
・設定ファイルで "#" で始まる行はコメントとして解釈されます

○関連サイト

:iptables-1.6.1.tar.bz2  (http://www.netfilter.org/)
:snapshot (ftp://ftp.netfilter.org/pub/iptables/)

○参照ファイル

パッケージの追加
最初の設定 (Xen)

○インストール環境

:OS CentOS 6.8
:kernel linux-2.6.32.43-xs1.6.10xen
:selinux disabled
:インストール先 
:作業 ~/src
:言語 LANG=en_US.UTF-8
:ユーザー rootで実行

・メンテナンスの場合は一般ユーザから行います



○iptables-1.6.1

○iptablesのインストール

・iptablesパッケージは依存性があるので、そのまま残します
・nftables supportにはlibnftnl,libmnlが必要です

# cd ~/src
[root@earth:~/src]
# tar jxvf iptables-1.6.1.tar.bz2
# chown -R root:root iptables-1.6.1
# cd iptables-1.6.1
[root@earth:~/src/iptables-1.6.1]
# make distclean

・CFLAGS="-O2 -march=i686 -mtune=atom" (CPU最適化オプション)
・CPPFLAGS="-O2 -march=i686 -mtune=atom" (CPU最適化オプション)
・該当しない場合は指定しない

# ./configure CFLAGS="-O2 -march=i686 -mtune=atom" \
CPPFLAGS="-O2 -march=i686 -mtune=atom" \
--enable-devel --enable-libipq --disable-nftables

Iptables Configuration:
  IPv4 support:				yes
  IPv6 support:				yes
  Devel support:			yes
  IPQ support:				yes
  Large file support:			yes
  BPF utils support:			no
  nfsynproxy util support:		no
  nftables support:			no
  
Build parameters:
  Put plugins into executable (static):	no
  Support plugins via dlopen (shared):	yes
  Installation prefix (--prefix):	/usr/local
  Xtables extension directory:		/usr/local/lib/xtables
  Pkg-config directory:			/usr/local/lib/pkgconfig
  Host:					i686-pc-linux-gnu
  GCC binary:				gcc

Iptables modules that will not be built:  connlabel

・コンパイル

# make

・インストール (アップデートは別項参照)

# make install

# cd ..
[root@earth:~/src/src]
# tar jcvf iptables-1.6.1-170129.tar.bz2 iptables-1.6.1/

○iptablesのアップデート

・新規インストールの場合は、次項へ進みます
・ソースの展開・コンパイルの表記は略します

・iptablesルールの保存

# service iptables save

・アップデート

# cd ~/src/iptables-1.6.1
[root@earth:~/src/iptables-1.6.1]
# make install

・キャッシュ情報の更新と確認

# ldconfig
# ldconfig -p | grep -e libip -e libxtable

・iptablesルールの再設定

# service iptables restart

・バックアップファイルの修正

# vi /etc/sysconfig/iptables

○キャッシュ情報の更新と確認

・/usr/local/libの設定がされているなら、ldconfigのみ実行します
・動的ライブラリが libxtables.so.11 になっています

# cd ~
[root@earth:~]
# echo /usr/local/lib >> /etc/ld.so.conf.d/usrlocal.conf
# ldconfig
# ldconfig -p | grep -e libip -e libxtable

○/sbinのリンクファイルの調整

・iptables-1.6.1ではxtables-multiがコマンドの大元になります
・CentOS 6.7ではalternativeで制御する構成になっています

# cd /etc/alternatives
[root@venus:/etc/alternatives]
# mv sbin-ip6tables-multi.i386 sbin-ip6tables-multi.i386.ORIG
# mv sbin-iptables-multi.i386 sbin-iptables-multi.i386.ORIG
# ln -s /usr/local/sbin/xtables-multi sbin-ip6tables-multi.i386
# ln -s /usr/local/sbin/xtables-multi sbin-iptables-multi.i386



○iptablesの設定 (rpmパッケージの起動スクリプトを使う)

○physdevサポートの確認

# iptables -m physdev --help
iptables v1.6.1

・省略

physdev match options:
 [!] --physdev-in inputname[+]          bridge port name ([+] for wildcard)
 [!] --physdev-out outputname[+]        bridge port name ([+] for wildcard)
 [!] --physdev-is-in                    arrived on a bridge device
 [!] --physdev-is-out                   will leave on a bridge device
 [!] --physdev-is-bridged               it's a bridged packet

○xen-firewallの実行と確認

xen-firewall (詳細別記)

・適当なディレクトリでxen-firewallスクリプトを実行します

# cd ~
[root@earth:~]
# source xen-firewall

・iptablesのチェック

# service iptables status

○設定の保存

[root@earth:~]
# service iptables save

・/etc/sysconfig/iptablesファイルとして保存されます


○/etc/sysconfig/iptables-configの修正

・自動でロードされないモデュールを既述します

IPTABLES_MODULES="ip_conntrack_ftp ip_nat_ftp"
IPTABLES_SYSCTL_LOAD_LIST=".nf_conntrack .bridge-nf"

○iptablesスクリプトの実行

[root@earth:~]
# service iptables start
# chkconfig --add iptables

○カーネルパラメータの設定

・/usr/sbin/xendがブリッジデバイスを作るまでカーネルパラメータは設定できません
・"xend start"時にsysctlで設定値を変更し、ブリッジデバイスのフィルタリングをします
・"xend stop"時にsysctlで設定値を変更し、ブリッジデバイスのフィルタリングを解除します
・上手く行かない場合は、ブリッジ上のiptablesを無効化しましょう(何もしない)

:/etc/rc.d/init.d/xend起動スクリプトの修正

・省略

case "$1" in
  start)
	if [ -z "`ps -C xenconsoled -o pid=`" ]; then
		echo "xencommons should be started first."
		exit 1
	fi
	# mkdir shouldn't be needed as most distros have \
	# this already created. Default to using subsys.
	# See docs/misc/distro_mapping.txt
	mkdir -p /var/lock
	if [ -d /var/lock/subsys ] ; then
		touch /var/lock/subsys/xend
	else
		touch /var/lock/xend
	fi
	xend start
	await_daemons_up
	sysctl -w net.bridge.bridge-nf-call-iptables=1
	;;
  stop)
	xend stop
	rm -f /var/lock/subsys/xend /var/lock/xend
	sysctl -w net.bridge.bridge-nf-call-iptables=0
	;;

・省略




○サーバ起動時のfirewall設定の流れ

iptables起動スクリプトの実行
/etc/sysconfig/iptables,iptables-configが読込まれる

 ↓

xend起動スクリプトの実行
/usr/sbin/xend (pythonスクリプト) が実行され
ブリッジデバイスが作られます

 ↓

xendomains起動スクリプトの実行
/etc/xen/scripts/vif-bridgeが実行され、
vif-common.shを読み込んで、新しいPHYSDEVチェーンが追加される

○vif-common.sh

・vif-bridgeスクリプトで読み込まれます

:/etc/xen/scripts/vif-common.sh

・省略

frob_iptable()
{
  if [ "$command" == "online" ]
  then
    local c="-I"
  else
    local c="-D"
  fi
  iptables "$c" FORWARD -m physdev --physdev-is-bridged --physdev-in "$dev" \
    "$@" -j ACCEPT 2>/dev/null &&
  iptables "$c" FORWARD -m physdev --physdev-is-bridged --physdev-out "$dev" \
    -j ACCEPT 2>/dev/null

  if [ "$command" == "online" -a $? -ne 0 ]
  then
    log err "iptables setup failed. This may affect guest networking."
  fi
}

・省略


○bridge接続の確認

・xxxxxxxxxxxxの部分にはMACアドレスが入ります

[root@earth:~]
# brctl show
bridge name    bridge id            STP enabled     interfaces
eth0           8000.xxxxxxxxxxxx    no              vif2.0
                                                    vif1.0
                                                    peth0

○xendomains起動後のiptablesルール

紫色部分 xendomainsの起動で追加された部分
・"service iptables restart"を実行する場合は、"service iptables save"で現況を保存し、
・restart後、手動で/etc/sysconfig/iptables (xendomainsで追加された部分) を修正し、
・サーバ起動時の状態に戻しておく

# # Generated by iptables-save v1.6.1 on Sun Jan 29 16:33:46 2017
*filter
:INPUT DROP [432:140805]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [1294:141596]
-A INPUT -i lo -j ACCEPT
-A INPUT -s 192.168.0.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.0.0/24 -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -p tcp -m conntrack --ctstate NEW -m tcp --dport 922 -j ACCEPT
-A INPUT -s 192.168.0.21/32 -p tcp -m conntrack --ctstate NEW -m tcp --sport 25 -j ACCEPT
-A INPUT -s 192.168.0.1/32 -p tcp -m conntrack --ctstate NEW -m tcp --dport 3551 -j ACCEPT
-A FORWARD -m physdev --physdev-out vif2.0 --physdev-is-bridged -j ACCEPT
-A FORWARD -m physdev --physdev-in vif2.0 --physdev-is-bridged -j ACCEPT
-A FORWARD -m physdev --physdev-out vif1.0 --physdev-is-bridged -j ACCEPT
-A FORWARD -m physdev --physdev-in vif1.0 --physdev-is-bridged -j ACCEPT
-A FORWARD -m physdev --physdev-in peth0 -j ACCEPT
COMMIT
# Completed on Sun Jan 29 16:33:46 2017
# Generated by iptables-save v1.6.1 on Sun Jan 29 16:33:46 2017
*nat
:PREROUTING ACCEPT [117:13163]
:POSTROUTING ACCEPT [191:17859]
:OUTPUT ACCEPT [75:4756]
COMMIT
# Completed on Sun Jan 29 16:33:46 2017



○開発版のインストール(参考)

・snapshotをダウンロードしてインストールします

○iptablesのインストール

# cd ~/src
[root@venus:~/src]
# tar jxf iptables-20170129.tar.bz2
# cd iptables-20170129
[root@venus:~/src/iptables-20160530]
# ./autogen.sh
# ./configure CFLAGS="-O2 -march=i686 -mtune=atom" \
CPPFLAGS="-O2 -march=i686 -mtune=atom" \
--enable-devel --enable-libipq --disable-nftables
# make
# make install

○ Copyright(c) 528p.com All Rights Reserved.