現在、CentOS 6.8の最小インストールにiptablesファイアウォールをインストールして起動するAnsibleプレイブックを作成しています。私はAnsibleで次のことをしています。
### sets up FW pkgs
- name: Install FW packages
hosts: elasticsearch-servers
become: yes
tasks:
- name: install ipset
yum: name={{ item }} state=present
with_items:
- ipset
- iptables
- name: start iptables service
service: name=iptables state=started enabled=yes
しかし、結果は次のようになります。
TASK [start iptables service] **************************************************
fatal: [10.40.3.246]: FAILED! => {"changed": false, "failed": true, "msg": "iptables: No config file.[WARNING]\r\n"}
fatal: [10.40.3.254]: FAILED! => {"changed": false, "failed": true, "msg": "iptables: No config file.[WARNING]\r\n"}
fatal: [10.40.3.164]: FAILED! => {"changed": false, "failed": true, "msg": "iptables: No config file.[WARNING]\r\n"}
答え1
だからCentOS 6.5以降から問題になるようです。以下のカスタマーポータルテーマがあります。Red Hat Enterprise Linux 6.6 以降の最小インストールでは iptables が起動しません。。
即時の問題は、/etc/sysconfig/ip*
iptablesサービスを開始するために必要なファイルが欠落していることです。を実行してこれらのファイルを強制的に生成できますが、デフォルトでは実行するにはservice iptables save
カーネルモジュールが必要なため、このファイルも失敗しますservice iptables save
。
Catch-22に少し似ています!
この問題を解決する最も簡単な方法は、次の2つのカーネルモジュールをロードして起動することです。
- iptables_フィルタ
- IP_テーブル
iptables
次のコマンドを実行して:
$ iptables -L -n
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
これでモジュールがロードされていることがわかります。
$ lsmod | grep iptable
iptable_filter 2793 0
ip_tables 17831 1 iptable_filter
service iptables save
その後、欠落しているファイルを生成するためにaを実行してiptablesサービスを開始できます。
アンシプール
command:
上記は興味深いですが、モジュールの助けを借りずにAnsibleを介して実行することはあまり馴染みませんshell:
。
ただし、modules:
Ansibleのモジュールを使用してカーネルモジュールのロード/アンロードを保証できます。
たとえば、
### sets up FW pkgs
- name: Install FW packages
hosts: elasticsearch-servers
become: yes
tasks:
- name: install ipset
yum: name={{ item }} state=present
with_items:
- ipset
- iptables
# these next 2 tasks work around issue with iptables RPM in CentOS 6.5+
# REF: https://access.redhat.com/solutions/1361093
- name: load ip_tables kernel module
modprobe: name=iptable_filter state=present
- name: initial save iptables generate files
command: /sbin/service iptables save
args:
warn: false
- name: start iptables service
service: name=iptables state=started enabled=yes
上記では、保存を試みる前にiptable_filterが存在することを確認しました。