iconv

 

 

※ 요약

리눅스 명령어 iconv는 주어진 파일의 인코딩 방식을 변경할때 사용하는 명령어다. 

 

※ 경로

/usr/bin/iconv

 

※ 사용법

iconv -f [변경전 인코딩] -t [변경할인코딩]
ex) iconv -c -f euc-kr -t utf-8 test.txt > test-utf8.txt

 

※ 옵션

 옵션

 설명

 --from-code, -f encoding

 원본 파일의 변경 전 문자 인코딩을 지정

 --to-code, -t encoding

 변경하려는 대상의 문자 인코딩을 지정

 --list, -l

 지원하는 인코딩 목록들을 출력

 --output, -o file

 출력 내용을 표준출력 대신 지정한 파일에 저장

 --silent, -s

 경고 메시지를 출력하지 않음

 --verbose

 상태의 자세한 정보를 출력

'프로그래밍 > linux' 카테고리의 다른 글

리눅스 메모리 사용량순 프로세스 보기  (0) 2019.04.09
리눅스 패스워드 털렸는지 확인하기  (0) 2018.04.05
CentOS 방화벽 사용방법  (0) 2018.03.26
IPTABLE  (0) 2018.03.26
스태틱 라우팅 설정  (0) 2018.03.13

1 간단히 보기(ps -ef)

명령어
ps -ef --sort -rss
실행예시
[root@zetawiki ~]# ps -ef --sort -rss
UID        PID  PPID  C STIME TTY          TIME CMD
mysql     1154  1064 99 May03 ?        213287-12:54:30 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --l
apache   26245  1202  0 03:48 ?        00:00:05 /usr/sbin/httpd
apache   26247  1202  0 03:48 ?        00:00:07 /usr/sbin/httpd
... (생략)
root       741     2  0 May03 ?        00:00:00 [kmpath_handlerd]
root       768     2  0 May03 ?        00:00:00 [kjournald]

→ /usr/libexec/mysqld 프로세스가 물리 메모리를 가장 많이 점유하고 있다.

1.1 상위 10개

명령어
ps -ef --sort -rss | head -n 11

2 메모리 사용량 표시 (ps -eo)

명령어
ps -eo user,pid,ppid,rss,size,vsize,pmem,pcpu,time,cmd --sort -rss | head -n 11
실행예시
[root@zetawiki ~]# ps -eo user,pid,ppid,rss,size,vsize,pmem,pcpu,time,cmd --sort -rss | head -n 11
USER       PID  PPID   RSS    SZ    VSZ %MEM %CPU     TIME CMD
mysql     1154  1064 26116 582252 642724  4.8 6623646 213287-12:54:31 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
apache   26245  1202 24284 18320 347196  4.5  0.0 00:00:05 /usr/sbin/httpd
apache   26247  1202 23780 17824 346700  4.4  0.0 00:00:07 /usr/sbin/httpd
apache   26248  1202 23632 17048 345924  4.4  0.0 00:00:05 /usr/sbin/httpd
apache   26242  1202 23112 18080 342768  4.3  0.0 00:00:06 /usr/sbin/httpd
apache   26249  1202 23100 18076 342764  4.3  0.0 00:00:06 /usr/sbin/httpd
apache   26692  1202 23084 18084 342772  4.3  0.0 00:00:03 /usr/sbin/httpd
apache   26244  1202 22844 17828 342516  4.2  0.0 00:00:06 /usr/sbin/httpd
apache   26243  1202 22832 17828 342516  4.2  0.0 00:00:08 /usr/sbin/httpd
apache   26693  1202 22832 17820 342508  4.2  0.0 00:00:04 /usr/sbin/httpd

→ /usr/libexec/mysqld 프로세스가 물리 메모리를 가장 많이 점유하고 있으며 그 용량은 26116KB이다.

2.1 명령인수 숨기기

프로세스 수행명령어에서 인수부분을 표시하지 않으려면 cmd를 comm으로 변경하면 된다.

명령어
ps -eo user,pid,ppid,rss,size,vsize,pmem,pcpu,time,comm --sort -rss | head -n 11
실행예시
[root@zetawiki ~]# ps -eo user,pid,ppid,rss,size,vsize,pmem,pcpu,time,comm --sort -rss | head -n 11
USER       PID  PPID   RSS    SZ    VSZ %MEM %CPU     TIME COMMAND
mysql     1154  1064 26116 582252 642724  4.8 6624384 213287-12:54:31 mysqld
apache   26245  1202 24284 18320 347196  4.5  0.0 00:00:05 httpd
apache   26247  1202 23780 17824 346700  4.4  0.0 00:00:07 httpd
apache   26248  1202 23632 17048 345924  4.4  0.0 00:00:05 httpd
apache   26242  1202 23112 18080 342768  4.3  0.0 00:00:06 httpd
apache   26249  1202 23100 18076 342764  4.3  0.0 00:00:06 httpd
apache   26692  1202 23084 18084 342772  4.3  0.0 00:00:03 httpd
apache   26244  1202 22844 17828 342516  4.2  0.0 00:00:06 httpd
apache   26243  1202 22832 17828 342516  4.2  0.0 00:00:08 httpd
apache   26693  1202 22832 17820 342508  4.2  0.0 00:00:04 httpd
 

 

출처 : https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_%EB%A9%94%EB%AA%A8%EB%A6%AC_%EC%82%AC%EC%9A%A9%EB%9F%89%EC%88%9C_%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4_%EB%B3%B4%EA%B8%B0

리눅스 패스워드 털렸는지 확인하기
리눅스 로그인 성공한 아이피 목록 보기

1 방법 1: 로그인 성공한 아이피 목록 보기[편집]

명령어
cat /var/log/secure* | grep Accepted | awk '{print $9"\t"$11"\t"$14}' | sort | uniq
실행예시
[root@zetawiki ~]# cat /var/log/secure* | grep Accepted | awk '{print $9"\t"$11"\t"$14}' | sort | uniq
root	113.157.124.168	ssh2
root	135.79.246.80	ssh2
→ 113.157.124.168 과 135.79.246.80에서 ssh2 방식으로 root 로그인 성공하엿음
→ 목록에 이상한 아이피가 있다면... ㅎㄷㄷ

침입자는 주로 root 계정으로 로그인을 시도한다.[1]

2 방법 2: 아이피 grep[편집]

명령어
cat /var/log/secure* | grep Accepted | egrep -v "(아이피|아이피|아이피…)"
실행예시
[root@zetawiki ~]# cat /var/log/secure* | grep Accepted | egrep -v "(135.79.246.80|113.157.124.168)"
→ 135.79.246.80와 113.157.124.168 이외의 곳에서 패스워드를 맞춘 적이 있는지 확인해보니 없다.


출처 : https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_%ED%8C%A8%EC%8A%A4%EC%9B%8C%EB%93%9C_%ED%84%B8%EB%A0%B8%EB%8A%94%EC%A7%80_%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0

기본적으로 설치된 iptables를 사용하여 설정을 합니다.

– 기본 SSH 인 22번 포트만 허용된 상태입니다.
– 웹서비스(www)를 위해 22 설정 아래에 TCP 80 을 추가합니다.
– 웹서버에 SSL 인증서가 설치되어 https 주소로 서비스하는 경우 TCP 443 추가합니다.

 # vi /etc/sysconfig/iptables
# Firewall configuration written by system-config-securitylevel# Manual customization of this file is not recommended.
-A INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT 
-A INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp — dport 443 -j ACCEPT

COMMIT

 

방화벽을 사용하여 특정 IP 허용

-A INPUT -s ip 주소 -j ACCEPT

 

방화벽을 사용하여 특정 IP 차단

-A INPUT -s ip 주소 -j DROP

 

방화벽을 사용하여 특정 Port 허용

-A INPUT -p tcp –dport 443 -j ACCEPT

 

방화벽을 사용하여 특정 Port 차단

-A INPUT -p tcp –dport 443 -j DROP

 

방화벽을 사용하여 특정 IP와 Port 차단

-A INPUT -s 172.20.3.**-p tcp –dport 22 -j DROP

 

방화벽을 사용하여 특정 IP와 Port를 차단한 후 방어된 로그 설정

-I INPUT -s 172.20.3.** -p tcp –dport 22 -j LOG –log-prefix “[PLURA SSH Defend]”

 

아래의 내용은 [Plura서비스]에서 보여지는 로그입니다.

{“@ceelog”: {“timegenerated”:”2016-06-09T19:52:30.001446+09:00″,”programname”:”kernel”,”hostname”:”centos6″,”syslogtag”:”kernel:”,”pri”:”4″,”pri-text”:”kern.warning”,”syslogfacility”:”0″,”syslogfacility-text”:”kern”,”syslogseverity”:”4″,”syslogseverity-text”:”warning”,”msg”:”[PLURA SSH Defend]IN=eth0 OUT= MAC=08:00:27:d6:c6:1b:08:00:27:36:6b:8a:08:00 SRC=172.20.3.87 DST=172.20.3.84 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=4198 DF PROTO=TCP SPT=34381 DPT=22 WINDOW=5840 RES=0x00 SYN URGP=0“}}

 

 

방화벽 설정이 완료되면, 방화벽을 재시작해줍니다.

# /etc/init.d/iptables restart 또는 service iptables restart

 

[CentOS 7] firewall 사용방법

기본 방화벽 시스템이 변경되었습니다. 이전에는 iptables를 사용했는데 CentOS 7 에서는 ‘firewalld’라는 방화벽 시스템이 기본으로 탑재되었습니다.

  • 방화벽에는 zone(영역)이라는 것이 존재합니다. 개방된 네트워크와 연결되어 있다면 public zone(공개영역)에 있는 룰이 적용되고, 개인 네트워크에 있다면 다른 zone의 룰을 적용할 수 있습니다.
  • 우리는 서버 용도로 리눅스를 사용하기 때문에 개방된 public zone만 필요합니다. 또한 방화벽에는 public zone이 기본 zone으로 설정되어있습니다.  방화벽 설정 파일에서 변경 가능합니다.

public zone의 설정 파일

# vi /etc/firewalld/zones/public.xml

<?xml version=”1.0″ encoding=”utf-8″?>

<zone>

 <short>Public</short>

 <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>

 <service name=”dhcpv6-client”/>

 <service name=”http”/>

 <service name=”ssh”/>

 <port protocol=”tcp” port=”80″/>

 <port protocol=”tcp” port=”8080″/>

</zone>

 

 

방화벽 재시작

# firewall-cmd –reload

  • 설정 파일은 xml 형식으로 되어있으며, firewall-cmd –permanent –zone=public 명령으로 추가했던 룰들이 저장 되어있습니다. zone의 설정 파일을 변경할 경우 방화벽 재로드를 해야 반영이 됩니다.
    * ( –permanent 와 –zone앞에는 -가 2번 들어갑니다. copy&paste 할 경우 명령어가 실행되지않습니다)*
  • 참고로 설정 파일에 추가된 룰은 영구 반영됩니다. 만약 – permanent 옵션을 넣지 않으면, 일시적으로 즉시 반영됨을 의미합니다.(재부팅할 경우 zone의 설정 파일에 추가 되지않은 룰은 전부 삭제됨. )

 

포트 추가/제거

추가 # firewall-cmd –permanent –zone=public –add-port=80/tcp

제거 # firewall-cmd –permanent –zone=public –remove-port=80/tcp

재시작 # firewall-cmd –reload

 

서비스 추가/제거

추가 # firewall-cmd –permanent –zone=public –add-service=http

제거 # firewall-cmd –permanent –zone=public –remove-service=http

재시작 # firewall-cmd –reload

 

임의의 룰 추가/제거

추가 # firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=ipv4 source address= 192.168.0.4/24 service name=http accept”

제거 # firewall-cmd –permanent –zone=public –remove-service=http”rule family=ipv4 source address= 192.168.0.4/24 service name=http accept”

재시작 # firewall-cmd –reload

 

[응용] http 서비스에서 특정 ip 차단 추가 및 해제

차단 # firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=ipv4 source address= 192.168.0.4 service name=http reject”

해제 # firewall-cmd –permanent –zone=public –remove-service=http”rule family=ipv4 source address= 192.168.0.4 service name=http reject”

재시작 # firewall-cmd –reload

 

허용한 포트 목록

# firewall-cmd –list-ports

 

방화벽 상태 확인

# firewall-cmd –state

 

활성화된 zone 목록

# firewall-cmd –get-active-zones

 

현재 존재하는 서비스 목록

# firewall-cmd –get-service

 

public zone에 있는 서비스 목록

# firewall-cmd –zone=public –list-services

 

 

[CentOS 7] iptables 사용방법

현재 작동 중인 firewalld 데몬을 중지 시킨 후 재부팅시에도 올라오지 않도록 설정합니다.

# systemctl stop firewalld

# systemctl mask firewalld

 

iptables 를 설치합니다.(OS설치시 웹서버 구성으로 설치시 자동 설치됨)

# yum install iptables-services

 

iptables 서비스 데몬 재부팅시 자동 설정합니다.

# systemctl enable iptables

 

iptables 서비스 시작합니다.(시작/재시작/중지)

# systemctl start/restart/stop iptables

 

iptables 재시작합니다.

# systemctl restart iptables

[출처]

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

'프로그래밍 > linux' 카테고리의 다른 글

리눅스 메모리 사용량순 프로세스 보기  (0) 2019.04.09
리눅스 패스워드 털렸는지 확인하기  (0) 2018.04.05
IPTABLE  (0) 2018.03.26
스태틱 라우팅 설정  (0) 2018.03.13
CentOS 7 - 리눅스 방화벽 firewalld  (0) 2018.03.13

iptalbes란?

iptables란 넷필터 프로젝트에서 개발했으며 광범위한 프로토콜 상태 추적, 패킷 애플리케이션 계층검사, 속도 제한, 필터링 정책을 명시하기 위한 강력한 매커니즘을 제공한다.

서비스 등록과 시작

CentOS 6.4 Minimal에는 iptables가 설치되어 있다. ip6tables도 함께 설치되어 있는데 이는 IPv6 체계에서 사용한다.

BASH
rpm -qa | grep iptables

  iptables-1.4.7-9.el6.x86_64
  iptables-ipv6-1.4.7-9.el6.x86_64

설치되어 있지 않다면 설치

BASH
yum -y install iptables 

상태 확인

BASH
chkconfig --list

  ip6tables 0:해제  1:해제  2:해제  3:해제  4:해제  5:해제  6:해제
  iptables 0:해제  1:해제  2:해제  3:해제  4:해제  5:해제  6:해제

서비스를 시작프로그램에 등록한다.

BASH
chkconfig iptables on

서비스를 시작한다.

BASH
service iptables start

iptables의 파일위치는 /etc/sysconfig/iptables 이다.

iptables 용어

어려운 용어들은 제껴두고 간략히 사용할 부분에 대해서 설명한다.

1) 테이블(tables)

우선 iptables에는 테이블이라는 광범위한 범주가 있는데, 이 테이블은 filter, nat, mangle, raw 같은 4개의 테이블로 구성되며, 이중에서 우리에게 필요한 것은 필터링 규칙을 세우는 filter 테이블이다.

2) 체인(chain)

iptables에는 filter 테이블에 미리 정의된 세가지의 체인이 존재하는데 이는 INPUT, OUTPUT, FORWARD 이다. 이 체인들은 어떠한 네트워크 트래픽(IP 패킷)에 대하여 정해진 규칙들을 수행한다.

가령 들어오는 패킷(INPUT)에 대하여 허용(ACCEPT)할 것인지, 거부(REJECT)할 것인지, 버릴(DROP)것인지를 결정한다.

  • INPUT : 호스트 컴퓨터를 향한 모든 패킷
  • OUTPUT : 호스트 컴퓨터에서 발생하는 모든 패킷
  • FORWARD : 호스트 컴퓨터가 목적지가 아닌 모든 패킷, 즉 라우터로 사용되는 호스트 컴퓨터를 통과하는 패킷

3) 매치(match)

iptables에서 패킷을 처리할때 만족해야 하는 조건을 가리킨다. 즉, 이 조건을 만족시키는 패킷들만 규칙을 적용한다.

  • --source (-s) : 출발지 IP주소나 네트워크와의 매칭
  • --destination (-d) : 목적지 ip주소나 네트워크와의 매칭
  • --protocol (-p) : 특정 프로토콜과의 매칭
  • --in-interface (i) : 입력 인테페이스
  • --out-interface (-o) : 출력 인터페이스
  • --state : 연결 상태와의 매칭
  • --string : 애플리케이션 계층 데이터 바이트 순서와의 매칭
  • --comment : 커널 메모리 내의 규칙과 연계되는 최대 256바이트 주석
  • --syn (-y) : SYN 패킷을 허용하지 않는다.
  • --fragment (-f) : 두 번째 이후의 조각에 대해서 규칙을 명시한다.
  • --table (-t) : 처리될 테이블
  • --jump (-j) : 규칙에 맞는 패킷을 어떻게 처리할 것인가를 명시한다.
  • --match (-m) : 특정 모듈과의 매치

4) 타겟(target)

iptables는 패킷이 규칙과 일치할 때 동작을 취하는 타겟을 지원한다.

  • ACCEPT : 패킷을 받아들인다.
  • DROP : 패킷을 버린다(패킷이 전송된 적이 없던 것처럼).
  • REJECT : 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송한다.
  • LOG : 패킷을 syslog에 기록한다.
  • RETURN : 호출 체인 내에서 패킷 처리를 계속한다.

REJECT는 서비스에 접속하려는 사용자의 액세스를 거부하고 connection refused라는 오류 메시지를 보여주는 반면 DROP은 말 그대로 telnet 사용자에게 어떠한 경고 메시지도 보여주지 않은 채 패킷을 드롭한다. 관리자의 재량껏 이러한 규칙을 사용할 수 있지만 사용자가 혼란스러워하며 계속해서 접속을 시도하는 것을 방지하려면 REJECT를 사용하는 것이 좋다.

5) 연결 추적(Connection Tracking)

iptables는 연결 추적(connection tracking)이라는 방법을 사용하여 내부 네트워크 상 서비스 연결 상태에 따라서 그 연결을 감시하고 제한할 수 있게 해준다. 연결 추적 방식은 연결 상태를 표에 저장하기 때문에, 다음과 같은 연결 상태에 따라서 시스템 관리자가 연결을 허용하거나 거부할 수 있다.

  • NEW : 새로운 연결을 요청하는 패킷, 예, HTTP 요청
  • ESTABLISHED : 기존 연결의 일부인 패킷
  • RELATED : 기존 연결에 속하지만 새로운 연결을 요청하는 패킷, 예를 들면 접속 포트가 20인 수동 FTP의 경우 전송 포트는 사용되지 않은 1024 이상의 어느 포트라도 사용 가능하다.
  • INVALID : 연결 추적표에서 어디 연결에도 속하지 않은 패킷

상태에 기반(stateful)한 iptables 연결 추적 기능은 어느 네트워크 프로토콜에서나 사용 가능하다. UDP와 같이 상태를 저장하지 않는 (stateless) 프로토콜에서도 사용할 수 있다.

6) 명령어(commond)

  • -A (--append) : 새로운 규칙을 추가한다.
  • -D (--delete) : 규칙을 삭제한다.
  • -C (--check) : 패킷을 테스트한다.
  • -R (--replace) : 새로운 규칙으로 교체한다.
  • -I (--insert) : 새로운 규칙을 삽입한다.
  • -L (--list) : 규칙을 출력한다.
  • -F (--flush) : chain으로부터 규칙을 모두 삭제한다.

  • -Z (--zero) : 모든 chain의 패킷과 바이트 카운터 값을 0으로 만든다.
  • -N (--new) : 새로운 chain을 만든다.
  • -X (--delete-chain) : chain을 삭제한다.
  • -P (--policy) : 기본정책을 변경한다.

7) 기본 동작

  1. 패킷에 대한 동작은 위에서 부터 차례로 각 규칙에 대해 검사하고, 그 규칙과 일치하는 패킷에 대하여 타겟에 지정한 ACCEPT, DROP등을 수행한다.
  2. 규칙이 일치하고 작업이 수행되면, 그 패킷은 해당 규칙의 결과에 따리 처리하고 체인에서 추가 규칙을 무시한다.
  3. 패킷이 체인의 모든 규칙과 매치하지 않아 규칙의 바닥에 도달하면 정해진 기본정책(policy)이 수행된다.
  4. 기본 정책은 policy ACCEPT , policy DROP 으로 설정할 수 있다.

일반적으로 기본정책은 모든 패킷에 대해 DROP을 설정하고 특별히 지정된 포트와 IP주소등에 대해 ACCEPT를 수행하게 만든다.

8) iptables 출력

Iptables의 룰셋을 확인할때 아래와 같이 하면 보기 더 편리하다.

BASH
iptables -nL

  Chain INPUT (policy DROP)
  target     prot opt source               destination
  ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
  ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
  ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22
  ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53
  ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53
  ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
  ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443
  ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3306

  Chain FORWARD (policy DROP)
  target     prot opt source               destination

  Chain OUTPUT (policy ACCEPT)
  target     prot opt source               destination

아래와 같이 각 룰셋의 적용순서까지 확인 가능한 방법도 있다.

BASH
iptables -nL --line-numbers

  Chain INPUT (policy DROP)
  num  target     prot opt source               destination
  1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
  2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
  3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22
  4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53
  5    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53
  6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
  7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443
  8    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3306

  Chain FORWARD (policy DROP)
  num  target     prot opt source               destination

  Chain OUTPUT (policy ACCEPT)
  num  target     prot opt source               destination
BASH
iptables -L -v

  Chain INPUT (policy DROP 1626 packets, 214K bytes)
   pkts bytes target     prot opt in     out     source               destination
      0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
    944  194K ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
      0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:ssh
      0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:domain
      4   245 ACCEPT     udp  --  any    any     anywhere             anywhere            udp dpt:domain
      6   304 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:http
      0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:https
      2    88 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:mysql

  Chain FORWARD (policy DROP 0 packets, 0 bytes)
   pkts bytes target     prot opt in     out     source               destination

  Chain OUTPUT (policy ACCEPT 179 packets, 22190 bytes)
   pkts bytes target     prot opt in     out     source               destination

iptables 설정

아래는 CentOS 6.4 Minimal의 기본적인 iptables의 설정내용이다.

BASH
iptables -L

  Chain INPUT (policy ACCEPT)
  target     prot opt source               destination
  ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
  ACCEPT     icmp --  anywhere             anywhere
  ACCEPT     all  --  anywhere             anywhere
  ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
  REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

  Chain FORWARD (policy ACCEPT)
  target     prot opt source               destination
  REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

  Chain OUTPUT (policy ACCEPT)
  target     prot opt source               destination

기본 정책이 모든 패킷에 대해 ACCEPT이며, SSH 서비스가 기본적으로 허용되어 있다. 이것을 과감히 날리고! 새로운 정책의 규칙을 작성할 것이다.

기본 정책 수립에 있어 DROP으로 설정할 경우 원격에서 SSH를 접속해 사용중이라면 그 순간 서버에 접속할 수 없게 된다. 그러므로 일단 기본 정책을 ACCEPT로 설정해서 SSH 설정을 마친후 다시 기본 정책을 DROP으로 변경하도록 하자. 현재 iptables 작업을 콘솔(서버컴퓨터로)상으로 작업하고 있다면 문제 될것이 없다.

기본설정

  1. 기본 정책을 ACCEPT 로 변경

    BASH
    iptables -P INPUT ACCEPT
    
  2. 체인에 정의된 모든 규칙을 삭제

    BASH
    iptables -F
    
  3. 확인해보면 규칙이 모두 제거되어 있다.

    BASH
    iptables -L
    
      Chain INPUT (policy ACCEPT)
      target     prot opt source               destination
    
      Chain FORWARD (policy ACCEPT)
      target     prot opt source               destination
    
      Chain OUTPUT (policy ACCEPT)
      target     prot opt source               destination
    
  4. INPUT 체인에 로컬호스트 인터페이스에 들어오는 모든 패킷을 허용 추가

    BASH
    iptables -A INPUT -i lo -j ACCEPT
    

    일반적으로 많은 소프트웨어들이 localhost 어댑터와 통신이 되어야 하기에 필요하다.

  5. INPUT 체인에 state 모듈과 매치되는 연결상태가 ESTABLISHED, RELATED인 패킷에 대해 허용 추가

    BASH
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    

    INPUT 체인에 접속에 속하는 패킷(응답 패킷을 가진것)과 기존의 접속 부분은 아니지만 연관성을 가진 패킷 (ICMP 에러나 ftp데이터 접속을 형성하는 패킷)을 허용하는 규칙이다.

  6. INPUT 체인에 프로톨콜이 tcp이며 목적지포트가 22번인 패킷에 대해 허용 추가

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

    이로써 SSH 접속이 허용된다. telnet의 경우는 목적지 포트가 23번

  7. 이제 INPUT 체인에 대한 기본 정책을 버림(DROP)으로 변경

    BASH
    iptables -P INPUT DROP
    
  8. FORWARD 체인에 대한 기본정책을 버림으로 변경

    BASH
    iptables -P FORWARD DROP
    

    서버를 라우팅기기로 사용하지 않기에 모든 포워드에 대한 패킷을 DROP

  9. OUTPUT 체인에 대한 기본정책을 허용으로 변경

    BASH
    iptables -P OUTPUT ACCEPT
    
  10. 설정한 것들에 대한 확인

    BASH
    iptables -L -v
    
      Chain INPUT (policy DROP 108 packets, 12199 bytes)
       pkts bytes target     prot opt in     out     source               destination
          0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
        273 25012 ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
          0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:ssh
    
      Chain FORWARD (policy DROP 0 packets, 0 bytes)
       pkts bytes target     prot opt in     out     source               destination
    
      Chain OUTPUT (policy ACCEPT 9 packets, 1612 bytes)
       pkts bytes target     prot opt in     out     source               destination
    
  11. 설정한 것들 저장

    BASH
    service iptables save
    
    iptables: 방화벽 규칙을 /etc/sysconfig/iptables에 저장 중: [  OK  ]
    

iptables 규칙을 만들 때는 순서가 매우 중요하다. 예를 들어 만일 chain에서 로컬 192.168.100.0/24 서브넷에서 들어오는 모든 패킷을 drop하도록 지정한 후 (drop 하도록 지정된 서브넷에 포함되는) 192.168.100.13에서 들어오는 패킷을 모드 허용하는 chain (-A)을 그 후에 추가하면 뒤에 추가된 추가 규칙이 무시된다. 먼저 192.168.100.13를 허용하는 규칙을 설정한 후 서브넷을 drop하는 규칙을 설정해야한다.

그 밖의 서비스 허용

아래의 설정은 기본 정책을 OUTPUT 체인을 DROP (iptables -P OUTPUT DROP)으로 설정했을 경우를 대비해 OUTPUT도 함께 기술하였다.

네임서버

DNS -- TCP 53 / UDP 53
BASH
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT

웹서버

HTTP -- TCP 80
BASH
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
HTTPS -- TCP 443
BASH
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp -m multiport --dports 80,443 -j ACCEPT
MySQL -- TCP 3306
BASH
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT 
FTP(passive mode)
BASH
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp –-sport 21 -j ACCEPT

iptables -A INPUT -p tcp --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1024:65535 -j ACCEPT

메일서버

SMTP -- TCP 25
BASH
iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
Secure SMTP -- TCP 465
BASH
iptables -A INPUT -p tcp -m tcp --dport 465 -j ACCEPT
POP3 -- TCP 110
BASH
iptables -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT
Secure POP3 -- TCP 995
BASH
iptables -A INPUT -p tcp -m tcp --dport 995 -j ACCEPT
IMAP -- TCP 143
BASH
iptables -A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
Secure IMAP -- 993
BASH
iptables -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT
ICMP 허용 (ping)
BASH
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
NTP 시간동기화
BASH
iptables -A INPUT -p udp --dport 123 -j ACCEPT 

서버 취약점 보안

NULL 패킷 차단

NULL 패킷은 정찰 패킷으로 서버설정의 약한 곳을 찾기위한 방법으로 사용된다.

BASH
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
syn-flood attack 차단

syn-flood attack은 공격자가 새로운 연결을 만들고 빠지고를 반복해 리소스의 소모를 시키는 것

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

Anti synflood with iptables

Edit /etc/sysctl.conf to defend against certain types of attacks and append / update as follows:

net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.netfilter.ip_conntrack_max = 1048576
XMAS 패킷 차단

XMAS 또한 정찰 패킷이다.

BASH
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

기타 사용법

iptables 수정법

등록된 iptables를 수정하는 방법은 /etc/sysconfig/iptables 에서 직접 vi로 수정하거나 iptables 명령어를 사용한다.

실행 순번을 확인하기

BASH
iptables -nL --line-number

아래의 예는 순번 3의 행을 아래와 같이 R(replace) - 수정하게 된다.

BASH
iptables -R INPUT 3 -p tcp --dport 2222 -j ACCEPT

인터페이스 지정

루프백 인터페이스에 대해 모든 패킷을 허용

BASH
iptables -A INPUT -i lo -j ACCEPT

랜카드 지정에 대해 모든 패킷을 허용

BASH
iptables -A INPUT -i eth0 -j ACCEPT

IP 주소 지정

신뢰할 만한 ip에 대해 모든 패킷을 허용

BASH
iptables -A INPUT -s 192.168.0.3 -j ACCEPT

신뢰할 만한 ip 대역에 대해 모든 패킷을 허용

BASH
iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT

신뢰할 만한 ip 대역에 대해 모든 패킷을 허용

BASH
iptables -A INPUT -s 192.168.0.0/255.255.255.0 -j ACCEPT

신뢰할 만한 ip와 MAC주소에 대해 모든 패킷을 허용

BASH
iptables -A INPUT -s 192.168.0.3 -m mac --mac-source 00:50:80:FD:E6:32 -j ACCEPT

포트 범위지정

BASH
iptables -A INPUT -p tcp --dport 6881:6890 -j ACCEPT

자동화 스크립트

자주 방화벽 설정을 초기화하고 재설정해야 한다면 자동화 스크립트를 짜놓는게 좋다. 아래는 그에 대한 예이다.

#!/bin/bash
# iptables 설정 자동화 스크립트
# 입맛에 따라 수정해서 사용합시다.
iptables -F

# TCP 포트 22번을 SSH 접속을 위해 허용
# 원격 접속을 위해 먼저 설정합니다
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

# 기본 정책을 설정합니다
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# localhost 접속 허용
iptables -A INPUT -i lo -j ACCEPT

# established and related 접속을 허용
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Apache 포트 80 허용
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# 설정을 저장
/sbin/service iptables save

# 설정한 내용을 출력
iptables -L -v
  1. 위 내용을 입맛에 맞게 수정한 후에 저장(myfirewall)
  2. 권한부여

    BASH
    chmod +x myfirewall
    
  3. 실행

    BASH
    ./myfirewall



출처: http://webdir.tistory.com/170 [WEBDIR]

1 임시 적용[편집]

재부팅시에는 사라지는 적용방법

명령어
route add -net 아이피 netmask 넷마스크 dev 장치명
→ 특정IP에서 들어오는 네트워크 요청에 대해 지정한 장치로 응답함
명령어 예시 (IP 1개)
route add -net 111.222.33.44 netmask 255.255.255.255 dev eth0
→ 111.222.33.44에서 들어오는 네트워크 요청은 eth0 으로 응답함
명령어 예시 (IP 대역)
route add -net 111.222.34.0 netmask 255.255.255.0 dev eth1
→ 111.222.34.x 에서 들어오는 네트워크 요청은 eth1 로 응답함
확인 명령어
route | grep 장치명

2 영구 적용 1 (네트워크 재시작)[편집]

영구 적용(재부팅시에도 적용)을 하려면 route-장치명 파일을 수정하고 network 서비스를 재시작해야 한다.

방법
vi /etc/sysconfig/network-scripts/route-장치명

파일 내용을 다음 형식으로 입력하고 저장

ADDRESS0=아이피
NETMASK0=넷마스크
GATEWAY0=게이트웨이
service network restart
route
실행예시
[root@zetawiki ~]# cat /etc/sysconfig/network-scripts/route-eth1
cat: /etc/sysconfig/network-scripts/route-eth1: No such file or directory
[root@zetawiki ~]# vi /etc/sysconfig/network-scripts/route-eth1
ADDRESS0=111.222.33.0
NETMASK0=255.255.255.0
GATEWAY0=10.20.30.1
[root@zetawiki ~]# cat /etc/sysconfig/network-scripts/route-eth1
ADDRESS0=111.222.33.0
NETMASK0=255.255.255.0
GATEWAY0=10.20.30.1

3 영구 적용 2 (네트워크 재시작 없음)[편집]

영구 적용 1과 임시 적용을 혼합하면 network restart 없이 가능하다.[1]

명령어
vi /etc/sysconfig/network-scripts/route-장치명
route add -net 아이피 netmask 넷마스크 dev 장치명
실행예시
[root@zetawiki ]# vi /etc/sysconfig/network-scripts/route-eth1
[root@zetawiki ]# route add -net 111.222.33.44 netmask 255.255.255.255 dev eth1
→ 수정한 route-eth1 파일은 service network restart 또는 재부팅시에 적용되고,
→ route 명령어는 즉시 적용된다...

4 같이 보기[편집]

5 주석[편집]

  1. 이동 그럼에도 필자가 영구 적용 1을 선호하는 이유는 route-장치명 파일에 오타가 있거나 할 때 즉시 인지할 수 있기 때문이다.

6 참고[편집]




출처 : https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_%EC%8A%A4%ED%83%9C%ED%8B%B1_%EB%9D%BC%EC%9A%B0%ED%8C%85_%EC%84%A4%EC%A0%95

'프로그래밍 > linux' 카테고리의 다른 글

CentOS 방화벽 사용방법  (0) 2018.03.26
IPTABLE  (0) 2018.03.26
CentOS 7 - 리눅스 방화벽 firewalld  (0) 2018.03.13
VMware CentOS 네트워크 설정  (0) 2018.03.13
RHEL/CentOS 7 에서 방화벽(firewalld) 설정하기  (0) 2018.03.08

CentOS 7부터 기본 방화벽 시스템이 변경되었습니다. 이전에는 iptables 를 사용했었는데.. CentOS 7에서는 firewalld라는 방화벽 시스템이 기본으로 탑재되었습니다. 


그렇다고 iptables이 완전히 없어진 것은 아닙니다. firewalld은 그저 iptables을 기반으로해서 동작하고 있는 것 뿐입니다. firewalld이 iptables을 의존 패키지로 두고 있는 것을 보면 알 수 있습니다. 다만 iptables-service를 조작이 쉬운 firewalld로 바꾼 것 뿐입니다.


centos 7부터는 iptables-service를 더 이상 사용하지않지만, iptables-service를 계속 사용할 수도 있습니다. 리눅스를 계속 사용해온 사용자라면 당연히 익숙했던 iptables-service가 더 편할 것입니다. 하지만 기본 방화벽 시스템이 변경된 이상 iptables-service의 향후 지원도 불확실하고, 어쩌면 익숙해지면 firewalld가 더 편할 수도 있습니다.


이런저런 이유로 기본 firewalld 사용을 권장하고, 그 사용방법에 대해 알아보겠습니다.



1. 방화벽 살펴보기

방화벽에는 zone(영역)이라는 것이 존재합니다. 개방된 네트워크와 연결되어있다면 public zone(공개영역)에 있는 룰이 적용되고, 개인 네트워크에 있다면 다른 zone의 룰의 적용할 수 있습니다. 이 처럼 네트워크 형태에 따라 적용하는 방화벽 룰을 다르게 할 수 있습니다.


우리는 서버 용도로 리눅스를 사용하기때문에 개방된 네트워크 public zone 만 필요합니다. 또한 방화벽에는 public zone이 기본 zone 으로 설정되어있습니다. 이는 방화벽 설정파일에서 변경가능합니다.


* public zone의 설정파일

/etc/firewalld/zones/public.xml


* 방화벽 재로드

# firewall-cmd --reload


설정파일은 xml 형식으로 되어있으며, firewall-cmd --permanent --zone=public 명령으로 추가했던 룰들이 저장되어있습니다. zone의 설정파일을 변경할 경우 방화벽 재로드를 해야 반영이 됩니다. 


또한 firewall-cmd에서 --permanent 옵션이 들어간다면 반영은 되지않고, 해당 zone의 설정파일에서 룰 추가/수정만 이루어집니다. 따라서 --permanent 옵션 넣었다면 방화벽 재로드를 해야합니다. 


참고로 설정파일에 추가된 룰은 영구반영됩니다. 만약 --permanent 옵션을 넣지않으면, 일시적으로 즉시 반영됨을 의미합니다. (재부팅할 경우 zone의 설정파일에 추가되지않은 룰은 전부 삭제됩니다. )



2. 포트

포트를 방화벽에 추가하면 해당 포트는 허용됩니다.


* 포트추가

# firewall-cmd --permanent --zone=public --add-port=포트

예) firewall-cmd --permanent --zone=public --add-port=80/tcp


# firewall-cmd --reload


* 포트 제거

# firewall-cmd --permanent --zone=public --remove-port=포트

예) firewall-cmd --permanent --zone=public --remove-port=80/tcp


# firewall-cmd --reload



3. 서비스

서비스에서 사용하는 룰을 적용하려면 아래와 같이 서비스를 추가하면 됩니다. 

단, 해당 서비스 xml 룰 파일이 /usr/lib/firewalld/services 에 있어야 사용할 수 있습니다. 


* 서비스 추가

firewall-cmd --permanent --zone=public --add-service=서비스

예) firewall-cmd --permanent --zone=public --add-service=http


# firewall-cmd --reload


* 서비스 제거

firewall-cmd --permanent --zone=public --remove-service=서비스

예) firewall-cmd --permanent --zone=public --remove-service=http


# firewall-cmd --reload


그리고 /usr/lib/firewalld/services 디렉토리에 있는 서비스 파일들을 수정하려면 /etc/firewalld/services에 복사후 수정해야 합니다. (/etc/firewalld/services에 있는 서비스 파일들이 우선 적용되기에 관리상 편리합니다..)


4. 임의의 룰 (Rich rule)

포트, 서비스 룰 이외에 원하는 룰을 임의로 적용할 수 있습니다. 예를 들면 ip차단 같은...


* 룰 추가

# firewall-cmd --permanent --zone=public --add-rich-rule="임의의 룰"

예) firewall-cmd --permanent --zone=public --add-rich-rule="rule family=ipv4 source address=192.168.0.4/24 service name=http accept"


# firewall-cmd --reload


* 룰 제거

# firewall-cmd --permanent --zone=public --remove-rich-rule="임의의 룰"

예) firewall-cmd --permanent --zone=public --remove-rich-rule="rule family=ipv4 source address=192.168.0.4/24 service name=http accept"


# firewall-cmd --reload



* 응용예시 - http(80번 포트) 서비스에서 특정 ip 차단

웹서버를 운영하다보면 특정ip(스팸같은)를 차단시키고 싶을 때가 있습니다. 그럴경우 아래와 같이 임의의 룰을 활용하면 됩니다.


차단시)

# firewall-cmd --permanent --zone=public --add-rich-rule="rule family=ipv4 source address=차단ip service name=http reject"


차단해제시)

# firewall-cmd --permanent --zone=public --remove-rich-rule="rule family=ipv4 source address=차단ip service name=http reject"


# firewall-cmd --reload


위 명령을 실행하면 즉시 , 영구적으로 해당 ip를 웹사이트에 접속하지못하게 차단시킬 수 있습니다. 이 방법은 웹서버 자체에서 ip를 차단시키는 것보다 효과적입니다.



5. 방화벽 기타 명령어

방화벽에서 유용 명령어들입니다


* 허용한 포트 목록

# firewall-cmd --list-ports


* 방화벽 상태 확인

# firewall-cmd --state


* 활성화된 zone 목록

# firewall-cmd --get-active-zones


* 현재 존재하는 서비스 목록

# firewall-cmd --get-service


public zone에 있는 서비스 목록

# firewall-cmd --zone=public --list-services




※ 출처 : https://conory.com/blog/42477

'프로그래밍 > linux' 카테고리의 다른 글

IPTABLE  (0) 2018.03.26
스태틱 라우팅 설정  (0) 2018.03.13
VMware CentOS 네트워크 설정  (0) 2018.03.13
RHEL/CentOS 7 에서 방화벽(firewalld) 설정하기  (0) 2018.03.08
CentOS SELinux 설정 및 해제하기  (0) 2018.03.08

 

 

 

 

해당 내용을 기준으로 리눅스에서 설정한다.

 

Subnet IP:         192.168.164.0

Subnet Mask:    255.255.255.0

Gateway IP:       192.168.164.2

 

1. vi /etc/sysconfig/network-scripts/ifcfg-eth0

처음 설치시 설정된 값 

 

DEVICE=eth0

HWADDR=XX:XX:XX:XX:XX:XX

TYPE=Ethernet

UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

ONBOOT=no

NM_CONTROLLED=yes

BOOTPROTO=dhcp

 

수정된 값

DEVICE=eth0

HWADDR=XX:XX:XX:XX:XX:XX

TYPE=Ethernet

UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

ONBOOT=yes

NM_CONTROLLED=yes

BOOTPROTO=dhcp

BROADCAST=192.168.164.255

IPADDR=192.168.164.100

NETMASK=255.255.255.0

NETWORK=192.168.164.0

GATEWAY=192.168.164.2


BROADCAST는 마지막에 255를 넣어주면 되고 IPADDR은 3~255까지 원하는 숫자를 적어준다.

GATEWAY, NETMASK,, NETWORK는 위에서 구한 값을 적어주면 된다.


2. vi /etc/resolv.conf

nameserver 192.168.164.2


게이트웨이 아이피를 써주도록한다.


모든 설정이 끝났으니 네트워크 재시작


/etc/init.d/network restart

 

혹은

 

service network restart

 

 

해당 내용은 http://dgoh.tistory.com/78 포스트를 참고 하였습니다.



출처: http://chule.tistory.com/77 [ChulE]

RHEL 7 부터는 방화벽을 관리하는 데몬이 firewalld 로 변경되었고 방화벽 설정은 복잡한 iptables 명령어대신 firewall-cmd (콘솔), firewall-config(X-Windows) 명령어를 사용하는 것을 권장합니다.

firewall-cmd 는 iptables 를 쓰기 쉽게 하는 wrapper 이고 복잡한 규칙을 사용할 경우 --direct 옵션으로 iptables 내부에 접근해야 합니다.

    설치

    yum install firewalld
    systemctl start firewalld
    systemctl enable firewalld


    설정

    설정 파일

    기본 설정은 /usr/lib/firewalld/ 에 위치하고 있으며 미리 설정된 zone과 zone 별 허용하는 서비스등은 이 폴더를 보면 확인할 수 있습니다.


    시스템 개별 설정은 /etc/firewalld/ 에 위치하며 default zone 등 firewall 의 동작은 /etc/firewalld/firewalld.conf 에서 지정할 수 있으며 예로 default zone 을 dmz로 변경하려면 아래와 같이 설정하고 firewalld 를 재시작하면 됩니다.

    /etc/firewalld/firewalld.conf
    DefaultZone=dmz


    커스터마이징된 zone 설정은 /etc/firewalld/zones//[ZONE].xml 에서 확인할 수 있으며 예로 public 존은 /etc/firewalld/zones/public.xml 에 설정합니다.

    <?xml version="1.0" encoding="utf-8"?>
    <zone>
      <short>Public</short>
      <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accept
    ed.</description>
      <service name="dhcpv6-client"/>
      <service name="http"/>
      <service name="ssh"/>
      <service name="https"/>
    </zone>


    재구동

    서비스 재구동시 service iptables restart 대신 firewall-cmd 명령어를 사용합니다.

    firewall-cmd --reload


    zone

    존은 서버의 용도에 맞게 사전에 정의된 네트워크의 신뢰 레벨을 의미.


    사전 정의된 존 목록 출력

    firewall-cmd --get-zones
     
     
    work drop internal external trusted home dmz public block


    전체 존 목록을 상세하게 출력

    firewall-cmd --list-all-zones


    기본 존 출력

    default 로 설정된 존 출력

    firewall-cmd --get-default-zone
     
     
    public


    활성화된 존 출력

    firewall-cmd --get-active-zone


    새로운 존 추가

    --new-zone=ZONENAME 으로 추가

    firewall-cmd --permanent --new-zone=webserver


    존 삭제

    --delete-zone=ZONENAME 으로 삭제

    firewall-cmd --permanent --delete-zone=webserver



    서비스 목록

    사전에 정의된 서비스의 목록은 --get-services 으로 확인 가능

    firewall-cmd --get-services
     
     
    RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imaps ipp ipp-client ipsec iscsi-target kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind rsyncd samba samba-client smtp ssh telnet tftp tftp-client transmission-client vdsm vnc-server wbem-https

    permanent 로 등록된 서비스 목록

    dmz 존에 영구적으로 등록된 서비스 목록 확인
    firewall-cmd --permanent --list-all --zone=dmz


    서비스 추가

    --add-service=SERVICE_NAME 으로 추가할 서비스 지정

    firewall-cmd --permanent --zone=dmz --add-service=http

    서비스 삭제

    --remove-service=SERVICE_NAME 으로 삭제할 서비스 지정

    firewall-cmd --permanent --zone=dmz --remove-service=http

    포트 추가

    --add-port=<portid>[-<portid>]/<protocol> 옵션을 사용하여 포트 추가

    포트 추가/변경, IP 추가/변경는 --reload 옵션을 실행해야 반영됨.

    firewall-cmd --permanent --zone=public --add-port=8080/tcp

    포트를 범위로 지정하려면 - 구분자를 넣어서 설정

    4000 ~ 4100 포트 오픈
    firewall-cmd --permanent --zone=public --add-port=4000-4100/tcp


    포트 삭제

    --remove-port=<portid>[-<portid>]/<protocol> 옵션 사용

    firewall-cmd --permanent --zone=public --remove-port=8080/tcp

    허용 IP 추가

    --add-source=<source range>/netmask 옵션을 사용하여 IP 추가


    아래 예는 192.168.1. 대역에서 ssh 접근을 허용

    firewall-cmd --permanent --zone=public --add-source=192.168.1.0/24 --add-port=22/tcp
     
     
    firewall-cmd --reload

    rich-rule

    보다 복잡한 규칙 설정이 필요할때나 firewall-cmd에서 필요로 하는 옵션을 제공하지 않을 경우 rich rule 언어를 사용하여 직접 방화벽 규칙을 설정할 수 있음.

    새로운 룰 추가는 --add-rich-rule='<rule>' 와 같은 형식으로 설정


    firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4"  source address="192.168.10.0/24"  port protocol="tcp" port="9000" accept"



    direct

    --direct 옵션을 사용하면 기존의 iptables 명령처럼 직접 방화벽 내부에 접근해서 설정할 수 있음

    $ sudo firewall-cmd  --direct --get-all-rules
     
    ipv4 filter INPUT 0 -p tcp -m multiport --dports ssh -m set --match-set fail2ban-sshd src -j REJECT --reject-with icmp-port-unreachable



    firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -o eth_ext -j MASQUERADE


    서비스 설정

    웹 서버 방화벽 설정

    1. 새로운 zone 생성

      firewall-cmd --permanent --new-zone=webserver
    2. 활성화

      firewall-cmd --set-default-zone=webserver
    3. 방화벽에 포트 추가

      firewall-cmd --permanent --zone=webserver --add-service=http
      firewall-cmd --permanent --zone=webserver --add-service=https

      기본 zone이 webserver 이므로 --zone=webserver 옵션은 생략 가능

    4. firewalld 재시작

      firewall-cmd --reload
    5. 정상 설정 여부 확인

      firewall-cmd --list-services   --zone=webserver
        
      dhcpv6-client http https ssh

    apache 웹서버 설정

    1. 서비스 활성화

      systemctl enable httpd
    2. 서비스 시작

      systemctl start httpd

    nginx 설정

    1. 기존에 아파치 httpd 가 설치되어 있으면 비활성화

      systemctl stop httpd
      systemctl disable httpd
    2. 서비스 활성화

      systemctl enable nginx.service
    3. 시작

      systemctl start nginx.service



    ※ 출처 : https://www.lesstif.com/pages/viewpage.action?pageId=22053128#RHEL/CentOS7%EC%97%90%EC%84%9C%EB%B0%A9%ED%99%94%EB%B2%BD(firewalld)%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0-permanent%EB%A1%9C%EB%93%B1%EB%A1%9D%EB%90%9C%EC%84%9C%EB%B9%84%EC%8A%A4%EB%AA%A9%EB%A1%9D

    SELinux 는 Linux의 보안을 강화해 주는 보안 강화 커널이고 zero-day 공격 및 buffer overflow 등 어플리케이션 취약점으로 인한 해킹을 방지해 주는 핵심 구성요소이다.

    특정 서비스가 SELinux 때문에 동작하지 않는다면 SELinux 를 끄기 보다는 해당 서비스가 SELinux 하에서 잘 동작하도록 설정을 수정하는걸 권장한다.

    SELinux 동작 모드

    enforce, permissive, disable 세 가지 모드가 있으며 RHEL/CentOS 를 설치하면 default 로 enforce mode 로 동작하며 SELinux 의 rule 에 어긋나는 operation 은 거부된다.

    현재 SELinux 의 동작 모드는 sestatus 명령어로 확인할 수 있다.

    SELinux 모드 확인
    # sestatus
     
    SELinux status: enabled
    SELinuxfs mount: /selinux
    Current mode: enforcing
    Mode from config file: enforcing
    Policy version: 24
    Policy from config file: targeted

    Permissive mode 는 rule 에 어긋나는 동작이 있을 경우 audit log 를 남기고 해당 operation 은 허용된다.

    개발 서버일 경우 특정 daemon 이나 서비스에 문제가 있을 경우 setenforce 0 으로 Permissive mode 로 전환하여 문제 해결후 enforce mode 로 전환하는걸 추천한다.

    # setenforce 0
    # sestatus
     
    SELinux status: enabled
    SELinuxfs mount: /selinux
    Current mode: permissive
    Mode from config file: enforcing
    Policy version: 24
    Policy from config file: targeted


    SELinux 해제

    • 인터넷에 연결된 리눅스 서버라면 SELinux 해제는 결코 추천하지 않는다.
    • 해제할 경우 다시 활성화 시키려면 재부팅이 필요하며 재부팅시 모든 자원에 대해 보안 레이블을 설정해야 하므로 부팅 시간이 매우 오래 걸릴 수 있다.
    1.  vi /etc/sysconfig/selinux
    2. SELINUX=enforcing 을 SELINUX=disabled 로 변경후 저장한다.
    3. reboot

    ※ 출처 : https://www.lesstif.com/pages/viewpage.action?pageId=6979732



    + Recent posts