CentOS 7 방화벽 서버 구축 ( firewalld )

2016.12.08 20:13

gooddew 조회:1506


01.png



------------------------------------------------------------------------------------------------------------------------

                                                                    firewalld 이용해서 방화벽 서버 구축하기 

------------------------------------------------------------------------------------------------------------------------


☞ 방화벽의 경우 두개의 랜카드가 필요합니다.


한개는 외부망과 연결된 랜카드 이고 ip 는 공인 ip 로 설정이 되며, 두번째는 랜카드는 내부망과 연결되고 ip 는 사설 ip 로 설정을 합니다.



☞ 서버 설치 조건


- 외부망 이더넷 eno1 → IP : 192.168.0.1 ( 사설 IP 이지만 공인 IP 라고 가정 하고 강좌를 진행합니다. )


- 내부망 이더넷 enp2s0 → IP : 172.16.0.1


- WEB SERVER IP : 172.16.0.2


- 내부 네트워크는 C 클래스 한개의 규모입니다.


- 외부망은 공인 IP 로 설정하고 내부망은 사설 IP 로 설정을 합니다.





① 기본 포워딩 설정


두개의 포워딩 관련 설정 파일을 수정 해야 됩니다.


/etc/sysctl.conf 설정 파일을 편집기로 열어서 제일 하단에 net.ipv4.ip_forward = 1 문장을 추가 하면 되는데


간단하게 명령어로 파일을 열지 않고 수정이 가능합니다.


34.png


# echo "net.ipv4.ip_forward = 1"  >> /etc/sysctl.conf


☞  파일이 수정 됬는지 확인합니다.


# cat /etc/sysctl.conf


☞ cat /etc/sysctl.conf 으로 확인해서 " net.ipv4.ip_forward = 1 " 출력 되면 정상입니다.




☞ 두번째 파일은 /proc/sys/net/ipv4/ip_forward 입니다.


 이것도 간단히 명령어로 파일을 수정하겠습니다.


11.png


# echo 1 > /proc/sys/net/ipv4/ip_forward



☞ 수정 상태 확인


# cat /proc/sys/net/ipv4/ip_forward


숫자 " 1 " 만 나오면 정상 수정된것 입니다.





② 랜 카드 설정


☞ 현재의 ip 설정 상태 확인


# ip a


35.png



☞ 랜카드가 두개가 있고, 외부망과 연결된 이더넷은 eno1 이고 ip 는 192.168.0.1 입니다.


내부망과 연결된 이더넷은 이름은 enp2s0 이고, 아직 ip 설정이 안되어 있는 상태입니다.




☞ 내부망 이더넷 랜카드의 ip 를 설정을 하겠습니다.


만약 nano 편집기가 설치 안되었으면 설치합니다.


# yum -y install nano


# nano /etc/sysconfig/network-scripts/ifcfg-enp2s0


36.png


→ dhcp 를 none 로 변경


→ DEFROUTE = yes  줄을 삭제합니다. 시스템의 설정된 라우팅을 사용한다는 의미인데 내부망 랜카드 에서는 사용하지 않습니다. 


☞ 페이지 제일 하단에 내부망 이더넷의 IP 와 서브넷 마스크를 설정합니다.


→ IPADDR=172.16.0.1  


→ NETMASK=255.255.255.0 




☞ 설정 파일 저장후 네트워크 서비스 재시작


# systemctl restart network


05.png



☞ ip 상태 확인


# ip a


37.png



☞ 내부망의 랜카드가 활성화가 되었고 IP 가 할당이 되어 있습니다.



③ 방화벽 패키지 설치하기


24.png


# yum -y install firewalld



④ 방화벽 서비스 가동하기


25.png


☞ 방화벽 서비스 가동

# systemctl restart firewalld


☞ 방화벽 서비스 상시 가동
# systemctl enable firewalld


☞ 방화벽 서비스 상태 확인
# systemctl status firewalld





⑤ 외부망에 연결된 이더넷에 MASQUERADE 활성하기


55.png



# firewall-cmd --direct --permanent --add-rule ipv4 nat POSTROUTING 0 -o eno1 -j MASQUERADE


☞ 현재 외부망과 연결된 이더넷 이름은 eno1 이고 MASQUERADE 기능을 활성화 시킵니다.



⑥ 방화벽 포워딩 설정


56.png



☞ 내부망 ( enp2s0 ) 에서 외부망 ( eno1 ) 으로 나가는 경우 제한이 없으며


    외부망 ( eno1 ) 에서 내부망 ( enp2s0 ) 으로 들어오는것은 기존 접속기록이 있거나 관련된 경우에만 허용된다는 의미입니다.


# firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i enp2s0 -o eno1 -j ACCEPT

 

# firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i eno1 -o enp2s0 -m state --state RELATED,ESTABLISHED -j ACCEPT


# firewall-cmd --reload


여기까지만 하면 서버가 NAT 라우터 기능으로써 내부망 사용자는 인터넷이 가능합니다.


내부망에 웹서버와 같은 외부망에 서비스를 제공하지 않으면 여기까지만 진행해도 됩니다.




⑦ 외부망에서 내부망 웹서버로 연결 설정


60.png


☞ 외부망을 위한 zone 이름을 external 정의 하고, 인터페이스 이름을 eno1 이더넷으로 연결 합니다.


--permanent 옵션은 재부팅후 자동 시작 옵셥입니다


# firewall-cmd --zone=external --add-interface=eno1 --permanent




☞ 내부망을 위한 zone 이름을 public 정의 하고, 인터페이스 이름을 enp2s0 이더넷으로 연결 합니다.


# firewall-cmd --zone=public --add-interface=enp2s0 --permanent




☞ 설정간에 The interface is under control of NetworkManager, setting zone to 'external'. 이런 오류가 나오면


NetworkManager 서비스를 중단합니다.


59.png


# systemctl stop NetworkManager





☞ 외부망에서 80 번 포트를요청하는 사용자는 내부망의 172.16.0.2 의 서버로 포워딩 합니다.


61.png


# firewall-cmd --permanent --zone=external --add-forward-port=port=80:proto=tcp:toaddr=172.16.0.2




☞ 설정  적용


62.png


# firewall-cmd --reload




☞ external zone의 설정 상태를 확인 할수 있습니다.


63.png


# firewall-cmd --zone=external --list-all



☞ 설정이 정상적으로 되어 있어도 웹서버로 바로 접속이 안될수 있기 때문에 서버를 재부팅을 합니다.






⑧ 방화벽 보안 설정


☞ 방화벽으로 외부의 공격에 대비해서 원격 접속을 제한하는 보안 설정을 해야 됩니다.


보안기준으로 따지면 가장 좋은 방법은 모든 원격을 차단하는것이지만 서버 관리자 입장에서는 윈격 접속이 필요한 경우가 있습니다.


원격 접속을 제한적으로 허용하는 방법을 알아 보겠습니다.




☞  방화벽 설정 파일 public.xml 과 external.xml  파일을 수정하게 됩니다.


설정 파일 경로로 이동합니다.


# cd /etc/firewalld/zones/



☞ 내부망에서 방화벽 서버에 원격 접속 허용 설정


public.xml 파일을 수정 해야 되는데 파일이 없다면 # firewall-cmd --zone=public --add-interface=enp2s0 --permanent 실행하면 생성 됩니다.


# nano public.xml


52.png


 <service name="ssh"/> 줄을 삭제


 제일 마지막에 </zone> 바로 위에 아래 내용 추가


  <rule family="ipv4">
    <source address="172.16.0.0/24"/>
    <port protocol="tcp" port="22"/>
    <accept/>
  </rule>



☞ 설정 파일을 저장합니다.


위 그림에서 변경한 설정은 내부망 네트워크 중 172.16.0.0/24 에서 방화벽 서버로 원격 접속을 허용한다는 의미입니다.


네트워크 환경에 맞게 위 설정 파일에서 ip 대역을 변경해서 사용하시면 됩니다.




☞ 외부망에서 방화벽 서버에 원격 접속 허용 설정


external.xml 파일을 수정 해야 되는데 파일이 없다면 # firewall-cmd --zone=external --add-interface=eno1 --permanent 실행하면 생성 됩니다.


# nano external.xml


53.png


<service name="ssh"/> 줄 삭제


 제일 하단의 </zone> 의 바로 위에 아래 내용 추가


  <rule family="ipv4">
    <source address="192.168.0.0/24"/>
    <port protocol="tcp" port="22"/>
    <accept/>
  </rule>



☞ 설정 파일을 저장합니다.


위 그림에서 변경한 설정은 외부망 네트워크 중 192.168.0.0/24 에서 방화벽 서버로 원격 접속을 허용한다는 의미입니다.


네트워크 환경에 맞게 위 설정 파일에서 ip 대역을 변경해서 사용하시면 됩니다.




☞ 변경한 설정 파일 서버에 적용하기


# firewall-cmd --reload



만약 원격 접속을 모두 차단한다면 위에서 수정한 두개의 파일에서 <service name="ssh"/> 이 줄을 지우고


# firewall-cmd --reload 실행 하시면 됩니다.




이렇게 해서 모든 작업이 끝났습니다.  




⑨ 이슈 / 버그


☞ 시스템에 따라서 firewalld 경우 재부팅 하면 zone 설정이 한쪽 이더넷이 모두 연결되는 경우가 간혹 있습니다.


47.png


원래는 public zone 은 eno1 하나만 연결되고 external zone 은 enp2s0 가 연결되야 정상인데


위 그림은 부팅후에 public zone 으로 두개의 이더넷(eno1 , enp2s0 )이 모두 연결된 상태입니다.


이 경우 external zone 설정을 enp2s0 이더넷 설정 파일에 안에 ZONE=external 이 값을 추가하거나 수정후 재부팅하면 해결 됩니다.


27.png


만약에 enp2s0 이더넷 설정 파일 안에 ZONE 설정값이 public 로 이미 정의되어 있으면 external 로 변경하면 되고 


ZONE 설정값이 없으면 제일 하단에 " ZONE=external " 을 추가하세요




각각의 모든 이더넷 설정 파일을 ZONE 값을 수정(추가) 해도 됩니다.


/etc/sysconfig/network-scripts/ifcfg-eno1 열어서


ZONE=external 을 추가 합니다.


/etc/sysconfig/network-scripts/ifcfg-ens2s0 열어서


ZONE=public 을 추가 합니다.


수정후 재부팅을 해야 됩니다.