본문 바로가기

iptables

ipset

source: https://wiki.archlinux.org/title/Ipset

관련 글: Ubuntu ufw & iptables & nftables

 

필자는 ipset에 추가된 IP address를 허용해 주는 iptables 룰을 설정해 이용하고 있습니다. 동일한 룰에 의해 차단하거나 허용해야 하는 대상이 많은데 그것을 하나하나 룰에 등록하는 것은 노력도 많이 들지만, 패켓 처리 성능도 크게 떨어집니다. ipset을 이용할 경우 많은 대상을 실시간에 등록할 수 있으며, iptables에 의한 패켓 처리 성능도 저하되지 않습니다. 

 

마찬가지로 nftables에서도 set structure를 이용할 경우 성능저하를 피할 수 있습니다. 

 

설치하기

salsal@r3:~$ sudo apt policy ipset
[sudo] password for salsal:
ipset:
  Installed: (none)
  Candidate: 6.34-1
  Version table:
     6.34-1 500
        500 http://kr.archive.ubuntu.com/ubuntu bionic/main amd64 Packages
salsal@r3:~$ sudo apt install ipset

설치후 ipset 목록 확인하기

salsal@r3:~$ sudo ipset list

ipset 이름 생성하기

salsal@r3:~$ sudo ipset create internal_systems hash:ip
salsal@r3:~$ sudo ipset create internal_networks hash:net
salsal@r3:~$ sudo ipset create external_networks hash:net
salsal@r3:~$ sudo ipset create external_systems hash:ip

ipset에 멤버 추가하고 확인하기

salsal@r3:~$ sudo ipset add internal_systems 192.168.3.11
salsal@r3:~$ sudo ipset add internal_systems 192.168.3.12
salsal@r3:~$ sudo ipset add internal_systems 192.168.3.13
salsal@r3:~$ sudo ipset add internal_networks 192.168.3.0/24
salsal@r3:~$ sudo ipset add external_networks 192.168.23.0/24
salsal@r3:~$ sudo ipset list internal_systems
Name: internal_systems
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 344
References: 0
Number of entries: 3
Members:
192.168.3.11
192.168.3.12
192.168.3.13
salsal@r3:~$ sudo ipset list external_systems
Name: external_systems
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 200
References: 0
Number of entries: 0
Members:
salsal@r3:~$ sudo ipset list external_networks
Name: external_networks
Type: hash:net
Revision: 6
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 512
References: 0
Number of entries: 1
Members:
192.168.23.0/24
salsal@r3:~$ sudo ipset list internal_networks
Name: internal_networks
Type: hash:net
Revision: 6
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 512
References: 0
Number of entries: 1
Members:
192.168.3.0/24
salsal@r3:~$

internal_systems에 있는 멤버만 r3로 ssh 하는 것 허용하기

salsal@r3:~$ sudo iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-A INPUT -p tcp -m set --match-set internal_systems src -m tcp --dport 22 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT

이 상태에서는 ipset internal_systems에 포함된 멤버 192.168.3.11, 192.168.3.12, 192.168.3.13만 r3에 ssh할 수 있습니다. 

 

편리한 사항은 192.168.3.14를 ipset internal_systems에 추가하면 iptables 룰을 변경하지 않고도 ssh 를 가능하게 하는 것입니다. 

salsal@r3:~$ sudo ipset add internal_systems 192.168.3.14

salsal@r3:~$ sudo ipset list internal_systems
Name: internal_systems
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 392
References: 1
Number of entries: 4
Members:
192.168.3.11
192.168.3.12
192.168.3.13
192.168.3.14

 

* 참고적으로 ipset을 리부팅에 대비하여 저장할 수 있는 tool이 ipset-persitent인데 이것은 Ubuntu 20.04 부터 이용할 수 있는 것으로 보입니다. 

 

 

관련 글: Ubuntu ufw & iptables & nftables

 

'iptables' 카테고리의 다른 글

Ubuntu에서 iptables을 이용한 NAT  (0) 2021.08.11
Ubuntu iptables 저장, 리부팅 뒤 자동 복구  (0) 2021.08.01
Ubuntu ufw & iptables & nftables  (0) 2021.07.31