반응형

우분투 방화벽의 대표적인 예인 iptables의 포트 차단 및 허용에 대해 간략히 글을 쓰겠다.

 

1. 그냥 모든 포트 다막는 방법

 - TCP 로 1번부터 65526번 포트까지 다 막는 방법이다. 만약 UDP도 막고싶다면, 

    tcp 대신 udp를 넣으면 됨.

 sudo iptables -A INPUT -p tcp --dport 1:65526 -j DROP

 

2. 특정 포트만 열어주는 방법

 - 22 자리는 포트번호 자리이다.

 sudo iptables -I INPUT -p tcp --dport 22 -j ACCEPT sudo iptables -I OUTPUT -p tcp --sport 22 -j ACCEPT

 

3. 특정 아이피에게 특정 포트만 열어주는 방법

 - tcp 프로토콜로 22번 포트를 열어주는데 그 대상이 222.222.222.222 아이피 임.

iptables -I INPUT -p tcp --dport 22 -s 222.222.222.222 -j ACCEPTiptables -I OUTUT -p tcp --dport 22 -d 222.222.222.222 -j ACCEPT

 

4. 8080번으로 들어오는 포트를 80 번으로 바꾸기

 sudo iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

 

5. iptables정보를 저장하고 재부팅 이후에도 동작하도록 설정함.

sudo sh -c "iptables-save > /backup/iptables.rules" 

sudo vi /etc/network/interfaces
pre-up iptables-restore < /backup/iptables.rules   <= vi 로 열어서 맨 마지막에 추가함.

 

반응형
반응형

CentOS 에서는 Install을 하는경우 자동적으로 Iptables 방화벽이 설치되는 것 같다.

 

그럼 우선 설치다하고 나서 WAS , MYSQL 등등의 Setting 후 외부에서 접속하는 방법에 대해서 알아보자.

 

[1] 방화벽 설정파일은 어디있는가?

아래 경로를 보면 방화벽 설정파일을 열어볼 수가 있다.

 # vim /etc/sysconfig/iptables

 

[2] 설정파일을 대충 파악하자.

# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

 

(노랑색) 위 설정을 보면 22번 sshd port가 현재 열려있는것을 확인가능하다.

(파랑색) 또한 22번 이외의 다른 것들은 모두 막아라 라는 코드가 있다.

 

그럼 3306,21,80 포트를 를 추가하여 보자.

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT 

 

위 처럼 포트를 추가하고 저장한다음 잘 추가되었는지 보도록 하자.

 

단!! 주의사항은 위 파랑색으로 된 -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

요코드드는 삭제한 후에 해야 한다 그럼 다음과 같이 되겠죠?

 

 

 # Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

COMMIT

 

자 , 이제 iptables가 잘 적용이 되었는지 확인해 보도록 하자.

 

 

[root@localhost sysconfig]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
RH-Firewall-1-INPUT  all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
RH-Firewall-1-INPUT  all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain RH-Firewall-1-INPUT (2 references)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     icmp --  anywhere             anywhere            icmp any
ACCEPT     esp  --  anywhere             anywhere
ACCEPT     ah   --  anywhere             anywhere
ACCEPT     udp  --  anywhere             224.0.0.251         udp dpt:mdns
ACCEPT     udp  --  anywhere             anywhere            udp dpt:ipp
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ipp
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ftp
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:mysql
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:http

[root@localhost sysconfig]# 

 

위 보는바와 같이 적용이 잘 되었다. 이제 데몬을 재시작 하도록 하자.

 

 # /etc/init.d/iptables restart

 

 

다시 이제 방화벽을 적용해야 한다, 아까 위에서 빼버린 코드를 넣고 다시금 재시작 하도록 한다.

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited 코드 추가함

 

최종 적으로 , 다시 iptables -L 명령어를 통해 보도록 하자.

 

 

[root@localhost sysconfig]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
RH-Firewall-1-INPUT  all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
RH-Firewall-1-INPUT  all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain RH-Firewall-1-INPUT (2 references)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     icmp --  anywhere             anywhere            icmp any
ACCEPT     esp  --  anywhere             anywhere
ACCEPT     ah   --  anywhere             anywhere
ACCEPT     udp  --  anywhere             224.0.0.251         udp dpt:mdns
ACCEPT     udp  --  anywhere             anywhere            udp dpt:ipp
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ipp
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ftp
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:mysql
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:http
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

 

위 코드에서 보듯이 다시금 reject를 통해서 방화벽이 추가된 것을 확인할 수 있따.

 

이상이 IPTABLES의 PORT를 여는 방법에 대해서 서술 하였다.

 

 

                                                                            - 2012.07.02 랑이씀 -

 

반응형
반응형

요즘 보안에 관심이 무척이나 많아졌다. 과거 회사에서 근무시 운영서버에 로그인을 3회

정보 실패하였을 때 로그인 차단 기능이 존재하였다. 어떻게 구현하는것인지 궁금해서

한번 찾아 본 뒤에 셋팅법을 적도록 하겠다.

[1] Tool Search
인터넷을 뒤지다 좋은 Tool인 fall2ban 이라는 Tool을 찾게 되었다. 단순히 각 데몬별로
로그인 성공 / 실패 횟수를 지정하여 그 기준이 넘을 경우 iptables에 등록해 주는 Tool
이다.

[2] fail2ban Install
아주간단하게 설치하였다. 아래 화면을 참조하도록 한다.

$ sudo apt-get install fail2ban
[sudo] password for testId:
패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다
상태 정보를 읽는 중입니다... 완료
다음 새 패키지가 전에 자동으로 설치되었지만 더 이상 필요하지 않습니다:
  linux-headers-2.6.32-24 linux-headers-2.6.32-26 linux-headers-2.6.32-27 linux-headers-2.6.32-26-generic-pae linux-headers-2.6.32-27-generic-pae linux-headers-2.6.32-24-generic-pae
이들을 지우기 위해서는 'apt-get autoremove'를 사용하십시오.
다음 패키지를 더 설치할 것입니다:
  whois
제안하는 패키지:
  python-gamin mailx
다음 새 패키지를 설치할 것입니다:
  fail2ban whois
0개 업그레이드, 2개 새로 설치, 0개 지우기 및 65개 업그레이드 안 함.
127k바이트 아카이브를 받아야 합니다.
이 작업 후 1,016k바이트의 디스크 공간을 더 사용하게 됩니다.
계속 하시겠습니까 [Y/n]? Y
받기:1
http://gb.archive.ubuntu.com/ubuntu/ lucid/universe fail2ban 0.8.4-1ubuntu1 [96.0kB]
받기:2
http://gb.archive.ubuntu.com/ubuntu/ lucid/main whois 5.0.0ubuntu3 [30.7kB]
내려받기 127k바이트, 소요시간 3초 (41.5k바이트/초)
전에 선택하지 않은 fail2ban 패키지를 선택합니다.
(데이터베이스 읽는중 ...현재 116991개의 파일과 디렉토리가 설치되어 있습니다.)
fail2ban 패키지를 푸는 중입니다 (.../fail2ban_0.8.4-1ubuntu1_all.deb에서) ...
전에 선택하지 않은 whois 패키지를 선택합니다.
whois 패키지를 푸는 중입니다 (.../whois_5.0.0ubuntu3_i386.deb에서) ...
man-db에 대한 트리거를 처리하는 중입니다 ...
ureadahead에 대한 트리거를 처리하는 중입니다 ...
fail2ban (0.8.4-1ubuntu1) 설정하는 중입니다 ...

[3] 데몬별 차단 설정
path : /etc/fail2ban/jail.conf 파일을 수정하면된다.
아래 그림을 SSH 데몬의 차단 설정을 해놓은 예제이다.

[ssh]

enabled = true                     ==> ssh데몬 차단기능을 할것인지 설정(true/false)
port  = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 3                          ==> 요기있는것이 몇번 로그인실패시 차단할것인지 입력


이상이다. 실제 저런 경우 차단이 되면 iptables에 자동 등록된다.

[4] 차단해제
관리자에게 연락 후 차단 해제시에는 다음과 같은 명령을 입력하도록 한다.

sudo iptables -D fail2ban-ssh -s 210.93.54.140 -j DROP

[5] 끝
다양한 해킹 시도에는, 막는방법에는 여러가지가 있다. 난 개인적으로 Application에서 막는것보다 물리적으로 막는것을 좋아라 하지만, 이문제는 돈이 드는 문제라, Application에서 막는 방법에 대해서라도 자세히 알아두는 것이 좋다고 생각한다.

                                                                   - 2011.02.18 랑이씀 -

반응형

'Server > Linux' 카테고리의 다른 글

[ VIM 창 분할하기 ]  (2) 2011.02.23
[ 파티션 설정 ]  (0) 2011.02.21
[ iptables 를 이용한 국가별 차단 ]  (10) 2011.02.15
[ SSH 터널링 팁 ]  (0) 2011.02.13
Ubuntu Logs Explain  (0) 2011.02.08
반응형
중국의 짱개 / 이태리 양키 이런놈들이 자꾸 나의 서버를 침입한다.
이놈들을 막기 위해 방화벽을 설치 후 간단한 Script를 돌려 차단하였다.
iptables를 이용하면 간단하게 막을 수가 있다.

iptables를 이용하여 국가별 접속을 차단하는 방법에는 2가지가 있다.
(1) Kernel을 업데이트 한 후 iptables를 이용하는 방법
(2) Script를 이용하는 방법

나는 아직 Kernel Level에서 접근하는 법을 확실히 익히지 못하여 (2) 번 레벨에서 막도록 하겠다.

[1] 접속한 IP찾기
/var/log/auth.log를 뒤져 보면 아래와 같은 메시지가 뜬다.
1 18:Feb 13 13:14:03 xxxxx pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=200.27.62.186
2 22:Feb 13 13:14:07 xxxxx pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=200.27.62.186
3 25:Feb 13 13:14:09 xxxxx pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=200.27.62.186

위에서 얼핏보면 알겠지만 220.27.62.186 에서 자꾸 접속을 시도한다. 저놈이 도대체 어느나라 놈인지 알아보자.


대충 보아하나 칠레쪽 양키놈이다. 아~~~ 내서버에 뭔 볼일이 있다고 ㅠㅠㅠ 이제 저놈을
막도록 하자. 참고적으로 오늘부터 칠레 놈들이 싫어졌다.

[2] 국가별 Network 정보 Download하기
URL :
http://geolite.maxmind.com/download/geoip/database/ 
위 URL로 가서 가장 최신으로 업데이트 된 Network 정보를 가져온다.
파일(GeoIPCountryWhois.csv) 을 열어보면 아래와 같다.

     1 "1.0.0.0","1.7.255.255","16777216","17301503","AU","Australia"
     2 "1.9.0.0","1.9.255.255","17367040","17432575","MY","Malaysia"
     3 "1.10.10.0","1.10.10.255","17435136","17435391","AU","Australia"
     4 "1.11.0.0","1.11.255.255","17498112","17563647","KR","Korea, Republic of"
     5 "1.12.0.0","1.15.255.255","17563648","17825791","CN","China"
     6 "1.16.0.0","1.19.255.255","17825792","18087935","KR","Korea, Republic of"
     7 "1.21.0.0","1.21.255.255","18153472","18219007","JP","Japan"
     8 "1.22.0.0","1.23.255.255","18219008","18350079","IN","India"
     9 "1.24.0.0","1.31.255.255","18350080","18874367","CN","China"
    10 "1.33.0.0","1.33.255.255","18939904","19005439","JP","Japan"
    11 "1.34.0.0","1.35.255.255","19005440","19136511","TW","Taiwan"
    12 "1.36.0.0","1.36.255.255","19136512","19202047","HK","Hong Kong"

앞에껀 순번 | startNetwork | EndNetwork | ,,, | 국가 이런 순이다. 그럼 위 정보를 파싱하여
Script를 만들어 보도록 하자.

[3] Script 생성하기

#! /bin/bash
echo "########## IP BLOCK Script START ###########"
# iptables init
sudo iptables -P INPUT ACCEPT
sudo iptables -F
echo "IPTABLES INIT SUCCESS"

BLOCK_LIST_FILE=./GeoIPCountryWhois.csv
echo "BLOCK LIST FILE = $BLOCK_LIST_FILE"

# ADD BLOCK TARGET LIST
BLOCK_TARGET_COUNTRY="China|France|Chile"

# REGIST BLOCK IP FOR LOOP
for IP_BANDWIDTH in `egrep $BLOCK_TARGET_COUNTRY $BLOCK_LIST_FILE | awk -F, '{print $1, $2}' | awk -F\"  '{print $2"-"$4}'`

do
   sudo iptables -I INPUT -p all -m iprange --src-range $IP_BANDWIDTH -j DROP
done

sudo iptables -L
echo "################### IP BLOCK Script END ############# "


위 스크립트는 랑이가 짠것이다. awk를 이해 하고 있다면, 아주 쉽게 만들수 있다.

만약 허용국가만 포함하고 싶을때에는 egrep의 조건을 조금 바꾸어주면된다.

#! /bin/bash
echo "########## IP BLOCK Script START ###########"
# iptables init
sudo iptables -P INPUT ACCEPT
sudo iptables -F
echo "IPTABLES INIT SUCCESS"

BLOCK_LIST_FILE=./GeoIPCountryWhois.csv
echo "BLOCK LIST FILE = $BLOCK_LIST_FILE"

# ADD BLOCK TARGET LIST
ALLOW_TARGET_COUNTRY="Korea"

# REGIST BLOCK IP FOR LOOP
for IP_BANDWIDTH in `egrep -v $ALLOW_TARGET_COUNTRY $BLOCK_LIST_FILE | awk -F, '{print $1, $2}' | awk -F\" '{print $2"-"$4}'`

do
sudo iptables -I INPUT -p all -m iprange --src-range $IP_BANDWIDTH -j DROP
done

sudo iptables -L
echo "################### IP BLOCK Script END ############# "

노란색으로 표현한 부분은 간단한 grep 명령이므로 별도로 설명안해도 될듯하다.

[4] Script 실행

########## IP BLOCK Script START ###########
IPTABLES INIT SUCCESS
BLOCK LIST FILE = ./GeoIPCountryWhois.csv


DROP       all  --  anywhere             anywhere            source IP range 1.202.0.0-1.207.255.255
.........
.........
.........

DROP       all  --  anywhere             anywhere            source IP range 1.12.0.0-1.15.255.255

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
################## IP BLOCK Script END #############


다됐따 ㅋㅋㅋ 요렇게 하면 무사히 작업이 완료된다.

이 글을 쓰니 괜시리 애국심이 막 불타온다. 나도 언젠간 짱깨 / 양키 놈들 서버 들어가서 해집고 다니는 실력자가 되어야 겠다 .ㅋㅋㅋㅋ 이제 중국|프랑스|칠레 의 나쁜시키들이 안들어오겠지? 낼도 로그를 지켜봐야겠당 ㅋㅋ

                                                             - 2011.02.15 랑이씀 -
반응형

'Server > Linux' 카테고리의 다른 글

[ 파티션 설정 ]  (0) 2011.02.21
[ 로그인 N번 실패시 아이피 차단 ]  (2) 2011.02.18
[ SSH 터널링 팁 ]  (0) 2011.02.13
Ubuntu Logs Explain  (0) 2011.02.08
Tomcat Parameters: Invalid Error 해결법  (0) 2011.02.04

+ Recent posts