Iptables 규칙 확인 - Iptables gyuchig hwag-in

iptables는 운영체제 딴의 방화벽을 설정하는 도구이며 알아두면 좋을 것 같아 이렇게 포스팅해봅니다.

명령어를 실행하면 부팅하더라도 자동 적용되기 때문에 후속작업이 필요없습니다.

조회 

# iptables -L 

모든 목록을 조회 가능하지만 너무 복잡해보인다. 원하는 것들을 필터링 하기 위해 옵션을 더 해보자.

iptablse -t nat -L POSTROUTING  -vn

-t 옵션 : 타입(테이블)을 넣을 수 있다.  iptables에는 여러 타입이 있다.  raw,mangle,nat,filter 있고   각 마다 체인이 있다. 등록할때 확인하고 등록하도록 하자.

-vn 옵션:  도메인으로 보이는 것을  아이피로 보이게 해준다.

형식 :iptables [테이블] [액션] [체인] [매치] [-j 타겟]

테이블

액션 : 

-A : ADD : 정책 추가 

-D : DELETE : 정책 삭제

-R : REPLACE : 정책 교체

-F : FLUSH : 모든 정책 삭제

-P : POLICY : 기본 정책을 설정

-L : LIST : 정책 나열

매치 

-p : 프로토콜 이름이나 숫자  ex) tcp, udp, 이외 이름 또는 22,80,8080

-s :  출발지 (source)

-d : 목적지 (destination)

-i :  입력 인터페이스

-o : 출력 인터페이스

--sport : 출발지 포트

--dport : 목적지 포트 

--tcp-flags :  tcp 플래그

--syn   :    sym 플래그

-j  :   규칙 ( DROP, REJECT, ACCEPT,LOG, RETURN)

-t : 처리될 테이블 (defualte: filter)

-v : 자세한 주소 출력

--line-numbers : 줄번호 출력

-m : 특정모듈  사용 

--state : 연결상태

--string : 어플리케이션 계층 데이버 바이트 순서

--command :  주석

iptables 규직을 저장/ 복원

저장

iptables-save > table.bak

복구

iptables-restore < table.bak

예제

기본정책 ACCEPT로 설정 

iptables -P INPUT ACCEPT

iptables -P OUTPUT ACCEPT

iptables -P FORWARD ACCEPT

기본정책 DROP로 설정

iptables -P INPUT DROP

iptables -P OUTPUT DROP

iptables -P FORWARD DROP

루프백 허용

iptables -A INPUT -i lo ACCECT

특정 IP허용

iptables -A  INPUT -s xxxx.xxx.xxx.xxx -j ACCEPT

특정 IP 차단

iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP

사설 IP 차단

iptables -A INPUT -s 10.0.0.0/8 -j DROP

iptables -A INPUT -s 172.16.0.0/16 -j DROP

iptables -A INPUT -s 192.168.0.0/16 -j DROP

iptables -A INPUT -s 244.0.0.0/4 -j DROP

주요 서비스 허용 ( http,ftp,mysql)

iptables -A INPUT -p tcp --dport 20 -j ACCEPT

iptables -A INPUT -p tcp --dport 21 -j ACCEPT

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -p tcp --dport 53 -j ACCEPT

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

iptables -A INPUT -p tcp --dport 3306 -j ACCEPT

뒤에 따라오는 연결은 허용

iptables -A INPUT -m state --state ESTABLESHED,RELATED -j ACCEPT

SYN 패킷이 아닌 것만 허용

iptables -A INPUT -p tcp !  --syn -m state NEW -j DROP

아... 테스트 서버 포트가 갑자기 막혀서 (누군가가 그렇게 했겠지만...) 방화벽을 찾아나섰다. 

테스트 서버 방화벽은 분명 iptabls를 사용하는 것으로 알고 있었는데 iptables 설정에는 내가 사용하는 포트가 열려있다.

그런데 왜 막힌 것인가...

https://jootc.com/p/201808031482 (방화벽 상태 확인)

http://millky.com/@origoni/post/1128 (방화벽 관리)

위 사이트에서 많은 도움을 받았다. 

먼저 iptables를 방화벽으로 사용하고 있는지를 확인했다.

1. iptables

   1-1. 실행여부 확인

         명령문 : service iptables status 또는 systemctl status iptables 

         결과 : active (exited) 실행 중인 경우

                 inactive (dead) 실행 중이지 않은 경우 

   1-2. iptables에 포트 추가

         /etc/sysconfig/iptables 파일에 포트를 추가/제거한다.

         문서를 수정한 후 다음의 순서로 명령어를 실행한다.

          service iptables reload (iptables 정책을 reload)

          service iptables save (iptables 정책을 저장)

    **service iptables save를 먼저 하면 현재 실행되고 있는 정책들이 다시 저장되어 수정한 내용이 없어진다.

       iptables 정책에 수정한 내용을 반영한 다음에 저장해야 한다.

나의 경우에는 inactive 상태였다. 그렇다면 누군가 iptables 말고 다른 방화벽을 사용하는 것이다.

도대체 누가... 인지는 알고 있으나 따지고 싶지 않으니 다른 방화벽이 실행 중인지 확인한다.

2. firewalld

   2-1. 실행여부 확인

         명령문 : firewall-cmd --state

         결과 : running 실행 중인 경우

                 not running 실행 중이지 않은 경우

         명령문 : service firewalld status 또는 systemctl status firewalld

         결과 : active (exited) 실행 중인 경우

                 inactive (dead) 실행 중이지 않은 경우

실행 중이다... 이런... 

   2-2. firewalld 에 포트 추가

         명령문 : firewall-cmd --permanent --zone=public --add-port=포트/tcp

         결과 : success

         설정한 포트가 반영되기 위해 firewalld를 재시작한다.

         명령문 : firewall-cmd --reload

         결과 : success

   2-3. firewalld 에 포트 제거

       포트를 추가하는 명령문에서 add 대신 remove를 넣어 실행하면 된다.

       명령문 : firewall-cmd --permanent --zone=public --remove-port=포트/tcp

         결과 : success

         설정한 포트가 반영되기 위해 firewalld를 재시작한다.

         명령문 : firewall-cmd --reload

         결과 : success

그리하여 나는 원하는 포트를 사용할 수 있게 되었다. 

   2-4. firewalld 로 확인

        위에 소개한 https://jootc.com/p/201808031482 (방화벽 상태 확인) 사이트에서

        firewalld에 관한 명령문을 실행해 보았다.

       1) firewalld에는 zone이라는 게 있다고 한다. default zone 확인

          명령문 : firewall-cmd --get-default-zone

          결과 : public   

         2) firewalld에서 public zone에 알려진 서비스로 규칙이 추가된 경우 확인

            명령문 : firewall-cmd --zone=public --list-services

            결과 : dhcpv6-client samba ssh    (이것은 서버마다 다른 듯)

         3) firewalld에서 public zone에 명령어로 등록된 포트 확인

            명령문 : firewall-cmd --zone=public --list-ports

            결과 : 허용된 포트들...

            모든 zone에 대한 내용을 확인하고 싶으면 --zone=public 옵션을 뺀다.

   2-5. 기타 firewalld 참고 사이트

https://oracle-base.com/articles/linux/linux-firewall-firewalld