리눅스 방화벽 iptables 확인 - linugseu banghwabyeog iptables hwag-in

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

테스트 서버 방화벽은 분명 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

방화벽설정

서버 보안을 위해서 방화벽을 설정한다.

우분투 서버는 ufw라는 방화벽 설정방법을 제공하지만 이 ufw는 리눅스의 기본 방화벽인 iptables의 규칙을 만들어주는 역할에 불과하다. ufw를 사용하기 보다는 iptables를 직접 다루는것이 더 강력하다.

기본동작

패킷에 대한 동작은 위에서부터 차례대로 각 규칙에 대해 검사.

그 규칙과 일치하는 패킷에 대해 타겟에 지정한 ACCEPT, DROP 등을 수행.

규칙이 일치하고 작업이 수행되면 그 패킷은 해당 규칙의 결과 에따라 처리하고 체인에서 추가 규칙을 무시.

패킷이 모든 규칙과 매치되지 않다면 기본정책이 수행됨.

일반적으로 기본정책은 모든 패킷에 대해 DROP을 설정하고, 특별히 지정된 포트와 ip에 대해서는 ACCEPT 작업을 수행하게 한다.

참고

CentOs 7.X 부터는 방화벽 명령어가 Iptables에서 firewall로 변경되었다.

따라서 OS 버전을 확인하여 설정하도록 한다.

* OS 버전 확인 명령어 : $cat /etc/*release*

설치방법

$sudo apt install iptables

iptables 옵션

-P 기본 정책을 설정하는 옵션, 세가지 기본 체인 INPUT,FORWARD, OUTPUT을 모두 허용함(ACCEPT)로 초기화 한다. $sudo iptable -P INPUT ACCEPT
$sudo iptable -P FORWARD ACCEPT
$sudo iptable -P OUTPUT ACCEPT
-Z 모든 체인값을 0으로 만듬  
-F 체인규칙 모두 삭제  
-X 세가지 기본체인  INPUT,FORWARD, OUTPUT을 제외한 모든 체인 삭제  
-S iptables에 설정된 내용을 출력  
-L INPUT 체인에 규칙이 생성된 것이 확인됨  

iptables 출력

기본출력

$sudo iptables -L 

상세한 네트워크 정보까지 모두 출력

$sudo iptables -nL

룰셋의 적용 순서까지 확인

$sudo iptables -nL --line-numbers

적용된 룰셋을 통한 인입 패킷 및 bytes 출력

$sudo iptables -L -v

iptables 설정 저장

기본저장 방법

$sudo service iptables save

설정을 파일로 저장

$sudo -s

$iptables-save > /etc/iptables.rules

iptables 재시작

$sudo service iptables stop

$sudo service iptables start

체인별 설정

INPUT 체인

localhost의 인터페이스에 들어오는 모든 패킷을 허용하는 규칙을 생성.

서버의 서비스를 위해 서버의 S/W와 localhost 어댑터와의 통신은 모두 허용하는것이 일반적인 설정이다.

기본설명 기능 체인 출발지ip 목적지ip 프로토콜 포트 매칭 동작
iptables -A(추가) INPUT -s -d -p -dport -j ACCEPT
-D(삭제) OUTPUT tcp 0~65535 DROP
-I(삽입) FORWARD udp,icmp REJECT

규칙생성예

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

외부에서 모든 목적지의 tcp/80 포트로의 접근을 허용

2) iptables -A INPUT -d 111.11.11.11 -p tcp --dport 22 -j DROP

외부 모든 출발지에서 내부 111.11.11.11 목적지 서버의 tcp/80 포트로의 접근을 차단

3) iptables -A INPUT -s 111.11.11.111 -d 222.22.22.22 -p tcp --dport 53 -j DROP

111.11.11.111 출발지에서 내부 222.22.22.22 목적지 서버의 tcp/53포트로의 접근을 허용

4) iptables -I INPUT 1 -s 111.11.11.11 -p tcp --dport 2000 -j ACCEPT

INPUT 체인의 1번째 위치에 출발지 111.11.11.11에서 내부 모든 목적지의 tcp/2000을 오픈하는 규칙

5) iptables -A OUTPUT -s 111.11.11.11 -d 222.22.22.22 -p udp --dport 514 -j ACCEPT

111.11.11.11 출발지에서 222.22.22.22 로 514 udp접근을 허용