2016.10.21 21:37
리눅스 iptables 방화벽 구성 스크립트 공유 합니다.

여기 스크립트 보고 신선한(?) 충격에 기존 방화벽 소스 대거 고치게 되었습니다.

베이스만 가져와서 대폭 수정하였습니다.


크게 아래 5가지 항목으로 잡았습니다.

1. INPUT PORT TCP
들어오는 TCP 포트 연결

2. INPUT PORT UDP
들어오는 UDP 포트 연결

3. OUTPUT ADDR
나가는 주소

4. OUTPUT PORT TCP
나가는 TCP 연결

5. OUTPUT PORT UDP
나가는 UDP 연결


OUTPUT 기본정책을 DROP 로 만들면 예기치 못한 상황을 겪을 수 있습니다. 처음에 ALLOW 로 설정하고 LOG 로 빠지는 놈이 있나 없나 체크 한 후에 마지막에 DROP 로 설정 합시다.

sudo iptables -L -n -v --line-numbers

이 명령어 한줄이면 아래 처럼 테이블이 나타납니다

빨간 네모 부분 LOG에 패킷, 바이트가 0 이 아니면 이쪽으로 향하는 길 잃은 영혼(패킷-_-)이 존재 한다는 겁니다.


dmesg 명령어로 LOG를 확인하고 출발지, 목적이 IP, PORT, prot 등을 확인하여 규칙을 추가하여 줍시다.


위 내역에서 숫자가 발생한 부분은 각각 패킷, 데이터가 얼마나 흘렀는지를 알 수 있는 부분이며, 0 은 아직 한번도 이 쪽 규칙을 타지 않았음을 나타냅니다. (한참 지켜보고 필요없다 싶으면 제거할 수도 있겠죠? ㅎㅎ)




현재 설정에 apt 패키지 업데이트 호스트도 추가해야 되는데 빠졌네요.
apt-get 하면 업데이트 서버에 접근 못합니다. OUTPUT도 막았으니까요.
이 부분은 OUTPUT ADDR에 업데이트 서버의 주소나 IP 추가해 주면 됩니다.

나가는 주소에 허용된 유일한 내역은 현재 서브넷 대역 (제 경우 172.17.10.0/24)을 설정하였는데 이 부분은 내부 네트워크의 주소에는 접근이 가능하게 하고자 함입니다.

그리고... NAT 부분은 VPN 때문에 설정하였습니다.
FORWARD 를 DROP 하면 NAT의 MASQUERADE 가 동작하지 않습니다. (패킷 전달을 막으면 안되는게 당연하겠죠?)
고로 여기서는 NAT 때문에 FORWARD를 막지 않습니다만, 필요없으면 DROP 이 보안상 좋겠네요.

#!/bin/bash

# Haebi's iptables script 
# http://haebi.kr, http://haebi.net

# based on
# https://gist.github.com/thomasfr/9712418

# Check iptables status
# sudo iptables -L -n -v --line-numbers

IPT="/sbin/iptables"

# Your DNS servers you use: cat /etc/resolv.conf
DNS_SERVER="
	8.8.4.4
	8.8.8.8
"

# Service List (TCP)
# -----------------------
# 22		SSH
# 80		Web
# 443		Web (HTTPS)
# 1194		OpenVPN #1
# 1196		OpenVPN #2
# 3306		MySQL
# 21		FTP (Command)
# 50000:51000	FTP (Data)
# 137:139	SAMBA
# 445		SAMBA

ALLOW_INPUT_PORT_TCP="
	22
	80
	443
	1194
	1196
	3306
	21
	50000:51000
	137:139
	445
"

# Service List (UDP)
# -----------------------
# 53		DNS
# 137:139	SAMBA
# 8649		ganglia

ALLOW_INPUT_PORT_UDP="
	53
	137:139
	8649
"

# Allow outgoing access
ALLOW_OUTPUT_ADDR="
	172.17.10.0/24
"

# Allow outgoing TCP
# 22		ssh connect other server

ALLOW_OUTPUT_PORT_TCP="
	22
"

# Allow outgoing UDP
# 123		ntp syncs

ALLOW_OUTPUT_PORT_UDP="
	123
"

$IPT -P INPUT ACCEPT
$IPT -F

# Allowing DNS lookups (tcp, udp port 53) to server
for ip in $DNS_SERVER
do
	$IPT -A OUTPUT -p udp -d $ip --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
	$IPT -A INPUT  -p udp -s $ip --sport 53 -m state --state ESTABLISHED     -j ACCEPT
	$IPT -A OUTPUT -p tcp -d $ip --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
	$IPT -A INPUT  -p tcp -s $ip --sport 53 -m state --state ESTABLISHED     -j ACCEPT
done

# Allow any connection from this host.
$IPT -A INPUT  -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

# Allow all broadcast traffic.
iptables -A INPUT -m pkttype --pkt-type broadcast -j ACCEPT

# Open Incoming TCP Ports
for PORT in $ALLOW_INPUT_PORT_TCP
do
	$IPT -A INPUT  -p tcp --dport $PORT -m state --state NEW,ESTABLISHED -j ACCEPT
	$IPT -A OUTPUT -p tcp --sport $PORT -m state --state ESTABLISHED     -j ACCEPT
done

# Open Incoming UDP Ports
for PORT in $ALLOW_INPUT_PORT_UDP
do
	$IPT -A INPUT  -p udp --dport $PORT -m state --state NEW,ESTABLISHED -j ACCEPT
	$IPT -A OUTPUT -p udp --sport $PORT -m state --state ESTABLISHED     -j ACCEPT
done

# Allow out going access
for ip in $ALLOW_OUTPUT_ADDR
do
	$IPT -A OUTPUT -d $ip -m state --state NEW,ESTABLISHED -j ACCEPT
	$IPT -A INPUT  -s $ip -m state --state ESTABLISHED     -j ACCEPT
done

# Allow out going TCP access
for port in $ALLOW_OUTPUT_PORT_TCP
do
	$IPT -A OUTPUT -p tcp --dport $port -m state --state NEW,ESTABLISHED -j ACCEPT
	$IPT -A INPUT  -p tcp --sport $port -m state --state ESTABLISHED     -j ACCEPT
done

# Allow out going UDP access
for port in $ALLOW_OUTPUT_PORT_UDP
do
	$IPT -A OUTPUT -p udp --dport $port -m state --state NEW,ESTABLISHED -j ACCEPT
	$IPT -A INPUT  -p udp --sport $port -m state --state ESTABLISHED     -j ACCEPT
done

#######################################################################################################
## Global iptable rules. Not IP specific

# Allow outgoing icmp connections (pings,...)"
$IPT -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT  -p icmp -m state --state ESTABLISHED,RELATED     -j ACCEPT

# Simple Service Discovery Protocol
$IPT -A INPUT -p udp --dport 1900 -d 239.255.255.250 --state NEW -j ACCEPT

# Multicast address
# 224.0.0.1 The All Hosts multicast group addresses all hosts on the same network segment.
$IPT -A INPUT -d 224.0.0.1 -j ACCEPT

# 224.0.0.22 Internet Group Management Protocol
$IPT -A OUTPUT -d 224.0.0.22 -j ACCEPT

# Device discovery
$IPT -A INPUT  -d 239.255.255.250 -j ACCEPT
$IPT -A OUTPUT -d 239.255.255.250 -j ACCEPT

# Default -----------------------------------------------------------------
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Log before dropping
$IPT -A INPUT  -j LOG  -m limit --limit 5/min --log-level 7 --log-prefix 'IP INPUT drop: '
$IPT -A OUTPUT -j LOG  -m limit --limit 5/min --log-level 7 --log-prefix 'IP OUTPUT drop: '

# If forward drop then NAT Masquerade will not work.
$IPT -P INPUT DROP
#$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP
$IPT -nL

# NAT ---------------------------------------------------------------------
$IPT -t nat -F
$IPT -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
$IPT -t nat -A POSTROUTING -s 10.8.2.0/24 -d 172.17.10.0/24 -o eth0 -j MASQUERADE
$IPT -t nat -nL










Posted by 해비
2016.09.03 19:27

예)

find 로 하위폴더에서 찾은 파일을 vim 으로 여는 예


find . -name page_alloc.c -exec vim {} \;



{} 괄호 부분이 find 에서 찾은 내용의 목록을 가지고 있다.


결과가 여럿일 경우 모두 열릴 거 같은데...?


Posted by 해비
2016.08.23 23:28

폴더별 용량 확인 및 크기순 정렬

du -h --max-depth=1 | sort -hr

Posted by 해비
2016.08.18 18:44


예시를 chmod 로 들었으나 -exec 뒤에 오는 명령에 따라서 뭐든 적용 가능하다.


find의 역할은 작업 대상 파일을 추려내기 위한 용도이다.





chmod 각 폴더 하단까지 돌면서 진행. (find 응용)

find . -name *.sh
현재 폴더로 부터 이름이 *.sh인 파일을 찾는다.

find . -name *.sh -exec chmod -v 755 {} \;
현재 폴더로 부터 이름이 *.sh인 파일을 찾는다 + 파일 권한을 755로 세팅한다.



Posted by 해비
2016.08.18 18:42

디렉토리 생성 시 해당 유저의 그룹 외의 다른 그룹으로 생성되게끔 하고 싶을 경우가 있을 것이다.


메인 그룹을 수정하면 되는 데 방법은 다음과 같다.



usermod -g 메인그룹명 유저명
usermod -G 그룹명 유저명

useradd -m -s /bin/bash kitty
usermod -g tomcat kitty
usermod -G kitty kitty

groups kitty 결과
kitty : tomcat kitty

mkdir test1
drwxr-xr-x. 2 kitty tomcat 6  8월 18 18:38 test1

메인그룹으로 그룹권한 설정됨을 확인 할 수 있다.

Posted by 해비
2016.06.27 00:53

ganglia 설치 및 설정 한 내용을 정리


우분투, 데비안 환경에서 apt-get 으로 설치 했습니다.




1. 서버 설치

1-1. 웹 환경 설치

1-2. ganglia meta daemon (수집서버) 설치

2. 클라이언트 설치

2-1. ganglis monitor daemon (모니터데몬) 설치


1. 서버 설치

모니터 데몬이 실행중인 서버에 대해서 수집서버가 일정주기로 데이터를 ( pull 방식 ) 가져옵니다.

Broadcast 를하여 동일네트웤의 모니터데몬으로부터 수신하는 방법도 있는 듯 하나, 여기서는 직접 IP를 명시하여 당겨오도록 설정합니다.


1-1. 웹 환경 설치

Ganglia 가 돌아가기 위해서는 웹서버, PHP 가 필요합니다.

이 부분은 Nginx + php5-fpm 조합으로 구성합니다.


Nginx 설치

# apt-get install nginx


PHP 설치

# apt-get install php5-fpm


Nginx-PHP 연동


PHP 연동까지 완료 했으면 이제 ganglia 설치로 넘어간다.


1-2. ganglia meta daemon (수집서버) 설치

gmetad 설치 ( 데이터를 수집하는 서버 1대 )

# apt-get install gmetad


gmetad 설정

# vim /etc/ganglia/gmetad.conf

data_source "svr1" 192.168.0.101:8649
data_source "svr2" 192.168.0.102:8649

gridname "haebinet"

data_source 부분을 찾아서 위 내용 참고하여 작성한다.

gridname 부분에는 해당 시스템의 대표 그룹?명을 적으면 된다.


ganglia-web-frontend 설치 ( Web 에서 확인하기 위한 도구 )

# sudo apt-get install ganglia-webfrontend


Nginx 루트 디렉토리 이동 및 ganglia webfrontend 링크 생성

# cd /usr/share/nginx/www/

# ln -s /usr/share/ganglia-webfrontend/ ganglia




2. 클라이언트 설치

2-1. ganglis monitor daemon (모니터데몬) 설치

수집 서버의 데이터도 모니터링 하고자 한다면 클라이언트도 같이 설치 해줘야 합니다.


ganglia-monitor 설치 ( 개별 서버마다 설치 )

# apt-get install ganglia-monitor


ganglia-monitor 설정

# vim /etc/ganglia/gmond.conf

/* This configuration is as close to 2.5.x default behavior as possible
   The values closely match ./gmond/metric.h definitions in 2.5.x */
globals {
  daemonize = yes
  setuid = yes
  user = ganglia
  debug_level = 0
  max_udp_msg_len = 1472
  mute = no
  deaf = no
  host_dmax = 0 /*secs */
  cleanup_threshold = 300 /*secs */
  gexec = no
  send_metadata_interval = 0
  override_hostname = pi2
}

/* If a cluster attribute is specified, then all gmond hosts are wrapped inside
 * of a <CLUSTER> tag.  If you do not specify a cluster tag, then all <HOSTS> will
 * NOT be wrapped inside of a <CLUSTER> tag. */
cluster {
  name = "pi2"
  owner = "owner_haebi"
  latlong = "latlong_haebi"
  url = "url_haebi"
}

/* The host section describes attributes of the host, like the location */
host {
  location = "location_haebi"
}

/* Feel free to specify as many udp_send_channels as you like.  Gmond
   used to only support having a single channel */
udp_send_channel {
  host = 192.168.0.101
  port = 8649
  ttl = 1
}

/* You can specify as many udp_recv_channels as you like as well. */
udp_recv_channel {
  port = 8649
  retry_bind = true
}

/* You can specify as many tcp_accept_channels as you like to share
   an xml description of the state of the cluster */
tcp_accept_channel {
  port = 8649
}

클라이언트 설정파일의 예.




Posted by 해비
2016.06.27 00:33

시스템의 상황을 한눈에 볼 수 있는 모니터링 도구 ganglia 를 사용하면서 몇가지 사항을 정리 해 둔다.


RRDTool 이라는 것을 사용하여 시간별 데이터를 기록하고 그것을 출력한다.


데몬은 크게 아래 2가지로 나뉜다.

1. 메타데몬 (리포트를 표시 해줄 역할)

2. 모니터데몬 (시스템 정보 수집)



좀 더 쉽게 설명하자면 이런 구조?

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

모니터데몬

모니터데몬 --> 메타데몬

모니터데몬

...

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


설치과정 중 알게된 사항들 정리

- 1개의 메타 데몬은 여러개의 모니터 데몬으로 부터 정보를 수신한다.

- 실제 데이터 저장은 메타데몬이 설치된 곳에 저장이 된다.

- 저장되는 위치는 /var/lib/ganglia/rrdtool/IP 또는 시스템명/아래에 들어가는 파일들이다.

    (모니터 데몬에서 설정한다. 설정 하지 않을 경우, IP 로 기록된다)

- 파일 사이즈는 처음 생성 후 고정으로 더이상 증가하지 않으며, 최대 1년 기간동안의 데이터만 들어가는 듯 하다.



설치 결과

전체 시스템 상황



개별 시스템 상황

- 하단에 개별 시스템 별로 상황을 보여주고, 클릭해서 들어가면 해당 시스템의 상황을 더욱 자세히 살펴 볼 수 있다.







Posted by 해비
2016.06.22 00:58

sysctl -A 로 확인 가능한 항목 중

(/etc/sysctl.conf 파일 에디트 하면 된다)



net.ipv4.ip_local_port_range = 32768    61000


로컬 포트로 사용할 범위가 이렇게 정해 져 있다. 서버로 사용할 포트는 가급적 이 번호를 피하는 것이 좋다.

서버를 열어야 하는데 하필 그 포트가 저 범위에 들어있고, 로컬 포트 생성하여 다른 원격지 서버에 연결 중인 상태라면 바인드 오류를 낼 것이기 때문이다.



net.ipv4.ip_forward = 1


포워딩 허용여부를 설정하고 있다. 1이면 허용. 0 이면 차단.

쉽게 말해서. 이 컴퓨터가 최종 목적지가 아닌 패킷의 경우, 다른 곳으로 전달을 허용할 것인가에 대한 것인데, 쉽게 공유기 같은거 할려면 허용을 해야 된다고 생각하면 된다.




Posted by 해비
2016.06.22 00:58

네트워크 공부하면서 알게된 내용들을 정리 하고자 한다.

일부는 잘못된 내용이 있을 지도 모른다...;; (-_-)




TCP 에서 포트 범위는 0~65535 까지 이고, 이론 상 0번을 제외하고 1~65535 번 까지 총 65,535 개의 포트가 사용 가능하다.


연결을 맺기 위해서 쌍방, 클라이언트 와 서버는 각각 IP : PORT 가 필요하다.


클라이언트는 서버로 접속하기 위해서 자신의 로컬 포트 번호를 생성하고, 해당 포트번호를 사용하여 서버에 접속 한 후 통신을 하게 되는데, 클라이언트가 서버에 접속하기 위해 생성가능한 로컬 포트 갯수는 최대 65,535 개를 넘을 수 없다.


서버는 1개의 LISTEN 포트로 여러 IP로 부터의 접속을 받을 수 있다. 즉, 이론상 무제한...?

(예: 2대의 클라이언트로 부터 테스트 가능한 최대 연결 수는 약 13만 이다. IP당 65k 개 연결.)




[클라이언트 IP:PORT]

클라이언트1:1 ---> 서버1

클라이언트1:2 ---> 서버2

클라이언트1:3 ---> 서버3

...

IP당, 최대 65k 개의 연결 까지 가능




[서버 IP:PORT]

클라이언트1:1            

클라이언트1:2            

...                            

클라이언트1:65535        ---> 서버1:1 LISTEN

클라이언트2:1              

클라이언트2:2              

...                              

클라이언트2:65535        

IP당, 최대 65k 개의 연결이 가능, 서버가 성능이 받쳐준다는 가정 하에 무한? 연결 가능




Posted by 해비
2016.06.02 01:23


GNU sed


stream editor 를 줄여서 sed 라고 하는 것 같다.


파일 내 문장의 내용 변경

sed '/nproc/c\MODIFIED BY HAEBI' test.conf

sed '/찾을문자열/c\바뀔 문자열' 파일


nproc가 포함된 줄의 내용이 MODIFIED BY HAEBI로 바뀌는 예이다.

아직은 화면에 출력만 되고, 실제 반영이 되지 않는다. sed -i 옵션을 주면 바로 반영되므로 주의.


단순히 찾을 문자열  또는 단어만 가지고는 대상을 특정 짓기가 어렵기에 정규식을 사용해 보겠다.


아래 왼쪽 내용을 찾아서 오른쪽 내용으로 바꾸어 보도록 하겠다.

 *    -    core    unlimited

   >

 *    -    core    100000


찾을 정규식 패턴...

\S+\s+\S+\s+core\s+\S+ 

[문자 1개 이상] - [공백 1칸 이상] - [문자 1개 이상] - [공백 1칸 이상] - [core] - [공백 1칸 이상] - [문자 1개 이상]

(정규식 작성은 regexr 사이트에서 작성을 권장)


sed 에서 정규식 사용시 +기호 앞에 \을 붙여야 한다.

sed '/\S\+\s\+\S\+\s\+core\s\+\S\+/c\*    -    core    100000' test.conf

복잡해 보이지만 별거 없다.

정규식 + 기호 앞에 \을 붙여주고, 가운데 /c\ 을 기준으로 앞, 뒤 내용 참고하면 쉽게 파악할 수 있다.


sed '/찾을내용/c\바뀔내용' 파일

 sed 

  '/찾을내용

 /c\

  바뀔내용'

 파일

 파일에서 찾은 내용을 변경

 sed

  '/찾을내용

 /d'

 

 파일

 파일에서 찾은 내용을 제거


변경의 경우, 기존에 존재하지 않으면 변경을 할 수가 없는 문제가 있다.


반드시 적용해야 될 내용이라면 기존 내용을 찾아서 제거 하고 다시 써 넣도록 해야 할 것 같다.







Posted by 해비