iptables, firewall, nftables 중에 nftables 사용을 권장하는 것 같다.
그래서 nftables를 알아보고자 함
먼저 공식 문서 상 리눅스 커널 3.13 버전 이상이여야 한다고 한다
공식 문서를 읽어보면 iptables와의 차이점을 명시해 놓은 곳이 있는데
내용은 요약하면 이렇다.
iptables는 관리하기가 점점 빡세짐. 필드를 분리해놓을 방법이 없기 때문에,
하지만 nftables는 ipv4 ipv6 분리도 가능하고 어쩌구저쩌구
결국 테이블 관리를 통해 필요에 따라 분리 후 관리가 가능하다는 얘기인것같다
또한 문법에 대한 개선을 해서 사용하기가 더욱 좋아졌다 이런 얘기들이 있다
이건 격공하는 부분이긴한데, iptables든 firewalld든 그 도대체 --랑 -를 언제 어디서 붙여야되는지 매번 까먹어서 검색을 해야하는데 nftables는 tcpdump에서 아이디어를 얻어서 아주 좋다고 한다?? 근데 tcpdump도 - 붙긴 하는데;
공식 문서에 나와있는 내용이니 궁금하신 분들은 찾아보면 좋을듯
설치과정은 공식 문서를 찾아보는데 다른 배포판 제외하고 페도라 기준으로만 나와있는 것 같다
근데 yum 혹은 dnf로 편하게 다운받을 수 있다
RHEL 8버전 미만
# yum install nftables
or # yum install | grep nftables
RHEL 8버전 이상
# dnf repoquery nftables
or # dnf repoquery | grep nftables
기본 명령어는 nft로 시작한다
조회구문부터 보자면
어떤 테이블들이 있는지 보는 명령어는 이렇다
# nft list tables
있는 테이블을 전부 보여주는 명령어다보니 table에 s가 붙는다
그럼 반대로 하나의 테이블을 보고싶으면
# nft list table 테이블명
=> # nft list table ip filter
단일 테이블을 보는거라 table에 s가 안붙는다.
그냥 이런식으로 이해하면 좀 이해가 빠르게 되더라, 괜히 또 s가 붙니 안붙니 그렇게 헷갈릴 필요가 없는것같다
테이블을 추가하는 명령어는 이렇다
# nft (ADD) (ADDRESS FAMILES) (NAME)
man nft를 잘 읽어보다보면
TABLES
{add | create} table [family] table [ {comment comment ;} { flags 'flags ; }]
{delete | list | flush} table [family] table
list tables [family]
delete table [family] handle handle
Tables are containers for chains, sets and stateful objects. They are identified by their address family and their name. The address family must be one of ip, ip6, inet, arp,
bridge, netdev. The inet address family is a dummy family which is used to create hybrid IPv4/IPv6 tables. The meta expression nfproto keyword can be used to test which
family (ipv4 or ipv6) context the packet is being processed in. When no address family is specified, ip is used by default. The only difference between add and create is that
the former will not return an error if the specified table already exists while create will return an error.
이런 글을 볼 수 있다
먼저
이 부분을 보면 테이블을 만들 때에는
add 혹은 create를 이용해서 table 과 family 테이블명
이런 형식으로 만든다는 걸 볼 수 있다.
그럼 add, create와 table명은 알겠는데 family는 뭘까 보면
ip, ip6, inet, arp, bridge, netdev 옵션이 있고 이 중 관리할 옵션에 대해 지정을 해주면 된다고 쓰여있고 Default 값은 ip라고 한다.
inet은 ipv4와 ipv6 트래픽을 같이 컨트롤이 가능하다고 되어있다. arp까지도 알겠는데 bridge와 netdev의 정확한 개념은 뭘까 해서 찾아보고 적으려다가 내용이 너무 산으로 갈 것 같아서 따로 작성하겠다
나는 ipv4로 관리를 할거니까 이렇게 만든다.
조건은 test라는 ipv4를 관리하는 테이블을 만든다
# nft add table ip test
그리고 테이블들을 다시 조회해본다
test라는 ipv4 패밀리를 가진 테이블이 생성되었다.
좀 더 자세하게 들여다보자
무섭도록 아무것도 없다
테이블을 추가해준 후에는 chain이라는 놈을 생성해줘야한다.
실제 공식 문서인 nftables 위키를 보면 Configuring tables 다음 Configuring chains이 있는걸 볼 수 있다
순서가 왜이런지는 모르겠는데 여기 페이지에서 이런게 있다 (굳이 안읽어도 됨)
nft -i를 써보셈 ㅎㅎ
이라고 적혀있는데
나도 지금까지 이렇게 안써봐서 몰랐는디 써보니까
nft 전용 쉘로 들어가게 된다. 나오는건 quit
다시 본론으로 돌아와서 체인 생성하는 방법은 이렇다
add chain [<family>] <table_name> <chain_name> { type <type> hook <hook> [device <device>] priority <priority> ; [policy <policy> ;] [comment <comment> ;] }
얼추 보니 [ ] 부분은 생략이 가능한 것 같은데?
man nft를 다시 보자
테이블과는 다르게 rename도 가능하다
일단 체인을 생성하는게 목적이니 생성 관련한 옵션을 보자
add는 지정한 테이블에 체인을 추가하고 훅, 우선순위를 지정할 수 있다. 이런 내용이고
create는 add와 비~슷한데~~ 만약 체인이 있으면 에러를 내뿜는다~
이렇게 써있는데, 그럼 add로 했을때는 에러를 안낸다는건가? 해보자
# nft 'add chain ip test input { type filter hook input priority 0; }'
input이라는 체인을 생성하고 제일 우선순위이며 들어오는 패킷에대한 이벤트를 처리한다는 내용인데
단순히 이름을 input이라고 지정해준다고 INPUT에 대한 패킷을 처리해주지 않는다.
똑같이 다시 만들어보자
에러를 내뿜지는 않았지만 추가로 만들어지거나 하지는 않았다
그럼 create로 만들어보면 어떨까?
있다고 에러를 내뿜는다
편한걸 쓰면 좋지만 create 쓰면 더 좋을것같다.
아 그리고 위키에서 nft '명령어' 형식으로 쓰는걸 권장한다. 생각해보면 nft -i가 있는 이유를 알 것 같기도..?
어쨌든 다시 체인을 조회해보면
어딘가 조금 다른걸 볼 수 있다.
policy는 설정도 한적이 없는데 accept로 박혀있다.
위키를 읽어보면
기본 체인 정책은 accept과 drop이 있는데 accept 옆에 (default)라고 박혀있다.
정책 지정을 해주지 않으면 accept로 설정을 해버린다.
그럼 나는 블랙리스트를 관리하겠다는 말이 되고,
drop으로 설정하면 화이트리스트를 관리하겠다는 말이 된다.
룰 설정은 이렇다
위키에서는
% nft add rule filter output ip daddr 8.8.8.8 counter
해석하면 filter 테이블의 output 체인에 ip 목적지가 8.8.8.8로 가는놈을 세겠다.
counter는 옵션이라고 써있다
그럼 이제 man 에서 보자 힘들어죽겠네
에서 보려고 했으나 rule에 대한 설명이 엄청 많은데 어떻게 요약을 해야할지 몰라서 필요한것만
rule을 추가하려면 add 혹은 insert를 사용해야한다고 한다.
설명을 읽어봐도 add와 insert가 크게 차이가 없어서 그냥 짧고 편한 add를 사용하면 될 것 같다
# nft 'add rule {family} {table명} {chaing명} {옵션들}
이렇게 이루어지는데
예를 들어서
test테이블에서 input 체인에 들어오는 ip가 10.10.10.10만 허용을 하고싶다?
# nft 'add rule ip test input ip saddr 10.10.10.10 counter accept'
체인의 기본정책이 accept니 굳이 accept를 설정 안해줘도 되긴하다
그럼 만약
test 테이블에서 input 체인에 10.10.10.10이고 포트가 22번만 허용을 하고싶다면?
# nft 'add rule ip test input ip saddr 10.10.10.10 tcp dport 22 counter'
근데~~ 만약
test 테이블에서 input 체인에 들어오는 ip가 10.10.10.10이고 목적지 ip가 10.10.10.11에 대해 22번 포트만 허용하고 싶다면?
# nft 'add rule ip test input ip saddr 10.10.10.10 ip daddr 10.10.10.11 tcp dport 22 counter'
다음.. 글에서...