サーバーをchefでプロビジョニングするため、Ubuntu 16.04と18.04のバージョンで同じ設定を使用します。そして、iptablesルールを復元するための同じルールがありますcat /etc/network/if-pre-up.d/iptables_load /sbin/iptables-restore < /etc/iptables/general
ですが、Ubuntu 18.04では機能しません。
手動で実行すると機能します。起動時にこのスクリプトが実行されていないということですか?
[〜#〜]更新[〜#〜]
説明されているようにsystemdサービスを作成しました here で問題なく動作します。
[Unit]
Description = Apply iptables rules
[Service]
Type=oneshot
ExecStart=/etc/network/if-pre-up.d/iptables_load
[Install]
WantedBy=network-pre.target
これが私がしたことです:
次のようなサービステンプレートを作成します。
Sudo nano /etc/systemd/system/restore-iptables-rules.service
これをコピーして貼り付けます:
[Unit]
Description = Apply iptables rules
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'iptables-restore < /etc/iptables.rules'
[Install]
WantedBy=network-pre.target
次のようにサービスを有効にします。
Sudo systemctl enable restore-iptables-rules.service
再起動して、ルールが適用されていることを確認します。
Sudo iptables -L
If-upの場所でトリガーされるiptablesでさまざまな問題に遭遇しました。私のiptablesスクリプトがさらに複雑になるにつれて、ホスト名解決などが機能する場合に正しいネットワークインターフェイスを起動する必要があるのと同様に、スクリプトの正確な場所によってはスクリプトが実行される可能性があるという問題が問題になりました。これらの要因により、起動が遅くなり、障害が発生していました。 iptablesスクリプトをsystemdサービスとして実行するという代替案を検討できます。
これは、たとえば/ etc/systemd/system /にreal_iptables.serviceというファイルを作成して、次のような内容で行うことができます。
[Unit]
Description=Set up the firewall
After=network.target
[Service]
Type=oneshot
ExecStart=/root/iptables
[Install]
WantedBy=multi-user.target
実際のiptablesスクリプトは、ご覧のとおり、/ root/iptablesにあります。次の方法でサービスをインストールします。
systemctl enable real_iptables
systemctl start real_iptables
サービスを有効にすると、サービスは起動時に開始されますが、実行されるのは1回だけです。完全に安全にしたい場合は、iptablesを使用してすべてのネットワーク通信をブロックするスクリプトを/etc/network/if-up.d/に置くことができます。つまり、サービスが開始されるまで何も起こりません。