일상의 정리

IPtables를 이용한 DDoS 방어: 궁극의 가이드

리눅스/해킹


DDoS Protection With IPtables: The Ultimate Guide 글을 번역한 내용입니다.

원본 글: https://javapipe.com/ddos/blog/iptables-ddos-protection/


iptables에 대한 자체 DDoS 방지 규칙을 작성하는 여러 가지 방법이 있습니다.

우리는 이 포괄적 인 튜토리얼에서 가장 효과적인 iptables DDoS 보호 방법을 논의 할 것입니다.


이 가이드는 다음을 수행하는 방법을 알려줍니다.

DDoS 공격을 막기 위한 iptables 테이블과 체인을 선택
DDoS 공격의 영향을 줄이기 위한 커널 설정 조정
iptables를 사용하여 대부분의 TCP 기반 DDoS 공격 차단
iptables SYNPROXY를 사용하여 SYN 플러드를 차단하기


이 글은 리눅스 서버를 매일 다루는 전문가를 대상으로 작성되었습니다.

온라인 애플리케이션을 DDoS 공격으로부터 보호하려는 경우 원격 보호, DDoS 보호 기능이있는 VPS 또는 DDoS로 보호 된 베어 메탈 (Bare Metal) 서버를 사용할 수 있습니다.
iptables로 DDoS 공격을 차단할 수는 있지만 대규모 DDoS 플러드를 탐지하고 차단하기 위한 실제 하드웨어 방화벽 (최근에 DDoS 완화를 위해 하드웨어를 검토 한 방법)을 대체할 수는 없습니다.
그러나 iptables를 사용하여 회선 속도로 대부분의 불량 트래픽을 필터링하는 것은 불가능하지 않습니다!
우리는 TCP 기반 공격으로부터만 보호할 것입니다. 대부분의 UDP 기반 공격은 모든 공통 서버의 네트워크 인터페이스 카드를 소모하는 증폭된 반사 공격입니다.
이러한 유형의 공격에 대처하는 유일한 완화 접근법은 에지 네트워크 또는 코어 네트워크 또는 캐리어에서 미리 차단하는 것입니다.

우리는 현재 일리노이 주 시카고와 루마니아의 부카레스트에서 측정되지 않은 대역폭과 DDoS 보호 기능을 갖춘 VPS를 제공하고 있다는 것을 알고 계셨습니까?
그들이 서버에 연결할 수 있다면 DDoS로 보호되는 네트워크로 이동하는 것을 제외하고는 다중 Gbit / s 공격에 대해 할 수있는 일이 많지 않습니다.

IPtables 란?
netfilter iptables (곧 nftables로 대체)는 netfilter에서 개발 한 커널 패킷 필터링 규칙을 구성하는 사용자 공간 명령행 유틸리티입니다.
리눅스 시스템의 기본 방화벽 관리 유틸리티입니다. 리눅스 시스템을 사용하는 모든 사람들은 익숙하거나 적어도 들어 봤어야 합니다.
iptables는 특정 패킷을 필터링하고, 소스 또는 대상 포트 및 IP 주소를 차단하고, NAT를 통해 패킷을 전달하고 다른 많은 것들을 사용할 수 있습니다.
가장 일반적으로 대상 포트와 소스 IP 주소를 차단하는 데 사용됩니다.


왜 IPtables Anti-DDoS 규칙일까?

현재 iptables가 DDoS 공격을 막는 규칙을 이해하는 이유를 알아보기 위해 iptables의 작동 방식을 먼저 이해해야 합니다.

iptables는 IP 패킷 필터 규칙 테이블을 설정하고 제어하는 ​​데 사용되는 명령행 도구입니다. 목적에 따라 다른 테이블이 있습니다.

IPtables 테이블

Filter : Filter 테이블은 -t (-table) 옵션을 사용하지 않으면 규칙이 사용하는 가장 일반적으로 사용되는 기본 테이블입니다.

Nat :이 테이블은 NAT(Network Address Translation:네트웍 주소 전달)에 사용됩니다. 패킷이 새로운 연결을 생성하면 nat 테이블에 규칙이 있는지 검사합니다(역주: 쉽게 설명하자면 인터넷 공유기 역할).

Mangle : mangle 테이블은 패킷과 헤더 정보를 수정하거나 표시하는 데 사용됩니다.

Raw :이 테이블의 목적은 주로 NOTRACK 대상을 사용하는 연결 추적에서 특정 패킷을 제외하는 것입니다.

위에서 보듯이 표준이 아닌 커널 모듈이 로드되지 않은 일반 Linux 시스템에는 네 가지 테이블이 있습니다. 이 테이블 각각은 iptables 체인의 다른 세트를 지원합니다.


IPtables Chains

PREROUTING: raw, nat, mangle

  • 네트워크 인터페이스 카드 (NIC)에 들어가는 패킷에 적용됩니다.

INPUT: filter, mangle

  • 로컬 소켓을 대상으로하는 패킷에 적용됩니다.

FORWARD: filter, mangle

  • 서버를 통해 라우팅되는 패킷에 적용됩니다.

OUTPUT: raw, filter, nat, mangle

  • 서버가 전송하는 패킷 (로컬에서 생성 된 패킷)에 적용됩니다.

POSTROUTING: nat, mangle

  • 서버에서 나가는 패킷에 적용됩니다.


차단하거나 수정할 패킷의 종류에 따라 특정 iptables 테이블과 선택한 테이블이 지원하는 체인을 선택합니다.

물론, 우리는 여전히 iptables 타겟 (ACCEPT, DROP, REJECT 등)에 대한 설명을 하지 않고 있지만 이 기사를 읽는다면 이미 iptables를 다루는 방법을 알고 있다고 가정하고 있습니다.

우리는 왜 iptables 규칙이 DDoS를 멈추고, iptables 사용법을 가르쳐주지 않는지 설명 할 것입니다. 다시 생각해 봅시다.

iptables로 DDoS 공격을 차단하려면 iptables 규칙의 성능이 매우 중요합니다. 대부분의 TCP 기반 DDoS 공격 유형은 높은 패킷 전송률을 사용합니다. 즉, 초당 패킷 수는 서버가 다운되는 원인입니다.

따라서 가능한 한 초당 많은 패킷을 처리하고 차단할 수 있는지 확인해야합니다.

iptables를 사용하여 DDoS 공격을 차단하는 방법에 대한 대부분의 지침은 전부는 아니지만 대부분의 경우 DDoS 방지 규칙에 필터 테이블과 INPUT 체인을 사용합니다.

이 접근 방식의 문제점은 INPUT 체인이 PREROUTING 및 FORWARD 체인 후에만 ​​처리되므로 패킷이 이 두 체인 중 하나와 일치하지 않는 경우에만 적용된다는 것입니다.

이로 인해 자원을 소비하는 패킷의 필터링이 지연됩니다. 결론적으로 우리는 규칙을 최대한 효과적으로 만들기 위해서는 우리의 anti-DDoS 규칙을 가능하면 체인까지 멀리 옮겨야합니다.

패킷에 적용 할 수있는 첫 번째 체인은 PREROUTING 체인이므로 이상적으로 이 체인의 잘못된 패킷을 필터링해야합니다.

그러나 필터 테이블은 PREROUTING 체인을 지원하지 않습니다. 이 문제를 해결하기 위해 안티 DDoS iptables 규칙에 필터 테이블 대신 mangle 테이블을 사용하면됩니다.

필터 테이블이 지원하는 모든 규칙은 아니지만 대부분의 iptables 체인을 지원합니다.


그래서 iptables DDoS 보호 규칙이 왜 엉망이되는지 알고 싶습니까? 불량 패킷을 차단하기 위해 필터 테이블과 INPUT 체인을 사용하기 때문입니다!

iptables 규칙의 성능을 극적으로 향상시키고 따라서 필터링 할 수있는 (TCP) DDoS 공격 트래픽의 양을 극적으로 증가시키는 최상의 솔루션은 mangle 테이블과 PREROUTING 체인을 사용하는 것입니다!


DDoS를 완화하는 최고의 Linux 커널 설정

또 다른 일반적인 실수는 사람들이 DDoS 공격의 효과를 더 잘 완화하기 위해 최적화된 커널 설정을 사용하지 않는다는 것입니다.

이 가이드는 CentOS 7을 선택한 운영 체제로 중점적으로 설명합니다. CentOS 7에는 iptables의 최신 버전과 새로운 SYNPROXY 대상 지원 기능이 포함되어 있습니다.

iptables로 DDoS를 효과적으로 완화하기 위해 조정해야하는 모든 단일 커널 설정은 다루지 않습니다.

대신 CentOS 7 커널 설정을 제공합니다. 아래의 내용을 /etc/sysctl.conf 파일에 넣고 sysctl -p와 함께 설정을 적용하십시오.


Anti-DDoS Kernel Settings (sysctl.conf)

kernel.printk = 4 4 1 7 
kernel.panic = 10 
kernel.sysrq = 0 
kernel.shmmax = 4294967296 
kernel.shmall = 4194304 
kernel.core_uses_pid = 1 
kernel.msgmnb = 65536 
kernel.msgmax = 65536 
vm.swappiness = 20 
vm.dirty_ratio = 80 
vm.dirty_background_ratio = 5 
fs.file-max = 2097152 
net.core.netdev_max_backlog = 262144 
net.core.rmem_default = 31457280 
net.core.rmem_max = 67108864 
net.core.wmem_default = 31457280 
net.core.wmem_max = 67108864 
net.core.somaxconn = 65535 
net.core.optmem_max = 25165824 
net.ipv4.neigh.default.gc_thresh1 = 4096 
net.ipv4.neigh.default.gc_thresh2 = 8192 
net.ipv4.neigh.default.gc_thresh3 = 16384 
net.ipv4.neigh.default.gc_interval = 5 
net.ipv4.neigh.default.gc_stale_time = 120 
net.netfilter.nf_conntrack_max = 10000000 
net.netfilter.nf_conntrack_tcp_loose = 0 
net.netfilter.nf_conntrack_tcp_timeout_established = 1800 
net.netfilter.nf_conntrack_tcp_timeout_close = 10 
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 10 
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 20 
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 20 
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 20 
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 20 
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 10 
net.ipv4.tcp_slow_start_after_idle = 0 
net.ipv4.ip_local_port_range = 1024 65000 
net.ipv4.ip_no_pmtu_disc = 1 
net.ipv4.route.flush = 1 
net.ipv4.route.max_size = 8048576 
net.ipv4.icmp_echo_ignore_broadcasts = 1 
net.ipv4.icmp_ignore_bogus_error_responses = 1 
net.ipv4.tcp_congestion_control = htcp 
net.ipv4.tcp_mem = 65536 131072 262144 
net.ipv4.udp_mem = 65536 131072 262144 
net.ipv4.tcp_rmem = 4096 87380 33554432 
net.ipv4.udp_rmem_min = 16384 
net.ipv4.tcp_wmem = 4096 87380 33554432 
net.ipv4.udp_wmem_min = 16384 
net.ipv4.tcp_max_tw_buckets = 1440000 
net.ipv4.tcp_tw_recycle = 0 
net.ipv4.tcp_tw_reuse = 1 
net.ipv4.tcp_max_orphans = 400000 
net.ipv4.tcp_window_scaling = 1 
net.ipv4.tcp_rfc1337 = 1 
net.ipv4.tcp_syncookies = 1 
net.ipv4.tcp_synack_retries = 1 
net.ipv4.tcp_syn_retries = 2 
net.ipv4.tcp_max_syn_backlog = 16384 
net.ipv4.tcp_timestamps = 1 
net.ipv4.tcp_sack = 1 
net.ipv4.tcp_fack = 1 
net.ipv4.tcp_ecn = 2 
net.ipv4.tcp_fin_timeout = 10 
net.ipv4.tcp_keepalive_time = 600 
net.ipv4.tcp_keepalive_intvl = 60 
net.ipv4.tcp_keepalive_probes = 10 
net.ipv4.tcp_no_metrics_save = 1 
net.ipv4.ip_forward = 0 
net.ipv4.conf.all.accept_redirects = 0 
net.ipv4.conf.all.send_redirects = 0 
net.ipv4.conf.all.accept_source_route = 0 
net.ipv4.conf.all.rp_filter = 1

이 sysctl.conf 설정은 DDoS 하에서 서버의 성능을 최대화하는 것은 물론이 가이드에서 제공 할 iptables 규칙의 효과를 돕습니다.


실제 IPtables Anti-DDoS 규칙

DDoS 공격의 영향을 완화하기 위해 최적화 된 커널 설정뿐만 아니라 mangle 테이블과 PREROUTING 체인을 사용해야한다는 사실을 알았으므로 대부분의 TCP DDoS 공격을 완화하기위한 몇 가지 예제 규칙으로 이동합니다.

DDoS 공격은 복잡합니다.

DDoS에는 여러 가지 유형이 있으며 모든 서비스에 대해 서명 기반 규칙을 유지하는 것은 거의 불가능합니다.

다행히도 연결 추적 (nf_conntrack 커널 모듈)이라는 것이 있습니다. 이는 합법적인 것으로 보이는 SYN 패킷을 사용하지 않는 거의 모든 TCP 기반 DDoS 공격을 완화하는 데 도움이 될 수 있습니다.

여기에는 가짜 TCP 플래그를 사용하는 모든 유형의 ACK 및 SYN-ACK DDoS 공격과 DDoS 공격이 포함됩니다.

우리는 이미 5 개의 간단한 iptables 규칙으로 시작하여 많은 TCP 기반 DDoS 공격을 차단할 것입니다.


잘못된 패킷 차단

iptables -t mangle -A PREROUTING -m conntrack --ctstate INVALID -j DROP

이 규칙은 SYN 패킷이 아니며 설정된 TCP 연결에 속하지 않는 모든 패킷을 차단합니다.


SYN이 아닌 새 패킷 차단

iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP
이렇게하면 새 패킷 (설정된 연결에 속하지 않음)이 모두 차단되고 SYN 플래그는 사용되지 않습니다. 이 규칙은 "잘못된 패킷 차단" 규칙과 유사하지만 다른 패킷이 포착하지 않는 패킷을 발견합니다.

흔하지 않은 MSS 값 차단
iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP
위의 iptables 규칙은 공통적이지 않은 TCP MSS 값을 사용하는 새로운 패킷을 차단합니다 (SYN 패킷 만 이전 두 규칙에 따라 새 패킷이 될 수 있음). 이렇게 하면 벙어리 SYN 플러드를 차단하는 데 도움이됩니다.

가짜 TCP 플래그가있는 패킷 차단

iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

위의 룰셋은 가짜 TCP 플래그(합법적인 패킷이 사용하지 않는 TCP 플래그)를 사용하는 패킷을 차단합니다.

개인 서브넷의 패킷 차단 (스푸핑)

iptables -t mangle -A PREROUTING -s 224.0.0.0/3 -j DROP 
iptables -t mangle -A PREROUTING -s 169.254.0.0/16 -j DROP 
iptables -t mangle -A PREROUTING -s 172.16.0.0/12 -j DROP 
iptables -t mangle -A PREROUTING -s 192.0.2.0/24 -j DROP 
iptables -t mangle -A PREROUTING -s 192.168.0.0/16 -j DROP 
iptables -t mangle -A PREROUTING -s 10.0.0.0/8 -j DROP 
iptables -t mangle -A PREROUTING -s 0.0.0.0/8 -j DROP 
iptables -t mangle -A PREROUTING -s 240.0.0.0/5 -j DROP 
iptables -t mangle -A PREROUTING -s 127.0.0.0/8 ! -i lo -j DROP
이러한 규칙은 개인 (로컬) 서브넷에서 생성 된 스푸핑 된 패킷을 차단합니다. 공용 네트워크 인터페이스에서 일반적으로 개인 원본 IP로부터 패킷을 수신하지 않으려 고합니다.

이 규칙은 루프백 인터페이스가 127.0.0.0/8 IP 공간을 사용한다고 가정합니다.

이 다섯 가지 규칙만으로도 매우 높은 패킷 속도에서 많은 TCP 기반 DDoS 공격을 차단할 수 있습니다.

위에서 언급 한 커널 설정과 규칙을 사용하면 회선 속도로 ACK 및 SYN-ACK 공격을 필터링 할 수 있습니다.

추가 규칙

iptables -t mangle -A PREROUTING -p icmp -j DROP

이렇게하면 모든 ICMP 패킷이 삭제됩니다. ICMP는 호스트가 아직 살아 있는지를 핑 (ping)하는 데에만 사용됩니다. 일반적으로 필요하지 않으며 공격자가 악용 할 수있는 또 다른 취약점만을 나타 내기 때문에 Ping of Death (ping flood), ICMP flood 및 ICMP fragmentation flood를 완화하기 위해 모든 ICMP 패킷을 차단합니다.

iptables -A INPUT -p tcp -m connlimit --connlimit-above 80 -j REJECT --reject-with tcp-reset

이 iptables 규칙은 연결 공격에 도움이됩니다. 연결이 80 개 이상인 호스트의 연결을 거부합니다. 문제가 발생할 경우 제한을 늘려야합니다. 이는 많은 수의 TCP 연결을 설정하는 합법적 인 클라이언트에게 문제를 일으킬 수 있기 때문입니다.

iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m limit --limit 60/s --limit-burst 20 -j ACCEPT 
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j DROP

클라이언트가 초당 설정할 수있는 새로운 TCP 연결을 제한합니다. 이것은 연결 공격에 유용 할 수 있지만 일반적으로 SYN 홍수에 대해서는 그다지 많지 않습니다. 왜냐하면 일반적으로 끝없이 다른 스푸핑 된 소스 IP를 사용하기 때문입니다.

iptables -t mangle -A PREROUTING -f -j DROP

이 규칙은 단편화 된 패킷을 차단합니다. 일반적으로 UDP는 필요하지 않으며 UDP 단편화를 완화합니다. 하지만 대부분의 시간 동안 UDP 조각화는 네트워크 카드의 용량을 소모 할 수있는 많은 양의 대역폭을 사용합니다.이 규칙은 선택 사항이며 아마도 가장 유용하지는 않습니다.

iptables -A INPUT -p tcp --tcp-flags RST RST -m limit --limit 2/s --limit-burst 2 -j ACCEPT 
iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP

이것은 들어오는 TCP RST 패킷을 제한하여 TCP RST 플러드를 완화합니다. 이 규칙의 효과는 의문의 대상입니다.


SYNPROXY로 SYN 홍수를 완화하십시오

SYNPROXY는 Linux 커널 버전 3.12 및 iptables 1.4.21에 추가 된 iptables의 새로운 대상입니다. CentOS 7은이 기능을 백 포트하고 3.10 기본 커널에서 사용할 수 있습니다.

SYNPROXY의 목적은 SYN 패킷을 보낸 호스트가 실제로 전체 TCP 연결을 설정하는지 또는 SYN 패킷을 보낸 후에 아무 것도 수행하지 않는지 확인하는 것입니다.

아무것도 수행하지 않으면 성능에 미치는 영향을 최소화하면서 패킷을 버립니다.

위에서 제공 한 iptables 규칙은 대부분의 TCP 기반 공격을 차단하지만 SYN 홍수만큼 정교 해지면 여전히 공격 유형을 통과 할 수 있습니다.

패킷 길이 (-m 길이), TOS (-m tos), TTL (-m ttl) 또는 문자열과 같이 차단할 특정 패턴이나 서명을 발견하면 규칙의 성능이 항상 향상된다는 점에 유의해야합니다 및 16 진수 값 (고급 사용자의 경우 -m 문자열 및 -m u32)

그러나 드물기는하지만 가능하지 않거나 달성하기가 쉽지 않은 경우도 있습니다. 따라서 이러한 경우 SYNPROXY를 사용할 수 있습니다.

다음은 다른 규칙을 우회하는 SYN 플러드를 완화하는 데 도움이되는 iptables SYNPROXY 규칙입니다.

SYNPROXY IPtables 규칙
아래 단추 중 하나를 사용하여 SYNPROXY 규칙의 잠금을 해제하십시오.
처럼
짹짹
+1
오류

이 규칙은 모든 포트에 적용됩니다. 활성화 된 특정 TCP 포트에서만 SYNPROXY를 사용하려면 (권장 - 또한 mangle 테이블과 PREROUTING 체인을 사용하여 사용하지 않는 모든 TCP 포트를 차단해야 함) 각 규칙에 -dport 80을 추가하면됩니다 포트 80에서만 SYNPROXY를 사용하려는 경우.

SYNPROXY가 작동하는지 확인하려면 -n1 cat / proc / net / stat / synproxy 명령을 사용하십시오. SYNPROXY를 사용하는 포트에 대해 새 TCP 연결을 설정할 때 값이 변경되면 작동합니다.


The Complete IPtables Anti-DDoS Rules

이 기사에서 설명한 각 단일 규칙을 복사하여 붙여 넣지 않으려면 Linux 서버의 기본 DDoS 보호를 위해 아래의 규칙 집합을 사용할 수 있습니다.

### 1: Drop invalid packets ### 
/sbin/iptables -t mangle -A PREROUTING -m conntrack --ctstate INVALID -j DROP  

### 2: Drop TCP packets that are new and are not SYN ### 
/sbin/iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP 
 
### 3: Drop SYN packets with suspicious MSS value ### 
/sbin/iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP  

### 4: Block packets with bogus TCP flags ### 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP  

### 5: Block spoofed packets ### 
/sbin/iptables -t mangle -A PREROUTING -s 224.0.0.0/3 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 169.254.0.0/16 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 172.16.0.0/12 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 192.0.2.0/24 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 192.168.0.0/16 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 10.0.0.0/8 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 0.0.0.0/8 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 240.0.0.0/5 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 127.0.0.0/8 ! -i lo -j DROP  

### 6: Drop ICMP (you usually don't need this protocol) ### 
/sbin/iptables -t mangle -A PREROUTING -p icmp -j DROP  

### 7: Drop fragments in all chains ### 
/sbin/iptables -t mangle -A PREROUTING -f -j DROP  

### 8: Limit connections per source IP ### 
/sbin/iptables -A INPUT -p tcp -m connlimit --connlimit-above 111 -j REJECT --reject-with tcp-reset  

### 9: Limit RST packets ### 
/sbin/iptables -A INPUT -p tcp --tcp-flags RST RST -m limit --limit 2/s --limit-burst 2 -j ACCEPT 
/sbin/iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP  

### 10: Limit new TCP connections per second per source IP ### 
/sbin/iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m limit --limit 60/s --limit-burst 20 -j ACCEPT 
/sbin/iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j DROP  

### 11: Use SYNPROXY on all ports (disables connection limiting rule) ### 
# Hidden - unlock content above in "Mitigating SYN Floods With SYNPROXY" section

Bonus Rules

다음은 Linux 서버의 전반적인 보안을 향상시키는 데 유용한 iptables 규칙입니다.

### SSH brute-force protection ### 
/sbin/iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --set 
/sbin/iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 10 -j DROP  

### Protection against port scanning ### 
/sbin/iptables -N port-scanning 
/sbin/iptables -A port-scanning -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j RETURN 
/sbin/iptables -A port-scanning -j DROP

결론

이 튜토리얼은 iptables를 사용하여 DDoS 공격을 막는 가장 강력하고 효과적인 방법을 보여줍니다.

우리는 iptables 규칙을 사용하여 초당 수백만 패킷으로 정점에 도달 한 DDoS 공격을 성공적으로 완화했습니다.

우리가 조사한 동일한 주제에 대한 모든 가이드는 DDoS 트래픽을 막을 수있는 비효율적 인 방법이나 iptables 규칙의 제한된 수를 제공했습니다.

정확하게 사용된다면, iptables는 1GigE NIC의 회선 속도와 10GigE NIC의 회선 속도에 가까운 DDoS 공격을 차단할 수있는 매우 강력한 도구입니다.

iptables의 힘을 과소 평가하지 마십시오!







Ubuntu 16.04.1 MariaDB + Tomcat 9 + Apache 2.4 + PHP 7.1 설치

리눅스/설치

1. MariaDB 설치

공식 미러를 통한 Maria DB 설치

아래 명령을 실행하여 공식 Repository로 부터 Maria DB를 설치한다.

# apt install software-properties-common
# apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
# add-apt-repository 'deb [arch=amd64,i386] http://ftp.kaist.ac.kr/mariadb/repo/10.2/ubuntu xenial main'

키를 가져오고 저장소가 추가되었으면, 다음 명령으로 Maria DB를 설치한다.

# apt update

# apt install mariadb-server

Maria DB 보안 설정

설치 후 DB접속 전에 Maria DB의 보안을 설정한다. (익명 사용자 및 Test DB 제거)

# mysql_secure_installation

Maria DB 연결

Maria DB 인스턴스에 접속한다.

# mysql -u root -p

로컬 사용자 추가

mysql> create user 'user'@'localhost' identified by 'password';

로컬 및 원격 사용자 추가

mysql> create user 'user'@'%' identified by 'password';

DB권한 설정

    grant all privileges on [DB_NAME].* to 'user'@'%'; //특정 DB

    grant all privileges on *.* to 'user'@'%'; //모든 DB

    flush privileges;

Character set UTF-8설정

다음 내용을 /etc/mysql/my.cnf 에 추가한다.

[client]

default-character-set=utf8

[mysqld]

init_connect='SET collation_connection = utf8_unicode_ci'

init_connect='SET NAMES utf8'

character-set-server=utf8

collation-server=utf8_unicode_ci

Maria DB restart

# service mariadb restart


2. Tomcat 9 설치

관련 파일 다운로드

다음 파일을 다운로드 한다.

Tomcat 9.0 : http://tomcat.apache.org/download-90.cgi

Tomcat Native: http://tomcat.apache.org/download-native.cgi

Tomcat Connector : http://tomcat.apache.org/download-connectors.cgi

apr: http://apache.mirror.cdnetworks.com/apr/apr-1.6.2.tar.gz

사용자 추가

Tomcat 구동 사용자를 추가한다.

# useradd -s /bin/false -d /usr/local/tomcat tomcat

의존성 파일 설치

설치를 위해 아래 파일을 먼저 설치한다.

# apt install libssl-dev libexpat1-dev

APR 설치

# tar zxvf apr-1.6.2.tar.gz

# cd apr-1.6.2

# ./configure --prefix=/usr/local/apr

#make && make install


만약 cannot remove 'libtoolT': No such file or directory 에러 발생 시 아래 명령 후 다시 실행

cp -arp libtool libtoolT

JDK 설치

오라클 공식 Repository를 통해 JDK 를 설치한다.

# add-apt-repository ppa:webupd8team/java

# apt update

# apt install oracle-java9-installer

Tomcat 9.0 설치

tar xvzf apache-tomcat-9.0.0.M26.tar.gz

mv apache-tomcat-9.0.0.M26 /usr/local/

ln -s /usr/local/apache-tomcat-9.0.0.M26/ /usr/local/tomcat

Tomcat 사용자 권한 설정

chown -R tomcat:tomcat /usr/local/tomcat/

chmod -R g+r /usr/local/tomcat/conf

chmod g+x /usr/local/tomcat/conf

JAVA_HOME 확인

Tomcat Native 컴파일 시 JAVA_HOME을 지정해 주어야 한다. 다음 명령으로 확인한다.

update-java-alternatives -l

Tomcat Native 설치

tar xvzf tomcat-native-1.2.14-src.tar.gz

cd tomcat-native-1.2.14-src/native

./configure --with-apr=/usr/local/apr --with-java-home=/usr/lib/jvm/java-9-oracle

make && make install

환경파일 구성

/etc/profile 파일의 마지막에 다음 행 추가

export LD_LIBRARAY_PATH=/usr/local/apr/lib

export TOMCAT_HOME=/usr/local/tomcat

export PATH=$TOMCAT_HOME/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib

설치내용 확인

# source /etc/profile
# java -version
************* 다음 내용이 출력되면 성공 ***************************
java version "9"
Java(TM) SE Runtime Environment (build 9+181)
Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)
**********************************************************************

방화벽 포트 오픈

다음 명령으로 방화벽에서 8080 포트를 열어 준다.

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
# iptables-save > /etc/iptables.rules
/etc/network/interfaces 파일에 아래 라인 추가
pre-up iptables-restore < /etc/iptables.rules

Tomcat 시작

# /usr/local/tomcat/bin/startup.sh

Tomcat 동작 확인

웹브라우저에서 서버의 IP와 포트를 입력하여 접속되는 지 확인

http://server-ip:8080/

구동파일 생성

다음 명령으로 tomcat Service 파일 생성

# vi /etc/systemd/system/tomcat.service

/etc/systemd/system/tomcat.service

[Unit]
Description=Apache Tomcat Web Application Container
After=network.target

[Service]
Type=forking

Environment=JAVA_HOME=/usr/lib/jvm/java-9-oracle
Environment=CATALINA_PID=/usr/local/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/usr/local/tomcat
Environment=CATALINA_BASE=/usr/local/tomcat
Environment='CATALINA_OPTS=-Xms1024M -Xmx4096M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'

ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh

User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target
구동파일 권한 설정
# chmod 755 /etc/systemd/system/tomcat.service
서비스 파일 reload
# systemctl daemon-reload

Tomcat 서비스 시작/종료

시작

# systemctl start tomcat

종료

# systemctl stop tomcat

부팅 시 Tomcat 서비스 시작

# systemctl enable tomcat

3. Apache 설치

관련 파일 다운로드

다음 파일을 다운로드 한다.
apr-iconv: http://apache.mirror.cdnetworks.com/apr/apr-iconv-1.2.1.tar.gz
apr-util: http://apache.mirror.cdnetworks.com/apr/apr-util-1.6.0.tar.gz
apache: http://apache.mirror.cdnetworks.com/httpd/httpd-2.4.27.tar.gz
pcre: ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.41.tar.gz

apr-iconv 설치

# tar zxvf apr-iconv-1.2.1.tar.gz

# cd apr-iconv-1.2.1

# ./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr

# make && make install

apr-util 설치

# tar zxvf apr-util-1.6.0.tar.gz
# cd apr-util-1.6.0
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv
# make && make install

pcre 설치

# tar zxvf pcre-8.41.tar.gz
# cd pcre-8.41/
# ./configure --libdir=/usr/local/lib
# make && make install

사용자 추가

apache 구동 사용자를 추가한다.

# useradd -s /bin/false -d /usr/local/apache apache

Apache 설치

# tar xvzf httpd-2.4.27.tgz
# cd httpd-2.4.27
# ./configure --prefix=/usr/local/apache \
--enable-authn-alias \
--enable-cache \
--enable-file-cache \
--enable-mem-cache \
--enable-disk-cache \
--enable-mods-shared=most \
--enable-proxy=shared \
--enable-proxy-ajp=shared \
--enable-proxy-ajp=shared \
--enable-dav=shared \
--with-apr=/usr/local/apr/ \
--with-apr-util=/usr/local/apr-util/ \
--enable-ssl \
--enable-dav \
--enable-cgi \
--with-mpm=event \
--enable-cgid \
--enable-vhost-alias \
--enable-rewrite \
--enable-forward=shared \
--enable-proxy-connect=shared \
--enable-proxy-http=shared \
--enable-deflate=shared \
--enable-so \
--enable-headers=shared \
--enable-include=shared \
--enable-rewrite=shared
# make&&make install
make 도중 undefined reference to `XML_GetErrorCode' 에러 발생 시
vi build/config_vars.mk 파일 수정해서
AP_LIBS = 시작하는 라인을 찾아
-lexpat를 추가 후 다시 make

Apache 구동 사용자 설정

vi /usr/local/apache/conf/httpd.conf 로 아래처럼 사용자 수정

User apache
Group apache

Apache 시작

아래 명령으로 아파치 시작

# /usr/local/apache/bin/apachectl start

Apache 테스트

브라우저에서 서버에 접속 후 It works! 페이지가 표시 되는 지 확인

http://server-ip

구동 파일 설정

서버 실행 시 아파치 자동 실행을 위해 구동 파일을 설정한다.

vi /etc/systemd/system/httpd.service

[Unit]
Description=Apache Web Server
After=network.target

[Service]
Type=forking
#PIDFile=/run/httpd/httpd.pid
Environment=HTTPD_PID=/usr/local/apache/logs/httpd.pid
EnvironmentFile=/usr/local/apache/bin/envvars
ExecStart=/usr/local/apache/bin/apachectl -k start
ExecStop=/usr/local/apache/bin/apachectl -k graceful-stop
ExecReload=/usr/local/apache/bin/apachectl -k graceful
KillSignal=SIGCONT
PrivateTmp=true
LimitNOFILE=infinity
User=apache
Group=apache

[Install]
WantedBy=multi-user.target

구동파일 권한 설정

# chmod 755 /etc/systemd/system/httpd.service
서비스 파일 reload
# systemctl daemon-reload

실행파일 권한 설정

# chown -R apache:apache /usr/local/apache/bin/apachectl
# chown -R root:root /usr/local/apache/bin/httpd
# chmod +s /usr/local/apache/bin/httpd

Apache 서비스 시작/종료

시작

# systemctl start httpd

종료

# systemctl stop httpd

부팅 시 Apache 서비스 시작

# systemctl enable httpd

 4. PHP 설치

관련 파일 다운로드

php7을 다운로드 한다.

http://php.net/downloads.php

의존성 패키지 설치

php에서 사용할 의존성 패키지를 설치한다.

apt install libxml2-dev libbz2-dev libcurl4-openssl-dev libldap2-dev libmysqlclient-dev pkg-config libssl-dev libsslcommon2-dev libjpeg-dev libpng-dev libfreetype6-dev libldb-dev libsasl2-dev

의존성 링크 설정

php에서 라이브러리 의존성을 위해 링크를 설정한다.

ln -s /usr/lib/x86_64-linux-gnu/libldap.so /usr/lib/libldap.so
ln -s /usr/lib/x86_64-linux-gnu/liblber.so /usr/lib/liblber.so
ln -s /usr/lib/x86_64-linux-gnu/libmysqlclient.so /usr/lib/x86_64-linux-gnu/libmysqlclient_r.so

libmcrypt 설치

PHP에서 암호화 해독 알고리즘인 mcrypt를 사용하기 위해서 설치해야 한다.

tar xvzf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8
./configure --prefix=/usr/local --libdir=/usr/local/lib
make && make install
/sbin/ldconfig

cd libltdl/
./configure --enable-ltdl-install --libdir=/usr/local/lib
make && make install
cd ../../

mhash 설치

hash 암호화 알고리즘.

tar xvzf mhash-0.9.9.9.tar.gz
cd mhash-0.9.9.9
./configure --prefix=/usr/local --libdir=/usr/local/lib
make && make install

mcrypt 설치

암호화 해독 알고리즘.

tar xvzf mcrypt-2.6.8.tar.gz
cd mcrypt-2.6.8/
/sbin/ldconfig
./configure --prefix=/usr/local --libdir=/usr/local/lib
make && make install

php 설치

php 를 설치한다.

tar xvzf php-7.1.10.tar.gz
cd php-7.1.10
./configure --prefix=/usr/local/php \
--with-libdir=lib \
--with-config-file-path=/usr/local/php/etc \
--with-mysqli=/usr/bin/mysql_config \
--with-apxs2=/usr/local/apache/bin/apxs \
--with-pear=/usr/share/php \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir=/usr \
--enable-xml \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-maintainer-zts \
--enable-opcache \
--with-curl \
--with-iconv=/usr/local \
--enable-mbregex \
--enable-fpm \
--enable-mbstring \
--with-mcrypt \
--with-gd \
--enable-gd-native-ttf \
--with-openssl \
--with-mhash \
--enable-pcntl \
--enable-sockets \
--with-ldap \
--with-ldap-sasl \
--with-xmlrpc \
--enable-zip \
--enable-soap \
--with-bz2 \
--enable-static \
--enable-intl \
--enable-exif \
--with-pdo-mysql=/usr \
--with-gettext
make && make install
make 도중 umachine.h:340:13: error: ‘char16_t’ does not name a type 에러 발생 시 Makefile 을 열어서 CXXFLAGS_CLEAN 항목에  -std=c++0x 구문을 추가 후 make

php.ini 생성

아래 명령으로 Php.ini 생성.

cp -f php.ini-production /usr/local/php/etc/php.ini

opcache 활성화

/usr/local/php/etc/php.ini 의 opcache 부분을 아래와 같이 변경.

[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
/usr/local/php/etc/php.ini 의 맨 끝에 아래와 같이 추가.
zend_extension=/usr/local/php/lib/php/extensions/no-debug-zts-20160303/opcache.so

5. PHP 확장모듈 설치

관련 파일 다운로드

ImageMagick 관련파일을 다운로드 한다.

https://www.imagemagick.org/download
http://pecl.php.net/package/imagick

의존성 패키지 설치

apt install autoconf libgtk2.0-dev

ImageMagicK 설치

ImageMagick은 TIFF, JPEG, GIF, PNG, PDF 및 기타 포토 CD 등 89가지 이상의 이미지의 읽기, 쓰기 및 처리하는 데 사용할 수 있는 개발 도구입니다.

# tar xvJf ImageMagick-7.0.7-4.tar.xz
# cd ImageMagick-7.0.7-4/
# ./configure --libdir=/usr/local/lib
# make && make install
# cd ..

imagick 설치

# tar xvzf imagick-3.4.3.tgz
# cd imagick-3.4.3
# /usr/local/php/bin/phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config
# make && make install
/usr/local/php/etc/php.ini 에 아래 라인 추가
extension=/usr/local/php/lib/php/extensions/no-debug-zts-20160303/imagick.so

php library 추가

# echo "/usr/local/php/lib" > /etc/ld.so.conf.d/php.conf
# ldconfig

php-cgi 프로세스 시작

# cd /usr/local/php/etc
# cp php-fpm.conf.default php-fpm.conf
# cp php-fpm.d/www.conf.default php-fpm.d/www.conf

www.conf 의 User와 Group 을 nobody --> apache 로 변경 후 php-fpm 실행
# /usr/local/php/sbin/php-fpm

Apache 에서 php 지원 추가

/usr/local/apache/conf/httpd.conf 파일을 열어서 php를 검색 후 아래 라인을 추가

AddType application/x-httpd-php .php .php3 .inc
AddType application/x-httpd-php-source .phps

Apache 재시작

service httpd restart

PHP 동작 테스트

# echo "<?php phpinfo(); ?>" > /usr/local/apache/htdocs/phptest.php

한 후 웹 브라우저에서 http://server-ip/phptest.php
해서 결과가 정상적으로 나오는 지 확인

6. Apache 와 Tomcat 통합

mod_jk 생성

tar xvzf  tomcat-connectors-1.2.42-src.tar.gz
cd tomcat-connectors-1.2.42-src/
cd native
./configure --with-apxs=/usr/local/apache/bin/apxs
make
cp ./apache-2.0/mod_jk.so /usr/local/apache/modules/

설정 파일 복사

cd ../conf
cp httpd-jk.conf /usr/local/apache/conf/mod_jk.conf
cp workers.properties /usr/local/apache/conf/

mod_jk.conf 설정

/usr/local/apache/conf/mod_jk.conf 파일에 아래 내용 추가

JkWorkersFile /usr/local/apache/conf/workers.properties
JkLogFile /usr/local/apache/logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"

JkMount /servlet/* worker1
JkMount /*.jsp         worker1
JkMount /application/* worker1
JkMount /*.do          worker1
JkMount /*.class       worker1
JkMount /*.jar         worker1

설정 파일 해석

1. JkMount 위치는 Tomcat이 해석을 담당, JkUnMount는 반대임
2.  JkMount /test/* worker1 의 의미는 test 디렉토리 아래는 Tomcat이 처리를 담당
3. jsp와servlet은 tomcat이 처리, 그 외 그림이나 정적 파일은 Apache가 처리

Tomcat 프로퍼티 설정

/usr/local/apache/conf/workers.properties 에 다음 내용 추가

worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=127.0.0.1
worker.worker1.port=8009
worker.worker1.lbfactor=50
worker.worker1.socket_keepalive=1
worker.worker1.socket_timeout=300

Apache 설정파일 수정

/usr/local/apache/conf/httpd.conf 에 다음 내용 추가

Include /usr/local/apache/conf/mod_jk.conf

Tomcat 설정변경

/usr/local/tomcat/conf/server.xml에 다음 내용 수정 (docbase 경로는 원하는 위치로 변경)

<Host 를 찾음
(다음과 같음:  <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">)

다음 줄에 다음 내용을 추가:
<Context path="" docBase="/usr/local/tomcat/webapps"
 debug="0" reloadable="true" crossContext="true"/>

Apache / Tomcat 재시작

service httpd start
service tomcat restart

성공여부 확인

다음 명령으로 실행 여부 확인 해서 아래 메시지가 나오면 성공

# tail -f /usr/local/apache/logs/mod_jk.log
[Sun Oct 01 11:10:43 2017][22961:139625235212032] [info] init_jk::mod_jk.c (3595): mod_jk/1.2.42 initialized

연동 테스트

/usr/local/tomcat/webapps/test.jsp 파일에 다음 내용 추가 후

웹 브라우저에서 http://server-ip/test.jsp 해서 Hello World! 가 출력되면 성공

<html>
<h1>JSP test<hr>
<%out.println("Hello World!");%>
</html>

Tomcat port 차단

Apache를 통해 접속하므로 Tomcat 으로 직접 연결은 차단

/etc/iptables.rules 에서 8080 접속 관련 라인 삭제하고 아래 처럼 생성

*filter
:INPUT ACCEPT [377:27429]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [231:101581]
-A INPUT -i enp0s3 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i enp0s3 -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i enp0s3 -j DROP
COMMIT

iptables rule reload

# iptables-restore < /etc/iptables.rules





GIT 여러 사용자 공유하기

리눅스/설치

GIT 여러 사용자 공유


리모트 서버의 GIT를 여러 명의 사용자가 공유할 경우 아래의 방법을 사용


1. GIT 서버에서 Remote 관리용 사용자 생성 (ex: gitteam)


2. test 용 저장소 생성

mkdir TestProject.git

cd TestProject.git

git --bare init


3. 클라이언트 PC에서 git 사용자 액세스용 공개키 생성

ssh-keygen -t rsa

--> .ssh/id_rsa.pub 파일 생성됨


4. id_rsa.pub 파일을 scp 명령으로 GIT서버로 복사

scp .ssh/id_rsa.pub to_user@111.222.333.444:~


5. 복사된 사용자 계정의 .ssh/authorized_keys 에 파일 내용 추가

cat id_rsa.pub >> .ssh/authorized_keys


6. 사용자 계정에서 사용자명 추가

git config --global user.name "John"

git config --global user.email "John@gmail.com"


7. git clone 으로 제대로 받아와 지는 지 확인


git clone gitteam@IPADDR:TestProject.git


정상적으로 받아와 지면 성공

SVN to GIT

리눅스/설치

SVN migration to GIT with history


먼저 git 에 svn sub command 추가

# yum install git-svn.noarch


이 후 git 로컬 저장소를 생성할 id로 로그인

$ svn log ^/ --xml | grep -P "^<author" | sort -u | perl -pe 's/<author>(.*?)<\/author>/$1 = /' > users.txt

users.txt 를 열어서 아래 형식으로 수정

username = 사용자명 <이메일@도메인>


$ git svn clone file:///home/svn/저장소/  --authors-file=users.txt --no-metadata  --trunk /  -s <project-dir>

$ cd <project-dir>

$ git for-each-ref refs/remotes/tags | cut -d / -f 4- | grep -v @ | while read tagname; do git tag "$tagname" "tags/$tagname"; git branch -r -d "tags/$tagname"; done
$ git for-each-ref refs/remotes | cut -d / -f 3- | grep -v @ | while read branchname; do git branch "$branchname" "refs/remotes/$branchname"; git branch -r -d "$branchname"; done

$ git remote add origin ssh://user@www.example.com:2222/home/git/project.git

$ git push origin --all

$ git remote show origin



다른 머신 또는 사용자로 로그인


$git clone ssh://user@www.example.com:2222/home/git/project.git <project-dir>




dnssec-keygen 응답이 없을 때

리눅스/설치

이전 포스팅에서 bind dynamic update 하는 방법을 정리한 적이 있다.


그 이후 오랜만에 서버를 업그레이드 하여 이전 포스팅에 따라 키를 생성하려고 하니 dnssec-keygen 명령이 응답이 없다.

구글링해보니 리눅스에서는 Seed를 주기 위해 -r /dev/urandom을 추가해 주어야 한다고 한다.


예를 들면 다음과 같이 사용한다.

dnssec-keygen -r /dev/urandom -a hmac-md5 -b 256 -n HOST test.com.




DNS 트래픽이 유난히 높을 때

리눅스/해킹

Cent-OS 6.4 를 새로 설치하고 테스트 하던 중

Out-bound traffic 이 주기적으로 높아지는 걸  발견

iftop (또는 iptraf)로 트래픽의 주범을 찾아 보니 UDP 53번 포트 (DNS)

DNS  Attack 의 일종이다.

막는 방법은 아래와 같다.


IPTables 에 다음 라인을 추가한다.

-I INPUT -p udp --dport 53 -m string --from 40 --to 51 --algo bm --hex-string '|04706b7473046173696100|' -j DROP -m comment --comment "DROP DNS Q pkts.asia"

-A INPUT -p udp -m udp --dport 53 -m state --state NEW -m recent --set --name DEFAULT --rsource

-A INPUT -p udp -m udp --dport 53 -m state --state NEW -m recent --update --seconds 10 --hitcount 10 --name DEFAULT --rsource -j DROP




CentOS 6.4 qmail + vpopmail + mysql + dovecot + roundcube

리눅스/설치

이 키워드로 구글링 하면 제일 잘 정리된 페이지가 아래 페이지이다.

http://notes.sagredo.eu/


위 페이지를 기반으로 설치를 하면서 버전이 맞지 않아 생기거나 실수로 생기는 사항에 대해서만 추가한다.


주의할 점

위 페이지를 보면 roundcube 설치 후 spamassassin 을 설치하는 거로 되어 있지만 

spamassassin 을 먼저 설치하는 게 정상 순서이다.


vpopmail 설치 시 CentOS 같은 경우 uid 89 를 이미 postfix 에서 사용중이다.

해결방법은 postfix 를 제거 하거나 다른 uid를 사용하는 방법이다.

다른 uid를 사용할 때 주의해야 하는 점은 Roberto의 스크립트를 그대로 따라하면 에러가 발생된다.

스크립트에서 89 라고 되어 있는 부분을 본인이 사용한 uid 로 바꿔 주어야 한다.


dovecot 설치 시 설치 후 테스트 할 경우 ManageSieve 에러가 발생한다.

sieve 설정을 안해서 발생하는 문제로 다음 2가지 방법이 있다.

1. mv 20-managesieve.conf 20-managesieve.conf.disabled 로 sieve 설정을 무효화 한 후 테스트

2. 그 다음 Filtering 페이지까 다 설정한 후에 테스트


spamassassin 설치 방법은 Roberto 의 방법으로 하면 정상 동작하지 않는다.

아래 방법대로 설치한다.

1. spamassassin 소스 취득 및 소스 폴더로 감

2. 필수 패키지 설치

perl -MCPAN -eshell

cpan[1]> install Digest::SHA1 HTML::Parser Net::DNS NetAddr::IP  Time::HiRes LWP HTTP::Date  IO::Zlib Archive::Tar


2. 옵션 패키지 설치

cpan[2]> MIME::Base64 Net::SMTP Mail::SPF IP::Country::Fast DB_File Net::Ident IO::Socket::SSL 

cpan[3]> Compress::Zlib Mail::DKIM DBI


3. sapmassassin 설치

cpan[4]> install Mail::SpamAssassion


4. 잘 설치되었는 지 확인

sapmassassin -V


설치 된 이후는 다시 Roberto 의 페이지 대로 설정한다.

CentOS 6.4 + vsftpd 3.0.2 + ftps + 가상유저 설치

리눅스/설치

1. 소스 다운로드

http://vsftpd.beasts.org 에서 최신 버전 소스를 다운합니다.

2. 의존성 패키지 설치

yum install pam.x86_64 pam-devel.x86_64
yum install tcp_wrappers.x86_64 tcp_wrappers-devel.x86_64 tcp_wrappers-libs.x86_64
yum install db4-utils

3. 소스 압축해제

tar xvzf vsftpd-3.0.2.tar.gz

4. 소스 패치 (2개 파일)
vi logging.c postlogin.c
str_replace_unprintable(p_str, '?'); 를 찾아서 // 로 comment 처리

vi builddefs.h (아래와 같이 udef --> define으로 변경)
#define VSF_BUILD_TCPWRAPPERS
#define VSF_BUILD_PAM
#define VSF_BUILD_SSL

5. 컴파일 및 설치
make; make install

6. init 스크립트 추가
vi /etc/init.d/vsftpd
#!/bin/bash
#
# vsftpd      This shell script takes care of starting and stopping
#             standalone vsftpd. Customized to be used with CentOS 5.4
#             and Monit by creating PID files for each process
#
# chkconfig: - 60 50
# description: Vsftpd is a ftp daemon, which is the program \
#              that answers incoming ftp service requests.
# processname: vsftpd
# config: /etc/vsftpd/vsftpd.conf

# Source function library.
. /etc/rc.d/init.d/functions

RETVAL=0
prog="vsftpd"
site="$prog"
sbin="/usr/sbin/vsftpd"
conf="/etc/vsftpd/vsftpd.conf"
pidfile="/var/run/vsftpd/vsftpd.pid"

[ -d /var/run/$prog ] || mkdir -p /var/run/$prog

start() {

    [ -x $sbin ] || exit 1
    [ -r $conf ] || exit 1

    if [ -f $pidfile ]; then
        pid=`cat $pidfile`
        ps -ef | grep -v grep | grep $pid | grep $sbin > /dev/null
        if [ $? -eq 0 ]; then
            echo "$prog already running!"
            exit 1
        else
            rm -f $pidfile
        fi
    fi

    echo -n $"Starting $prog: "
    $sbin $conf &
    [ $? -eq 0 ] && success || failure
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
    pidcmd=`ps -ef | grep -v grep | grep $sbin | awk '{print $2}'`
    echo $pidcmd > $pidfile
    echo
    return $RETVAL
}


stop() {

    echo -n $"Shutting down $prog: "
    killproc $prog
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
    rm -f $pidfile
    return $RETVAL

}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart|reload)
        stop
        start
        RETVAL=$?
        ;;
    condrestart)
        if [ -f /var/lock/subsys/$prog ]; then
            stop
            start
            RETVAL=$?
        fi
        ;;
    status)
        status $prog
        RETVAL=$?
        ;;
    *)
        echo $"Usage: $0 {start|stop|restart|condrestart|status}"
        exit 2
esac

exit $RETVAL


7. vsftp 설정
# adduser virtualuser
# cp vsftpd.conf /etc/vsftpd/vsftpd.conf
# vi /etc/pam.d/vsftpd
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/virtual_passwd
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/virtual_passwd

다음 구문 추가 또는 수정
# vi /etc/vsftpd/vsftpd.conf
listen=YES
listen_port=2001
pam_service_name=vsftpd
tcp_wrappers=YES
guest_enable=YES
guest_username=virtualuser
virtual_use_local_privs=YES
hide_ids=YES
pasv_enable=YES
pasv_min_port=2002
pasv_max_port=2100
# 사용자 디렉토리 별도 지정
user_config_dir=/home/vsftpd/users
allow_writeable_chroot=YES
ssl_enable=YES
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem
force_local_logins_ssl=YES
force_local_data_ssl=NO
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
allow_anon_ssl=NO


8. 사용자/passwd 파일 추가
# cd /etc/vsftpd
# vi virtual_user.txt
user1
user1-pass
user2
user2-pass

// 사용자 password 변환
# db_load -T -t hash -f virtual_user.txt /etc/vsftpd/virtual_passwd.db  

# mkdir /home/vsftpd/users
# vi /home/vsftpd/users/user1
local_root=/home/vsftpd/user1
write_enable=no

9. ssl 설정

cd /etc/pki/tls/certs

// 10년 짜리 키 생성
openssl req -x509 -nodes -days 3650 -newkey rsa:1024 -keyout vsftpd.pem -out vsftpd.pem
# chmod 600 vsftpd.pem


CentOS 6.4 Mysql 5.6 + httpd 2.4.9 + php 5.5.10 + Tomcat 8.0 설치

리눅스/설치
Ⅰ. 설치 전 준비

yum -y ?disablerepo=\* ?enablerepo=c6-media install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel  ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel libtool  libtool-libs openldap openldap-devel nss_ldap openldap-clients openldap-servers libtool-ltdl libtool-ltdl-devel bison
yum groupinstall "Development Tools"
yum -y install gd gd2 gd-devel gd2-devel wget pcre openssl* perl libaio


- Download

http://dev.mysql.com/downloads/mysql/#downloads

Generic Linux (Architecture Independent), Compressed TAR Archive download
apr: http://apache.mirror.cdnetworks.com/apr/apr-1.6.2.tar.gz
apr-iconv: http://apache.mirror.cdnetworks.com/apr/apr-iconv-1.2.1.tar.gz
apr-util: http://apache.mirror.cdnetworks.com/apr/apr-util-1.6.0.tar.gz
apache: http://apache.mirror.cdnetworks.com/httpd/httpd-2.4.27.tar.gz
pcre: ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/

php : http://www.php.net/downloads.php#v5
http://kr1.php.net/get/php-5.5.10.tar.gz/from/this/mirror
libiconv : http://www.gnu.org/software/libiconv/#downloading
libmcrypt : http://sourceforge.net/projects/mcrypt/files/Libmcrypt/
mhash : http://mhash.sourceforge.net/
mcrypt : http://sourceforge.net/projects/mcrypt/
ImageMagick: http://www.imagemagick.org/script/download.php
imagick: http://pecl.php.net/package/imagick

Tomcat 8.0 : http://tomcat.apache.org/download-80.cgi
Tomcat Native: http://tomcat.apache.org/download-native.cgi
Tomcat Connector : http://tomcat.apache.org/download-connectors.cgi
jdk : http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

Ⅱ. MySQL

1. 기존 mysql 제거
yum erase mysql-libs


2. 의존성 패키지 설치
yum install cmake.x86_64
yum install ncurses-devel.x86_64

3. 컴파일

cmake -DCMAKE_INSTALL_PREFIX=/home/mysql \
-DMYSQL_DATADIR=/home/mysql/data \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EXTRA_CHARSETS=all

make; make install

 


4. 환경 설정
cp /home/mysql/support-files/my-default.cnf /etc/my.cnf
vi /etc/my.cnf
다음 항목을 [mysqld] 영역에 추가
########################
basedir = /home/mysql
datadir = /home/mysql/data
port = 3306
server_id = 1
socket = /tmp/mysql.sock
explicit_defaults_for_timestamp=true
########################


5. 사용자 추가 및 DB 설치
groupadd mysql
useradd -r -g mysql mysql
cd /home
chown -R mysql:mysql mysql
cd mysql
scripts/mysql_install_db \
--user=mysql \
--datadir=/home/mysql/data \
--basedir=/home/mysql


6. MySQL 시동파일 구성 및 시작
cp support-files/mysql.server /etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld
/etc/init.d/mysqld start


7. root 패스워드 및 보안 설정
/home/mysql/bin/mysql_secure_installation


8. 리눅스 시작시 mysql 구동되도록 설정
chkconfig --add mysqld
chkconfig mysqld on

Ⅲ. Tomcat 8 설치

1. apr 1.6.2 설치
tar zxvf apr-1.6.2.tar.gz
cd apr-1.6.2
./configure --prefix=/usr/local/apr
make
make install


2. apr-iconv 설치
tar zxvf apr-iconv-1.2.1.tar.gz
cd apr-iconv-1.2.1
./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr
make
make install


3. apr-util 설치
tar zxvf apr-util-1.6.0.tar.gz
cd apr-util-1.6.0
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv
make
make install

4. jdk 설치
rpm -ivh jdk-7u45-linux-x64.rpm

5. Tomcat 8.0 설치
tar zxvf apache-tomcat-8.5.20.tar.gz
mv apache-tomcat-8.5.20 /usr/local/


tar xvzf ../down/tomcat-native-1.2.12-src.tar.gz
cd tomcat-native-1.2.12-src/jni/native/
./configure --with-apr=/usr/local/apr --with-java-home=/usr/java/jdk1.8.0_144/ --libdir=/usr/local/lib64

make
make install


a. 환경구성

vi /etc/profile 파일의 마지막에 다음 행 추가

export LD_LIBRARAY_PATH=/usr/local/apr/lib
export JAVA_HOME=/usr/java/jdk1.8.0_144
export TOMCAT_HOME=/usr/local/tomcat
export PATH=$JAVA_HOME/bin:$TOMCAT_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib

b. 설정 확인을 위해 다음 명령 실행

# source /etc/profile
# java -version

************* 다음 내용이 출력되면 성공 ***************************
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
*****************************************************************

c. 방화벽 포트를 오픈

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
service iptables save
service iptables restart

d. tomcat 시작/정지

startup.sh
# tomcat 시작

shutdown.sh
# Tomcat 정지

e. 테스트

http://server-ip:8080/

f. 구동파일 생성

vi /etc/init.d/tomcat
다음 내용을 추가
#!/bin/bash
# description: Tomcat Start Stop Restart
# processname: tomcat
# chkconfig: 234 20 80
 
export JAVA_HOME=/usr/java/jdk1.8.0_144
export PATH=$JAVA_HOME/bin:$PATH
export CATALINA_HOME=/usr/local/apache-tomcat-8.5.20
 
case $1 in
start)
sh $CATALINA_HOME/bin/startup.sh
;;
stop)
sh $CATALINA_HOME/bin/shutdown.sh
;;
restart)
sh $CATALINA_HOME/bin/shutdown.sh
sh $CATALINA_HOME/bin/startup.sh
;;
esac
exit 0

chmod 755 /etc/init.d/tomcat
chkconfig --add tomcat
chkconfig tomcat on


Ⅳ. apache 설치

1. pcre 설치

pcre-8.41.tar.gz

tar zxvf pcre-8.41.tar.gz

cd pcre-8.41/

./configure --libdir=/usr/local/lib64

make && make install
ln -s /usr/local/lib64/libpcre.so.1 /lib

2. apache 설치
tar xvzf httpd-2.4.27.tgz
cd httpd-2.4.27

groupadd apache
useradd -g apache apache

./configure --prefix=/usr/local/apache \
--enable-authn-alias \
--enable-cache \
--enable-file-cache \
--enable-mem-cache \
--enable-disk-cache \
--enable-mods-shared=most \
--enable-proxy=shared \
--enable-proxy-ajp=shared \
--enable-proxy-ajp=shared \
--enable-dav=shared \
--with-apr=/usr/local/apr/ \
--with-apr-util=/usr/local/apr-util/ \
--enable-ssl \
--enable-dav \
--enable-cgi \
--with-mpm=event \
--enable-cgid \
--enable-vhost-alias \
--enable-rewrite \
--enable-forward=shared \
--enable-proxy-connect=shared \
--enable-proxy-http=shared \
--enable-deflate=shared \
--enable-so \
--enable-headers=shared \
--enable-include=shared \
--enable-rewrite=shared


make&&make install


3. Apache 사용자 지정을 위해 /usr/local/apache/conf/httpd.conf 파일 수정

User apache

Group apache


4. Apache 시작

/usr/local/apache/bin/apachectl start


테스트


http://server-ip


It Works!가 보이면 정상

5. 구동 파일 설정
cp /usr/local/apache/bin/apachectl /etc/rc.d/init.d/httpd
vi /etc/rc.d/init.d/httpd
다음 5줄을 #을 포함하여 위 파일의 상단부 #!/bin/bash 다음에 복사
# chkconfig: 2345 90 90
# description: init file for Apache server daemon
# processname: /usr/local/apache/bin/apachectl
# config: /usr/local/apache/conf/httpd.conf
# pidfile: /usr/local/apache/logs/httpd.pid

chkconfig --add httpd
chkconfig httpd on

아파치 재시작
/etc/rc.d/init.d/httpd restart

Ⅴ. php-5.5.10 설치

1. PHP 5 지원 라이브러리 설치

a. libiconv(문자 인코딩 라이브러리)

tar xvzf libiconv-1.14.tar.gz
cd libiconv-1.14/
./configure --prefix=/usr/local --libdir=/usr/local/lib64
make
make install
cd ..

b. libmcrypt(PHP에서 암호화 해독 알고리즘인 mcryp를 사용하기 위해서 설치해야 한다)

tar xvzf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8
./configure --prefix=/usr/local --libdir=/usr/local/lib64
make
make install
/sbin/ldconfig

cd libltdl/
./configure --enable-ltdl-install --libdir=/usr/local/lib64
make
make install
cd ../../

c. mhash(hash암호화 알고리즘)

tar xvzf mhash-0.9.9.9.tar.gz
cd mhash-0.9.9.9
./configure --prefix=/usr/local --libdir=/usr/local/lib64
make
make install
cd ..

d. mcrypt 설치

tar xvzf mcrypt-2.6.8.tar.gz
cd mcrypt-2.6.8/
/sbin/ldconfig
./configure --prefix=/usr/local --libdir=/usr/local/lib64
make
make install
cd ..

2. php-5.5.10 설치
yum install libxml2-devel bzip2-devel libcurl-devel openldap-devel
tar xvzf php-5.5.10.tar.gz
mysql lib를 64비트로 인식되도록 변경
ln -s /home/mysql/lib /home/mysql/lib64
./configure --prefix=/usr/local/php \
--with-libdir=lib64 \
--with-config-file-path=/usr/local/php/etc \
--with-mysql=/home/mysql \
--with-mysqli=/home/mysql/bin/mysql_config \
--with-apxs2=/usr/local/apache/bin/apxs \
--with-pear=/usr/share/php \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir=/usr \
--enable-xml \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-maintainer-zts \
--enable-opcache \
--with-curl \
--with-iconv-dir=/usr/local \
--enable-mbregex \
--enable-fpm \
--enable-mbstring \
--with-mcrypt \
--with-gd \
--enable-gd-native-ttf \
--with-openssl \
--with-mhash \
--enable-pcntl \
--enable-sockets \
--with-ldap \
--with-ldap-sasl \
--with-xmlrpc \
--enable-zip \
--enable-soap \
--with-bz2 \
--enable-static \
--enable-intl \
--enable-exif \
--with-pdo-mysql=/home/mysql \
--with-gettext

make
iconv관련 링크에러가 날  경우
vi 로 Makefile 을 열어서
EXTRA_LIBS 를 찾아 -liconv 를 추가

make install

3. php구성 파일 생성
cp -f php.ini-production /usr/local/php/etc/php.ini

4. opcache 활성화
/usr/local/php/etc/php.ini 의 opcache 부분을 아래와 같이 변경

[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
;opcache.max_wasted_percentage=5
;opcache.use_cwd=1
;opcache.validate_timestamps=1
;opcache.revalidate_path=0
;opcache.save_comments=1
;opcache.load_comments=1
;opcache.enable_file_override=0
;opcache.optimization_level=0xffffffff
;opcache.inherited_hack=1
;opcache.dups_fix=0
;opcache.blacklist_filename=
;opcache.max_file_size=0
;opcache.consistency_checks=0
;opcache.force_restart_timeout=180
;opcache.error_log=
;opcache.log_verbosity_level=1
;opcache.preferred_memory_model=
;opcache.protect_memory=0


맨 끝에 다음 내용 추가

zend_extension=/usr/local/php/lib/php/extensions/no-debug-zts-20121212/opcache.so


Ⅵ. PHP5확장모듈 컴파일 및 설치

1. ImageMagick-6.8.7-3.tar.xz 설치

ImageMagick은 TIFF, JPEG, GIF, PNG, PDF 및 기타 포토 CD 등 89가지 이상의 이미지의 읽기, 쓰기 및 처리하는 데 사용할 수 있는 안정적인 도구 및 개발 키트 세트입니다

tar xvzf ImageMagick-6.8.7-3.tar.gz
cd ImageMagick-6.8.7-3
./configure --libdir=/usr/local/lib64
make
make install
cd ..

2. imagick-3.1.2.tgz 설치

yum -y install gtk2-devel* gtk+extra
tar xvzf imagick-3.1.2.tgz
cd imagick-3.1.2
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install
vi /usr/local/php/etc/php.ini
에 아래 라인 추가
extension=/usr/local/php/lib/php/extensions/no-debug-zts-20121212/imagick.so
cd ..

3. php
# echo "/usr/local/php/lib" >> /etc/ld.so.conf
# ldconfig

4. php-cgi 프로세스 시작
cd /usr/local/php/etc
cp php-fpm.conf.default php-fpm.conf

올바른 구분을 시작하기 전에 다음 php-fpm.conf 를 테스트 할 수 있습니다.

/usr/local/php/sbin/php-fpm -t

/usr/local/php/sbin/php-fpm 실행

5. apache 에서 PHP5 지원

vi /usr/local/apache/conf/httpd.conf
#아래 LoadModule 추가
LoadModule php5_module modules/libphp5.so

#AddType 추가
    AddType application/x-httpd-php .php .php3 .inc
    AddType application/x-httpd-php-source .phps

아파치 재시작
/usr/local/apache/bin/apachectl restart
libconv 에러 발생시 /usr/local/apache/bin/apachectl 맨 위에 다음 라인 추가
export LD_PRELOAD=/usr/local/lib64/libiconv.so

6. php지원 여부 테스트

cd /usr/local/apache/htdocs
echo "<?php phpinfo(); ?>" > phpinfo.php

http://server-ip/phpinfo.php,정상적으로 출력되는 지 확인

Ⅶ. apache와 tomcat 통합

 1. mod_jk 생성

tomcat-connectors-1.2.37-src.tar.gz
tar xvzf  tomcat-connectors-1.2.37-src.tar.gz
cd tomcat-connectors-1.2.37-src/
cd native
./configure --with-apxs=/usr/local/apache/bin/apxs
make
cp ./apache-2.0/mod_jk.so /usr/local/apache/modules/

2. 설정파일 복사
cd ../conf
cp httpd-jk.conf /usr/local/apache/conf/mod_jk.conf
cp workers.properties /usr/local/apache/conf/

a. mod_jk.conf 설정

vi /usr/local/apache/conf/mod_jk.conf

다음 내용 추가:

JkWorkersFile /usr/local/apache/conf/workers.properties
JkLogFile /usr/local/apache/logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"

JkMount /servlet/* worker1
JkMount /*.jsp         worker1
JkMount /application/* worker1
JkMount /*.do          worker1
JkMount /*.class       worker1
JkMount /*.jar         worker1

########해석#############

1. JkMount 위치는 Tomcat이 해석을 담당, JkUnMount는 반대임
2.  JkMount /test/* worker1 의 의미는 test 디렉토리 아래는 Tomcat이 처리를 담당
3. jsp와servlet은 tomcat이 처리, 그 외 그림이나 정적 파일은 Apache가 처리
###################

b. vi /usr/local/apache/conf/workers.properties

다음 내용 추가:

worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=192.168.1.185
worker.worker1.port=8009
worker.worker1.lbfactor=50
worker.worker1.socket_keepalive=1
worker.worker1.socket_timeout=300

c. apache 설정파일 수정

vi /usr/local/apache/conf/httpd.conf

다음 내용 추가:

Include /usr/local/apache/conf/mod_jk.conf
# 위 mod_jk.conf 파일의 맨 위에 아래 라인이 있는 지 확인
#LoadModule jk_module modules/mod_jk.so

d. TOMCAT 설정 변경

cd /usr/local/apache-tomcat-8.5.20/conf
vi server.xml

<Host 를 찾음
(다음과 같음:  <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">)

다음 줄에 다음 내용을 추가:
<Context path="" docBase="/usr/local/apache-tomcat-8.5.20/webapps"
 debug="0" reloadable="true" crossContext="true"/>

########dobase 경로는 /usr/local/apahce/htdocs 로 변경 가능#####

e. apache와 tomcat을 다시 시작

apache 재시작

/usr/local/apache/bin/apachectl stop
/usr/local/apache/bin/apachectl start

tomcat 재시작

startup.sh

이 시점에서,tomcat과 apache 통합 완료!

성공여부 확인 :

/usr/local/apache/logs/mod_jk.log 확인
다음과 같은 라인이 나오면 성공!
[Sun Sep 22 23:21:18 2013][15053:3078219984] [info] init_jk::mod_jk.c (3365): mod_jk/1.2.37 initialized

테스트:

vi /usr/local/apache-tomcat-8.5.20/webapps/test.jsp

다음 내용 추가:

<html>
<h1>JSP test<hr>

<%out.println("Hello World!");%>

</html>

http://server-ip/test.jsp

출력결과: HELLO WORLD


우분투 ssh 접속이 오래 걸릴 때

리눅스/설치

우분투 터미널에서 ssh 접속을 하는 경우 오랫동안 응답이 없다가 패스워드를 물어보는 현상이 발생한다.

이는 ssh의 인증이 GSS API, 공개키(Public Key), 패스워드 순으로 이루어 지는데 GSS API 인증 과정에서 Kerberos DNS 질의가 발생을 하게 되고 이 DNS 질의에 대해 응답을 받지 못하는 경우 타임아웃이 발생할 때까지 대기를 하기 때문이다.

이 경우 별도 GSS API를 사용하지 않을 경우 이 GSS API 를 비활성화 해야 한다.

비활성화 하는 방법은

/etc/ssh/ssh_config 에서 GSSAPIAuthentication을 no 로 설정한다.


참고: About GSS API : http://en.wikipedia.org/wiki/Generic_Security_Services_Application_Program_Interface