본문 바로가기

iptables

Ubuntu iptables 저장, 리부팅 뒤 자동 복구

목적

Ubuntu 18.04

 

iptablels을 설정하여 이용하다가 시스템을 리부팅하면 설정한 rule이 모두 사라지고 INPUT, FORWARD, OUTPUT default policy만 복구되어 시스템을 외부에서 접근할 수 없는 상태를 맞이할 수도 있습니다. 따라서 운영중 설정한 iptables rule을 실시간으로 저장(save)해 놓았다가 리부팅할 때 자동으로 읽어올 (load) 수 있어야 합니다. 

 

운영중인 시스템 iptables 상태

salsal@r3:~$ sudo iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.2.2/32 -d 192.168.3.2/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -d 192.168.3.2/32 -p tcp -m tcp --dport 80 -j ACCEPT
-A FORWARD -p icmp -j ACCEPT

 

위 iptables rule을 저장하지 않은 상태에서 리부팅한 시스템 iptables 상태

salsal@r3:~$ sudo iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT

요약

  • iptables-save, iptables-restore를 이용하여 rule을 저장하고 복구할 수 있습니다. 
  • iptables -F를 이용하여 rule을 flush할 수 있습니다. 
  • netfilter-persistent를 이용하여 rule을 저장하고 부팅시 자동으로 읽어오게 합니다. 
  • netfilter-persistent save를 이용하여 변경된 rule을 파일에 저장하고 부팅시 읽어오게 합니다.

iptables rule 모두 삭제

어떤 이유로 iptables rule을 모두 삭제하길 원하면 -F option을 이용합니다. 

salsal@r3:~$ sudo iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.2.2/32 -d 192.168.3.2/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -d 192.168.3.2/32 -p tcp -m tcp --dport 80 -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
salsal@r3:~$ sudo iptables -F
salsal@r3:~$ sudo iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
salsal@r3:~$

그러나 default policy는 그대로 유지하므로 

  • 시스템 Console terminal에서 모두 삭제하고 새로 설정 또는
  • -F 를 이용하기 전에 default policy를 ACCEPT로 변경

해야 합니다. 

salsal@r3:~$ sudo iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.2.2/32 -d 192.168.3.2/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -d 192.168.3.2/32 -p tcp -m tcp --dport 80 -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
salsal@r3:~$ sudo iptables -P INPUT ACCEPT
salsal@r3:~$ sudo iptables -P FORWARD ACCEPT
salsal@r3:~$ sudo iptables -F
salsal@r3:~$ sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
salsal@r3:~$

 

iptables rules 수동 저장 및 수동 복구

설정해 운영하는 iptables rule은 명령어 iptables-save을 이용해 저장하였다고 다시 읽어 복구할 수 있습니다. 복구할 때는 명령어 iptables-restore를 이용합니다.

 

아래는 설정해 운영하는 iptables rules을 보여주고, file rules.v4에 저장하는 과정입니다. 

salsal@r3:~$ sudo iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.2.2/32 -d 192.168.3.2/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -d 192.168.3.2/32 -p tcp -m tcp --dport 80 -j ACCEPT
-A FORWARD -p icmp -j ACCEPT

# rule을 파일에 저장
salsal@r3:~$ sudo iptables-save > rules.v4
salsal@r3:~$ more rules.v4 
# Generated by iptables-save v1.6.1 on Mon Aug  2 17:52:36 2021
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [16:1255]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.2.2/32 -d 192.168.3.2/32 -p tcp -m tcp --dport 22 -j ACCEP
T
-A FORWARD -d 192.168.3.2/32 -p tcp -m tcp --dport 80 -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
COMMIT
# Completed on Mon Aug  2 17:52:36 2021

아래는 iptables rules을 모두 삭제하고 저장해 놓은 파일에서 읽어 복구하는 과정입니다. 

# default policy를 ACCEPT로 수정하여 시스템에 접근 허용
salsal@r3:~$ sudo iptables -P INPUT ACCEPT
salsal@r3:~$ sudo iptables -P FORWARD ACCEPT

# rules을 모두 없앰
salsal@r3:~$ sudo iptables -F
salsal@r3:~$ sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

# 저장해 놓은 rule을 읽어옴
salsal@r3:~$ sudo iptables-restore rules.v4
salsal@r3:~$ sudo iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.2.2/32 -d 192.168.3.2/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -d 192.168.3.2/32 -p tcp -m tcp --dport 80 -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
salsal@r3:~$

netfilter-persistent를 이용한 저장 및 복구

iptables rules을 저장하고 부팅시 저장해 놓은 iptables rules을 읽어와 동작하는 package가 있습니다. iptables-persistent 입니다. iptables-persistent를 설치하면 netfilter-persistent를 함께 설치합니다. netfitler-persistent는 /etc/iptables/rules.v4 를 읽어와 load 합니다. netfilter-persistent save 라고 명령어를 입력하면 실행하고 있는 rules을 /etc/iptables/rules.v4 에 저장합니다. 따라서 운영중 rules을 수정하고 제대로 동작한다면 netfilter-persistent save를 이용하여 저장해야 합니다. 

salsal@r3:~$ sudo iptables -S
[sudo] password for salsal:
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.2.2/32 -d 192.168.3.2/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -d 192.168.3.2/32 -p tcp -m tcp --dport 80 -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
salsal@r3:~$ sudo apt policy iptables-persistent
iptables-persistent:
  Installed: (none)
  Candidate: 1.0.4+nmu2ubuntu1
  Version table:
     1.0.4+nmu2ubuntu1 500
        500 http://kr.archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages
        500 http://kr.archive.ubuntu.com/ubuntu bionic-updates/universe i386 Packages
        100 /var/lib/dpkg/status
     1.0.4+nmu2 500
        500 http://kr.archive.ubuntu.com/ubuntu bionic/universe amd64 Packages
        500 http://kr.archive.ubuntu.com/ubuntu bionic/universe i386 Packages
salsal@r3:~$ which netfilter-persistent

# iptables-persistent를 설치합니다. 
salsal@r3:~$ sudo apt install iptables-persistent
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  netfilter-persistent
The following NEW packages will be installed:
  iptables-persistent netfilter-persistent
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 12.8 kB of archives.
After this operation, 79.9 kB of additional disk space will be used.
Do you want to continue? [Y/n]
Get:1 http://kr.archive.ubuntu.com/ubuntu bionic-updates/universe amd64 netfilter-persistent all 1.0.4+nmu2ubuntu1 [6,584 B]
Get:2 http://kr.archive.ubuntu.com/ubuntu bionic-updates/universe amd64 iptables-persistent all 1.0.4+nmu2ubuntu1 [6,240 B]
Fetched 12.8 kB in 1s (10.8 kB/s)
Preconfiguring packages ...
Selecting previously unselected package netfilter-persistent.
(Reading database ... 166790 files and directories currently installed.)
Preparing to unpack .../netfilter-persistent_1.0.4+nmu2ubuntu1_all.deb ...
Unpacking netfilter-persistent (1.0.4+nmu2ubuntu1) ...
Selecting previously unselected package iptables-persistent.
Preparing to unpack .../iptables-persistent_1.0.4+nmu2ubuntu1_all.deb ...
Unpacking iptables-persistent (1.0.4+nmu2ubuntu1) ...
Setting up netfilter-persistent (1.0.4+nmu2ubuntu1) ...
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
Setting up iptables-persistent (1.0.4+nmu2ubuntu1) ...
Processing triggers for systemd (237-3ubuntu10.50) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Processing triggers for ureadahead (0.100.0-21) ...

# iptables-persistent를 설치하고 나면 /etc/iptables/rules.v4 파일이 생성된 것을 알 수 있습니다. 
salsal@r3:~$ ls -al /etc/iptables/rules.v4
-rw-r--r-- 1 root root 571  8월  2 18:37 /etc/iptables/rules.v4

# /etc/iptables/rules.v4 에 현재 실행중인 rule 이 저장되어 있습니다. 
salsal@r3:~$ cat /etc/iptables/rules.v4
# Generated by iptables-save v1.6.1 on Mon Aug  2 18:37:18 2021
*filter
:INPUT DROP [4:292]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [562:49674]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.2.2/32 -d 192.168.3.2/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -d 192.168.3.2/32 -p tcp -m tcp --dport 80 -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
COMMIT
# Completed on Mon Aug  2 18:37:18 2021

# iptables-persistent를 설치하면 netfilter-persistent를 설치하고 실행한 것을 알 수 있습니다. 
salsal@r3:~$ sudo systemctl status netfilter-persistent
● netfilter-persistent.service - netfilter persistent configuration
   Loaded: loaded (/lib/systemd/system/netfilter-persistent.service; enabled; ve
   Active: active (exited) since Mon 2021-08-02 18:37:17 KST; 1min 39s ago
 Main PID: 2783 (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 4664)
   CGroup: /system.slice/netfilter-persistent.service

 8월 02 18:37:17 r3 systemd[1]: Starting netfilter persistent configuration...
 8월 02 18:37:17 r3 netfilter-persistent[2783]: run-parts: executing /usr/share/
 8월 02 18:37:17 r3 netfilter-persistent[2783]: Warning: skipping IPv4 (no rules
 8월 02 18:37:17 r3 netfilter-persistent[2783]: run-parts: executing /usr/share/
 8월 02 18:37:17 r3 netfilter-persistent[2783]: Warning: skipping IPv6 (no rules
 8월 02 18:37:17 r3 systemd[1]: Started netfilter persistent configuration.

# 시스템이 부팅, 리부팅할 때 netfilter-persistent가 자동 수행되는 것을 알 수 있습니다. 
salsal@r3:~$ sudo systemctl is-enabled netfilter-persistent
enabled
salsal@r3:~$ dpkg -l '*-persistent'
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                      Version           Architecture      Description
+++-=========================-=================-=================-=======================================================
ii  iptables-persistent       1.0.4+nmu2ubuntu1 all               boot-time loader for netfilter rules, iptables plugin
ii  netfilter-persistent      1.0.4+nmu2ubuntu1 all               boot-time loader for netfilter configuration

이 상태에서 리부팅을 하면 부팅할 때 /etc/iptables/rules.v4 내용을 읽어와 적용하는 것을 알 수 있습니다. 

 

아래는 rules을 추가하고 netfilter-persistent를 이용하여 저장한 것을 보인 것입니다. 

# 실행중인 rules을 확인합니다. 
salsal@r3:~$ sudo iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.2.2/32 -d 192.168.3.2/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -d 192.168.3.2/32 -p tcp -m tcp --dport 80 -j ACCEPT
-A FORWARD -p icmp -j ACCEPT

# rule을 하나 추가합니다. 
salsal@r3:~$ sudo iptables -A FORWARD -p tcp --dport 443 -j ACCEPT

# 추가한 rule을 확인합니다. 
salsal@r3:~$ sudo iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.2.2/32 -d 192.168.3.2/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -d 192.168.3.2/32 -p tcp -m tcp --dport 80 -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -p tcp -m tcp --dport 443 -j ACCEPT

# save를 하지 않았으므로 /etc/iptables/rules.v4에 추가한 rule은 없는 것을 확인합니다. 
salsal@r3:~$ sudo cat /etc/iptables/rules.v4
# Generated by iptables-save v1.6.1 on Mon Aug  2 20:41:34 2021
*filter
:INPUT DROP [150:12974]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [1347:230703]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.2.2/32 -d 192.168.3.2/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -d 192.168.3.2/32 -p tcp -m tcp --dport 80 -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
COMMIT
# Completed on Mon Aug  2 20:41:34 2021

# netfilter-persistent save를 이용하여 저장합니다. 
salsal@r3:~$ sudo netfilter-persistent save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save

# /etc/iptables/rules.v4에 추가한 rule을 저장한 것을 알 수 있습니다. 
salsal@r3:~$ sudo cat /etc/iptables/rules.v4
# Generated by iptables-save v1.6.1 on Mon Aug  2 20:45:05 2021
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [125:11240]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.2.2/32 -d 192.168.3.2/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -d 192.168.3.2/32 -p tcp -m tcp --dport 80 -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -p tcp -m tcp --dport 443 -j ACCEPT
COMMIT
# Completed on Mon Aug  2 20:45:05 2021

salsal@r3:~$

 

 

 

 

'iptables' 카테고리의 다른 글

Ubuntu에서 iptables을 이용한 NAT  (0) 2021.08.11
ipset  (0) 2021.08.11
Ubuntu ufw & iptables & nftables  (0) 2021.07.31