1. 노드 찾기

 - 태그 이름으로 노드 찾기 :  $("태그이름"),   $("선택자")

 - 클래스 이름으로 노드 찾기 : $(".클래스이름")

 - ID로 노드 찾기 : $("선택자")

 - 속성으로 노드 찾기 : $("[속성이름=값]")

 - 찾은 요소 개수 구하기 :  .size()    ,     .length

 - 찾은 요소 n번째 접근하기 : .eq(index)    ,    .each(function(index){});

 - 찾은 요소에서 특정요소만을 걸러내기 : .filter("선택자")

 - 찾은 요소에서 특정 자식요소만 찾기 :  .find("선택자")


2. 자식 노드 찾기 

 - 전체 자식 노드 찾기

    -- 텍스트 노드 포함 전체 자식 노드 찾기 :  $("선택자").contents()

    -- 텍스트 노드 제외한 전체 자식 노드 찾기 : $("선택자").children("선택자")

 - n번째 자식 노드 접근

    -- $("선택자").children().eq(N)

    -- $("선택자").children(":eq(N)")

 - 첫번째 자식 노드 접근

    -- $("선택자").children().first()

    -- $("선택자").children(":first")

    -- $("선택자").children().eq(0)

    -- $("선택자").children(":eq(0)")

 - 마지막 자식 노드 접근

    -- $("선택자").children().last()

    -- $("선택자").children(":last")

 

3. 부모 노드 찾기

 - 바로 위의 부모 : $("선택자").parent()

 - 모든 부모 찾기

    -- $("선택자").parents()  모든 부모

 - 모든 부모 중 선택자에 해당하는 부모 찾기

    -- $("선택자").parents("선택자")


4. 형제 노드 찾기

 - 이전 형제 노드 찾기

    -- $("선택자").prev()

    -- $("선택자").prevAll("선택자");

 - 다음 형제 노드 찾기

    -- $("선택자").next()

    -- $("선택자").nextAll("선택자");


5. 노드 생성,추가,이동,삭제

 - 생성

    -- $("노드")

    -- $("선택자").html("<노드>...")

    -- $("노드").clone()

 - 추가

    -- $기준노드.append($추가노드)

    -- $추가노드.appendTo($기준노드)

    -- $기준노드.prepend($추가노드)  

    -- $추가노드.prependTo($기준노드)

    -- $추가노드.insertBefore($기준노드)

    -- $기준노드.before($추가노드)

    -- $추가노드.insertAfter($기준노드)

    -- $기준노드.after($추가노드)

 - 삭제

    -- $("선택자").remove()

 - 이동

    -- $기준노드.append($이동노드)  

    -- $이동노드.appendTo($기준노드)

    -- $이동노드.insertBefore($기준노드)

    -- $기준노드.before($이동노드)

    -- $이동노드.insertAfter($기준노드)   

    -- $기준노드.after($이동노드)


6. 텍스트 노드 다루기

 - 텍스트 노드 생성 : $("텍스트")

 - 텍스트 노드 추가 : $기준노드.append("텍스트")

 - 텍스트 노드 변경 : $기준노드.text("새로운 텍스트")


기본 CSS 셀렉터 사용하기


a - 모든 링크(<a>) 엘리먼트와 일치하는 셀렉터.

#exID - exID를 아이디로 가지는 엘리먼트와 일치하는 셀렉터.

.exClass - exClass를 클래스로 가지는 엘리먼트와 일치하는 셀렉터.

a#exID.exClass - 아이디가 exID 이고, 클래스가 exClass인 링크와 일치하는 셀렉터.

p a.exClass - <p> 엘리먼트 내에 클래스가 exClass인 모든 링크와 일치하는 셀렉터.

아래 코드와 같이 쓰임

$("p a.exClass")


자식 셀렉터(child selector) : 부모와 자식 엘리먼트는 오른쪽 부등호(>)로 구분

예제) ul.myList > li > a

설명) myList 클래스를 지닌 <ul> 엘리먼트의 바로 아래 자식 리스트 앨리먼트인 <li>에서

바로 아래 자식 링크만 선택한다.

[ 어트리뷰트 셀렉터 ]

a[href^=http://] - href의 값이 http://로 시작하는 모든 링크를 의미. 캐럿문자(^)는 값의 시작 부분이 일치하는지를 뜻함

form[method] - 명시적으로 method 어트리뷰트를 가지는 <form> 엘리먼트

input[type=text] - type이 text인 모든 input 엘리먼트

div[title^=my] - title 어트리뷰트의 값이 my로 시작하는 모든 <div> 엘리먼트

a[href$=.pdf] - PDF 파일을 참조하는 모든 링크

a[href*=jquery.com] - jQuery 사이트를 참조하는 모든 <a> 엘리먼트. *는 어트리뷰트의 값이 임의의 문자열을 포함하는 엘리먼트를 찾아오라는 셀렉터.

li:has(a) - <a> 엘리먼트를 포함하는 모든 <li> 엘리먼트

li a - <li>엘리먼트 바로 아래 자식의 모든 <a> 엘리먼트



기본 CSS 셀렉터


* - 모든 엘리먼트와 일치

E - 태그명이 E인 모든 엘리먼트와 일치

E F - E의 자손이면서 태그명이 F인 모든 엘리먼트와 일치

E>F - E의 바로 아래 자식이면서 태그명이 F인 모든 엘리먼트와 일치

E+F - E의 형제 엘리먼트로 바로 다음에 나오는 엘리먼트 F와 일치

E~F - E의 형제 엘리먼트로 다음에 나오는 모든 엘리먼트 F와 일치

E:has(F) - 태그명이 F인 자손을 하나 이상 가지는 태그명이 E인 모든 엘리먼트와 일치

E.C - 클래스명 C를 가지는 모든 엘리먼트 E와 일치. E의 생략은 *.C와 동일함.

E#I - 아이디가 I인 엘리먼트 E와 일치. E의 생략은 *#I와 동일함.

E[A] - 어트리뷰트 A를 가지는 모든 엘리먼트 E와 일치

E[A=V] - 값이 V인 어트리뷰트 A를 가지는 모든 엘리먼트 E와 일치

E[A^=V] - 값이 V로 시작하는 어트리뷰트 A를 가지는 모든 엘리먼트 E와 일치

E[A$=V] - 값이 V로 끝나는 어트리뷰트 A를 가지는 모든 엘리먼트 E와 일치

E[A*=V] - 값에 V를 포함하는 어트리뷰트 A를 가지는 모든 엘리먼트 E와 일치



위치 셀렉터

a:first - 페이지에서 첫 번째 <a> 엘리먼트

p:odd - 모든 홀수 번째 문단 <p> 엘리먼트

p:even - 모든 짝수 번째 문단 <p> 엘리먼트

li:last-child - 부모 엘리먼트의 마지막 자식 엘리먼트

:first - 페이지에서 처음으로 일치하는 엘리먼트

:last - 페이지에서 마지막으로 일치하는 엘리먼트

:first-child - 첫 번째 자식 엘리먼트

:last-child - 마지막 자식 엘리먼트

:only-child - 형제가 없는 모든 엘리먼트를 반환한다

:nth-child(n) - n번째 자식 엘리먼트

:nth-child(even:odd) - 짝수 또는 홀수 자식 엘리먼트

:nth-child(Xn+Y) - 전달된 공식에 따른 n번째 자식 엘리먼트. Y는 0인 경우 생략 가능.

 li:nth-child(3n)은 3의 배수 번째 아이템을 반환

 li:nth-child(5n+1)은 5의 배수 + 1 번째 아이템을 반환

:even - 페이지 전체의 짝수 번째 엘리먼트

:odd - 페이지 전체의 홀수 번째 엘리먼트

:eq(n) - n번째로 일치하는 엘리먼트

:gt(n) - n번째 엘리먼트(포함되지 않음) 이후의 엘리먼트와 일치.

:lt(n) - n번째 엘리먼트(포함되지 않음) 이전의 엘리먼트와 일치.


n번째 자식 셀렉터는 CSS와 호환성을 유지하려고 인덱스를 1부터 시작.

jQuery 정의 셀렉터는 범용 프로그래밍 규약에 따라 인덱스를 0부터 시작.




정의 셀렉터

:animated - 현재 애니메이션이 적용되고 있는 엘리먼트를 선택

:button - 모든 버튼을 선택 ( input[type=submit], input[type=reset], input[type=button], button )

:checkbox - 체크박스 엘리먼트만 선택

:checked - 선택된 체크박스나 라디오 버튼만 선택 (CSS에서 지원)

:contains(foo) - 텍스트 foo를 포함하는 엘리먼트만 선택

:disabled - 인터페이스에서 비활성화 상태인 모든 폼 엘리먼트를 선택 (CSS에서 지원)

:enabled - 인터페이스에서 활성화 상태인 모든 엘리먼트를 선택 (CSS에서 지원)

:file - 모든 파일 엘리먼트를 선택 ( input[type=file] )

:header - 헤더 엘리먼트만 선택 <h1>부터 <h6>까지 선택

:hidden - 감춰진 엘리먼트만 선택

:image - 폼 이미지를 선택 ( input[type=image] )

:input - 폼 엘리먼트만 선택 ( input, select, textarea, button )

:not(filter) - 필터의 값을 반대로 변경 ( 1.3 버전에서는 변경됨 )

:parent - 빈 엘리먼트를 제외하고, 텍스트도 포함해서 자식 엘리먼트를 가지는 엘리먼트를 선택

:password - 패스워드 엘리먼트만 선택 ( input[type=password] )

:radio - 라디오 버튼 엘리먼트만 선택 ( input[type=radio] )

:reset - 리셋 버튼 선택 ( input[type=reset] 이나 button[type=reset] )

:selected - 선택된 엘리먼트만 선택

:submit - 전송 버튼을 선택 ( button[type=submit] 이나 input[type=submit] )

:text - 텍스트 엘리먼트만 선택 ( input[type=text] )

:visible - 보이는 엘리먼트만 선택


:checkbox:checked:enabled - 활성화되고 선택된 체크박스만 선택




:not 필터

- 필터 결과가 반대로 나오게 함.

- CSS 필터에서 지원

- jQuery 정의 셀렉터에서도 동작

- 필터 셀렉터에는 적용할 수 있지만 찾기 셀렉터에는 적용하지 못한다.

- 모두 콜론 문자(:)나 대괄호 문자([)로 시작.

input:not(:checkbox) - 체크박스가 아닌 <input> 엘리먼트 선택

필터 셀렉터 - 기준을 추가해서 일치하는 엘리먼트의 집합을 줄여나간다.

찾기 셀렉터 - 이미 선택된 엘리먼트와 맺은 관계를 통해 다른 엘리먼트를 찾는다. [ 자손 셀렉터(공백문자), 자식 셀렉터(>), 형제 셀렉터(+) ]가 있다.



커맨드 문법


size() - 확장 집합의 엘리먼트 개수를 반환

예제) $('a').size()

설명) 모든 <a> 타입의 엘리먼트의 개수를 반환

get(index) - 확장된 집합에서 하나 또는 모든 일치하는 엘리먼트를 가져온다. 매개변수가 명시되지 않았다면 모든 엘리먼트를 자바스크립트 배열로 반환

예제) $('img[alt]').get(0)

index(element) - 확장 집합에서 전달된 엘리먼트를 찾고, 집합에서 찾은 엘리먼트의 인덱스를 반환. 집합에 해당 엘리먼트가 존재하지 않으면 -1을 반환

예제) var n = $('img').index($('img#findMe')[0]);

add(expression) - expression 매개변수로 명시한 엘리먼트를 확장 집합에 추가한다. 표현식에는 셀렉터, HTML, 코드, DOM 엘리먼트, DOM 엘리먼트 배열이 올 수 있다.

예제1) $('img[alt]').add('img[title]')

예제2) $('img[alt]').addClass('thickBorder').add('img[title]').addClass('seeThrough')

설명2) alt 어트리뷰트를 가진 모든 <img>엘리먼트의 확장 집합을 생성한 뒤 두꺼운 테두리를 만드는 클래스를 적용. title 어트리 뷰트를 가진 <img> 엘리먼트를 추가하고, 마지막으로 투명도를 주는 클래스를 적용.

not(expression) - expression 매개변수의 값에 따라서 일치하는 집합에서 엘리먼트를 제거.

예제) $('img[title]').not('[title*=puppy]')

설명) title 어트리뷰트를 지닌 모든 <img> 엘리먼트를 선택할 때, title 어트리뷰트 값이 puppy를 포함하는 엘리먼트를 제외.

filter(expression) - 전달 받은 셀렉터 표현식이나 필터링 함수를 이용해서 확장 집합에서 엘리먼트를 필터링.

예제) $('td').filter(function(){return this.innerHTML.match(/^\d+$/)})

설명) 모든 <td> 엘리먼트로 구성된 확장 집합을 생성한 다음 엘리먼트 각각에 대해 filter() 메서드에 전달된 함수를 호출.

호출된 함수를 this값으로 현재 순회 중인 엘리먼트를 이용.

전달된 함수는 정규 표현식을 사용하여 숫자로 내용이 구성된 패턴을 만족하는지 검사.

필터 함수를 호출한 결과로 false를 반환하는 엘리먼트가 모두 확장 집합에서 제거

slice(begin, end) - 일치하는 집합에서 연속하는 일부분을 포함하는 새로운 확장 집합을 생성하고 반환

- begin : 반환되는 부분 집합에 포함될 첫 엘리먼트의 위치로, 0부터 시작

- end : 반환되는 부분 집합에 포함될 마지막 엘리먼트의 바로 다음 위치로, 0부터 시작하며, 생략하면 집합의 마지막까지 포함한다.

예제1) $('*').slice(2,3);

설명1) 페이지에 있는 모든 엘리먼트를 선택한 다음 세 번째 엘리먼트를 담은 새로운 집합을 생성

예제2) $('*').slice(0,4);

설명2) 페이지에 있는 모든 엘리먼트를 선택한 다음 처음 네 개의 엘리먼트를 포함한 집합을 생성

예제3) $('*').slice(4);

설명4) 페이지의 모든 엘리먼트와 일치한 다음 처음 네 엘리먼트를 제외한 모든 엘리먼트의 집합을 반환

  < 관계를 통해 새로운 확장 집합을 얻을 수 있는 메서드 >

  children() - 확장 엘리먼트의 고유한 자식으로 구성된 확장 집합을 반환

  contents() - 엘리먼트의 콘텐츠로 구성된 확장 집합을 반환. 텍스트 노드도 포함되며 주로 <iframe> 엘리먼트의 콘텐츠를 얻고자 사용

  next() - 확장 집합 내의 각 확장 엘리먼트 바로 다음에 나오는 형제로 구성된 확장 집합을 반환

  nextAll() - 확장 집합 내의 각 확장 엘리먼트 다음에 나오는 모든 형제로 구성된 확장 집합을 반환

  parent() - 확장 집합 내에 있는 모든 확장 엘리먼트의 바로 위 부모로 구성된 확장 집합을 반환

  parents() - 모든 확장 엘리먼트의 조상으로 구성된 확장 집합을 반환. 바로 위 부모와 상위의 모든 조상이 포함되지만 문서 루트(document root)는 포함되지 않는다.

  prev() - 확장 집합 내의 각 확장 엘리먼트 바로 이전에 나오는 형제로 구성된 확장 집합을 반환

  prevAll() - 확장 집합 내의 각 확장 엘리먼트 이전에 나오는 모든 형제로 구성된 확장 집합을 반환

  siblings() - 확장 엘리먼트의 모든 형제를 포함하는 확장 집합을 반환

find(selector) - 원본의 모든 엘리먼트 중 전달된 셀렉터 표현식과 일치하는 엘리먼트로 구성된 새로운 확장 집합을 반환

예제) wrappedSet.find('p cite')

설명) 변수 wrappedSet에 할당된 확장 집합에서, 문단 <p>에 포함된 모든 인용문 <cite>로 구성된 확장 집합을 반환

is(selector) - 확장 집합에 전달된 셀렉터 표현식과 일치하는 엘리먼트가 있는지 확인. 엘리먼트가 하나 이상 셀렉터와 일치하면 true를, 그렇지 않으면 false를 반환

예제) var hasImage = $('*').is('img');

설명) 현제 페이지에 이미지 엘리먼트가 있으면 hasImage 변수의 값을 true로 설정

end() - jQuery 커맨드 체인에서 사용하며 이전 확장 집합으로 돌아간다.

예제) $('img').clone().appendTo('#somewhere').end().addClass('beenCloned');

설명) 페이지의 모든 <img> 엘리먼트로 구성된 원본 확장 집합을 close() 메서드를 통해 복사본 확장 집합을 생성한 뒤, 복사본인 두 번째 확장 집합을 반환한다. 복사본 확장 집합에 appendTo() 커맨드를 수행한 뒤, end() 커맨드를 통해 현재 확장 집합(복사본 확장 집합)에서 앞으로 돌아가서 이전 확장 집합(원본 확장 집합)을 반환하고, 원본 확장 집합에 addClass() 커맨드를 수행한다.

andSelf() - 커맨드 체인에서 이전 확장 집합 두 개를 하나로 합친다



출처: http://crosstheline.tistory.com/41 [이거 알아영???ㅎㅎㅎ]

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

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

HTML5에서는 해당 요소에서 사용자가 임의로 지정한 속성값을 활용할 수 있으며, 이를 Custom Data Attribute 라고 부른다.

이처럼 ‘data-‘를 앞에 붙여서 속성명을 지정하고 값을 부여하면 된다. 단 이때, 속성명에 대문자를 입력하면 자동으로 소문자로 변환되기 때문에, 기본적으로 소문자를 사용할 것이 권장된다. 아니, 소문자를 써야한다.

제이쿼리에서는 data() 함수를 이용하여, data 속성의 값을 출력하거나, data 속성의 값을 지정할 수 있다.

해당 data 속성을 지우기 위해서는 removeData 이용하여 제거할 수 있다.

간혹 데이터함수가 적용이 잘 안될때가 있다. attr 을 이용하여 처리할 수 있는 경우가 존재한다.

 

출처 : http://syasidev.com/?p=607

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

[PHP] Predis 설치  (0) 2019.05.22
[PHP] Predis 사용법  (0) 2019.05.22
[php]파일을 문자열로 읽기.  (0) 2018.03.08
PHP Simple HTML DOM Parser  (0) 2018.02.27
정규식 예제  (0) 2018.02.27

안녕하세요. 이번 시간에는 선택한 태그의 속성이나 내용, 스타일, 데이터를 조회하거나 변경하는 방법에 대해 알아보겠습니다. 다음과 같은 태그가 있다고 가정합니다. 상응하는 순수 자바스크립트 코드도 보여드리겠습니다.

<div id="zero" hidden="false" name="zero" class="babo" value="Hello" data-age="23">Content</div>

get

get 메소드는 제이쿼리 객체를 자바스크립트 객체로 다시 전환하는 역할을 합니다. get 메소드 안의 인자는 여러 개의 태그(클래스같은 경우 여러 개의 태그를 동시에 선택 가능) 중에 몇 번째 태그를 자바스크립트 객체로 전환할 건지 선택할 수 있게 해줍니다.

$('#zero').get(0); // <div id="zero"></div>

attr

attr 속성을 조회하거나 변경할 수 있는 메소드입니다. 인자를 하나만 주면 해당 속성의 값을 조회하고, 두 개를 주면 해당 속성의 값을 변경합니다. 아래의 prop 메소드도 보고 그 차이점을 꼭 알아두셔야 합니다.

$('#zero').attr('name'); // 'zero'
$('#zero').attr('name', 'hero'); // name 속성을 hero로 변경 
document.getElementById('zero').name = 'hero';

val

value 속성만을 다루는 메소드입니다. 인자가 없으면 value를 조회하고, 인자가 있으면 그 값으로 value를 바꿉니다.

$('#zero').val(); // 'zero'
$('#zero').val('hero'); // value를 hero로 변경
document.getElementById('zero').value = 'hero'

prop

attr과 유사하지만 속성중에 true/false 값을 가지는 속성들만을 위한 메소드입니다. 대표적인 예로 hidden, readonly, checked 등의 속성이 있습니다.

$('#zero').prop('hidden'); // false
$('#zero').prop('hidden', true); // hidden 속성의 값을 true로 변경
document.getElementById('zero').hidden = true;

addClass

클래스를 추가하는 메소드입니다.

$('#zero').addClass('genius');
document.getElementById('zero').classList.add('genius')

removeClass

클래스를 제거하는 메소드입니다.

$('#zero').removeClass('genius');
document.getElementById('zero').classList.remove('genius');

toggleClass

해당 클래스가 있으면 지우고, 없으면 만듭니다.

$('#zero').toggleClass('genius'); // genius 추가
$('#zero').toggleClass('genius'); // genius 삭제
document.getElementById('zero').classList.toggle('genius')

html

innerHTML과 같습니다. 

$('#zero').html(); // Content
$('#zero').html('Changed'); // 내용을 Changed로 변경
document.getElementById('zero').innerHTML = 'Changed';

text

textContent를 바꿉니다. innerHTML과는 달리 태그를 넣을 수는 없습니다.

$('#zero').text(); // Content
$('#zero').text('TextChanged'); // 내용을 TextChanged로 변경

css

스타일 속성을 조회하거나 변경합니다. 인자를 하나만 주면 해당 스타일 속성값을 조회하고, 두 개를 주면 해당 값으로 변경합니다. 두 개의 인자를 따로 주는 대신에 하나의 객체를 인자로 넘겨 여러 스타일을 동시에 바꿀 수 있습니다.

$('#zero').css('width'); // 465px
$('#zero').css('width', 300); // 300px로 변경
$('#zero').css({ width: 300, height: 300 }); // 여러 스타일 동시 변경
document.getElementById('zero').style.width = '300px';

height

태그의 높이를 알려줍니다.

$('#zero').height();
document.getElementById('zero').style.height;

width

태그의 너비를 알려줍니다.

$('#zero').width();
document.getElementById('zero').style.width;

position

태그의 상대적인 위치를 알려줍니다.

$('#zero').position(); // { left: 값, top: 값 }
var el = document.getElementById('zero');
{ left: el.offsetLeft, top: el.offsetTop }

data

마지막으로 태그에 데이터를 조회하거나 저장하는 방법입니다. html5에서는 태그에 데이터를 저장할 수 있습니다. data-age, data-name 처럼 data- 접두어를 붙이면 됩니다. 이렇게 만들어진 데이터는 data 메소드로 가져올 수 있습니다.

$('#zero').data('age'); // 23
$('#zero').data('age', 24); // 24로 data-age를 24로 변경
document.getElementById('zero')['data-age'] = 24; 


출처 : https://www.zerocho.com/category/jQuery/post/57a9d6266a275815008d9a9f

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

[jQuery] file type 예외처리  (0) 2019.04.30
JQuery 노드찾기  (0) 2018.04.17
callback 간단예제  (0) 2018.03.06
클로저 간단예제  (0) 2018.03.06
js 캡쳐  (0) 2018.03.05
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="utf-8">
    <style>
 
        #wrapper {
            width: 259px;
            height: 300px;
            background: skyblue;
        }
        .box {
            float: left;
            width: 30px;
            height: 30px;
            border:1px solid #000;
            margin: 0 5px 5px 0;
        }
        /* 7, 14, 21, 28 번째 box 배경색 변경 (7의배수) */
        .box:nth-child(7n){
            background: red;
        }
        /* 22번 부터 이후 모든 box 폰트색 변경 */
        .box:nth-child(n+22) {
            color: blue;
        }
        /* 1번째 부터 4번째 까지 box 배경색 변경 */
        .box:nth-child(-n+5) {
            background: green;
        }
        /* 16번째 부터 19번째 까지 box 배경색 변경 */
        .box:nth-child(n+16):nth-child(-n+19) {
            background: hotpink;
        }
        /* 마지막에서부터 순서를 계산 */
        /* 마지막(28)에서 부터 3번째 */
        .box:nth-last-child(3) {
            background: gold;
        }
        /*참고 : 
        nth-last-child(n)는  마지막에서부터 순서를 계산
        .box:nth-child(odd) { color: red; } 홀수
        .box:nth-child(even) { color: red; } 짝수*/
        
    </style>
</head>
<body>
    <div id="wrapper">
        <div class="box">1</div>   
        <div class="box">2</div>   
        <div class="box">3</div>   
        <div class="box">4</div>   
        <div class="box">5</div>   
        <div class="box">6</div>   
        <div class="box">7</div>   
        <div class="box">8</div>   
        <div class="box">9</div>   
        <div class="box">10</div>   
        <div class="box">11</div>   
        <div class="box">12</div>   
        <div class="box">13</div>   
        <div class="box">14</div>   
        <div class="box">15</div>   
        <div class="box">16</div>   
        <div class="box">17</div>   
        <div class="box">18</div>   
        <div class="box">19</div>   
        <div class="box">20</div>   
        <div class="box">21</div>   
        <div class="box">22</div>   
        <div class="box">23</div>   
        <div class="box">24</div>   
        <div class="box">25</div>   
        <div class="box">26</div>   
        <div class="box">28</div>   
        <div class="box">28</div>               
    </div>
</body>
</html>



결과



출처: http://mylife365.tistory.com/252 [변화에 적응하기]

CSS3에서는 :nth-child(n) 선택자를 사용하여 여러 개의 항목이 일렬로 나열되어 있는 경우,
class나 id를 사용하지 않고 스타일을 지정할 항목이 몇 번째에 있는지 따져서 스타일을 적용할 수 있습니다.

Markup

  1. <ul class="list">
  2. <li>첫번째 글</li>
  3. <li>두번째 글</li>
  4. <li>세번째 글</li>
  5. <li>네번째 글</li>
  6. <li>다섯번째 글</li>
  7. <li>여섯번째 글</li>
  8. <li>일곱번째 글</li>
  9. <li>여덟번째 글</li>
  10. </ul>

 

1. 원하는 자식을 숫자로 선택할 수 있습니다.


 

· 다섯번째 글 선택하기

– 선택하고자 하는 종류의 tag 뒤에 ‘:nth-child( )‘ 라고 쓰고 괄호안에 ‘원하는 숫자‘를 써줍니다.

  1. .list li:nth-child(5) {
  2. background-color: #ffff00;
  3. }

 

· 3의 배수로 선택하기

– 선택하고자 하는 종류의 tag 뒤에 ‘:nth-child( )‘ 라고 쓰고 괄호안에 ‘원하는 숫자 + n‘을 써줍니다.

  1. .list li:nth-child(3n) {
  2. background-color: #ffff00;
  3. }

 

· 두번째 글 선택 후 3의 배수로 선택하기

  1. .list li:nth-child(3n + 2) {
  2. background-color: #ffff00;
  3. }

 

 

2. 홀수와 짝수로 선택할 수 있습니다.


 

· 홀수 선택하기

– 선택하고자 하는 종류의 tag 뒤에 ‘:nth-child( )‘ 라고 쓰고 괄호안에 ‘odd‘라고 써줍니다.

  1. .list li:nth-child(odd) {
  2. background-color: #ffff00;
  3. }

 

· 짝수 선택하기

– 선택하고자 하는 종류의 tag 뒤에 ‘:nth-child( )‘ 라고 쓰고 괄호안에 ‘even‘이라고 써줍니다.

  1. .list li:nth-child(even) {
  2. background-color: #ffff00;
  3. }

 

 

3. 뒤에서부터 선택할 수 있습니다.


 

· 뒤에서 두번째 글(일곱번째 글) 선택하기

– 선택하고자 하는 종류의 tag 뒤에 ‘:nth-last-child( )‘ 라고 쓰고 괄호안에 ‘원하는 숫자‘를 써줍니다.

  1. .list li:nth-last-child(2) {
  2. background-color: #ffff00;
  3. }

 

· 뒤에서 첫번째 글 선택 후 3배수로 선택하기

  1. .list li:nth-last-child(3n + 1) {
  2. background-color: #ffff00;
  3. }

출처 : http://mylife365.tistory.com/252

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

[CSS] nth-child (n번째 부터 n번째 까지 css적용)  (0) 2018.04.05
IE8에서도 되는 라운딩  (0) 2018.03.02
로딩중입니다  (0) 2018.02.28

기본적으로 설치된 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]

- HTML

	

email@domain.com



- CSS

/* colors */
html {
  width: 100%;
  height: 100%;
}

body {
  background-color: #eff3f4;
  position: relative;
  width: 100%;
  height: 100%;
  font-size: 16px;
  font-family: "Source Sans Pro", sans-serif;
  font-weight: 400;
  -webkit-font-smoothing: antialiased;
}

form {
  position: absolute;
  top: 50%;
  left: 50%;
  -webkit-transform: translate(-50%, -50%);
          transform: translate(-50%, -50%);
  display: block;
  width: 100%;
  max-width: 400px;
  background-color: #fff;
  margin: 0;
  padding: 2.25em;
  -webkit-box-sizing: border-box;
          box-sizing: border-box;
  border: solid 1px #ddd;
  border-radius: 0.5em;
  font-family: "Source Sans Pro", sans-serif;
}
form .svgContainer {
  position: relative;
  width: 200px;
  height: 200px;
  margin: 0 auto 1em;
  border-radius: 50%;
  background: none;
  border: solid 2.5px #3a5e77;
  overflow: hidden;
  pointer-events: none;
}
form .svgContainer div {
  position: relative;
  width: 100%;
  height: 0;
  overflow: hidden;
  padding-bottom: 100%;
}
form .svgContainer .mySVG {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
}
form .inputGroup {
  margin: 0 0 2em;
  padding: 0;
  position: relative;
}
form .inputGroup:last-of-type {
  margin-bottom: 0;
}
form label {
  margin: 0 0 12px;
  display: block;
  font-size: 1.25em;
  color: #217093;
  font-weight: 700;
  font-family: inherit;
}
form input[type="email"],
form input[type="text"],
form input[type="password"] {
  display: block;
  margin: 0;
  padding: 0 1em 0;
  background-color: #f3fafd;
  border: solid 2px #217093;
  border-radius: 4px;
  -webkit-appearance: none;
  -webkit-box-sizing: border-box;
          box-sizing: border-box;
  width: 100%;
  height: 65px;
  font-size: 1.55em;
  color: #353538;
  font-weight: 600;
  font-family: inherit;
  -webkit-transition: border-color 0.25s ease-out, -webkit-box-shadow 0.2s linear;
  transition: border-color 0.25s ease-out, -webkit-box-shadow 0.2s linear;
  transition: box-shadow 0.2s linear, border-color 0.25s ease-out;
  transition: box-shadow 0.2s linear, border-color 0.25s ease-out, -webkit-box-shadow 0.2s linear;
}
form input[type="email"]:focus,
form input[type="text"]:focus,
form input[type="password"]:focus {
  outline: none;
  -webkit-box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.1);
          box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.1);
  border: solid 2px #4eb8dd;
}
form input[type="email"],
form input[type="text"] {
  padding: 14px 1em 0px;
}
form button {
  display: block;
  margin: 0;
  padding: 0.65em 1em 1em;
  background-color: #4eb8dd;
  border: none;
  border-radius: 4px;
  -webkit-box-sizing: border-box;
          box-sizing: border-box;
  -webkit-box-shadow: none;
          box-shadow: none;
  width: 100%;
  height: 65px;
  font-size: 1.55em;
  color: #fff;
  font-weight: 600;
  font-family: inherit;
  -webkit-transition: background-color 0.2s ease-out;
  transition: background-color 0.2s ease-out;
}
form button:hover, form button:active {
  background-color: #217093;
}
form .inputGroup1 .helper {
  position: absolute;
  z-index: 1;
  font-family: inherit;
}
form .inputGroup1 .helper1 {
  top: 0;
  left: 0;
  -webkit-transform: translate(1.4em, 2.6em) scale(1);
          transform: translate(1.4em, 2.6em) scale(1);
  -webkit-transform-origin: 0 0;
          transform-origin: 0 0;
  color: #217093;
  font-size: 1.25em;
  font-weight: 400;
  opacity: 0.65;
  pointer-events: none;
  -webkit-transition: opacity 0.2s linear, -webkit-transform 0.2s ease-out;
  transition: opacity 0.2s linear, -webkit-transform 0.2s ease-out;
  transition: transform 0.2s ease-out, opacity 0.2s linear;
  transition: transform 0.2s ease-out, opacity 0.2s linear, -webkit-transform 0.2s ease-out;
}
form .inputGroup1.focusWithText .helper {
  /*input[type='email']:focus + .helper {*/
  -webkit-transform: translate(1.4em, 2em) scale(0.65);
          transform: translate(1.4em, 2em) scale(0.65);
  opacity: 1;
}



- JS

<script src="http://cdnjs.cloudflare.com/ajax/libs/gsap/latest/TweenMax.min.js"></script>  파일 가져와야함

	var email = document.querySelector('#email'), password = document.querySelector('#password'), mySVG = document.querySelector('.svgContainer'), armL = document.querySelector('.armL'), armR = document.querySelector('.armR'), eyeL = document.querySelector('.eyeL'), eyeR = document.querySelector('.eyeR'), nose = document.querySelector('.nose'), mouth = document.querySelector('.mouth'), mouthBG = document.querySelector('.mouthBG'), mouthSmallBG = document.querySelector('.mouthSmallBG'), mouthMediumBG = document.querySelector('.mouthMediumBG'), mouthLargeBG = document.querySelector('.mouthLargeBG'), mouthMaskPath = document.querySelector('#mouthMaskPath'), mouthOutline = document.querySelector('.mouthOutline'), tooth = document.querySelector('.tooth'), tongue = document.querySelector('.tongue'), chin = document.querySelector('.chin'), face = document.querySelector('.face'), eyebrow = document.querySelector('.eyebrow'), outerEarL = document.querySelector('.earL .outerEar'), outerEarR = document.querySelector('.earR .outerEar'), earHairL = document.querySelector('.earL .earHair'), earHairR = document.querySelector('.earR .earHair'), hair = document.querySelector('.hair');
var caretPos, curEmailIndex, screenCenter, svgCoords, eyeMaxHorizD = 20, eyeMaxVertD = 10, noseMaxHorizD = 23, noseMaxVertD = 10, dFromC, eyeDistH, eyeLDistV, eyeRDistV, eyeDistR, mouthStatus = "small";

function getCoord(e) {
	var 	carPos = email.selectionEnd,
		div = document.createElement('div'),
		span = document.createElement('span'),
		copyStyle = getComputedStyle(email),
		emailCoords = {}, caretCoords = {}, centerCoords = {}
	;
	[].forEach.call(copyStyle, function(prop){
		div.style[prop] = copyStyle[prop];
	});
	div.style.position = 'absolute';
	document.body.appendChild(div);
	div.textContent = email.value.substr(0, carPos);
	span.textContent = email.value.substr(carPos) || '.';
	div.appendChild(span);
	
	emailCoords = getPosition(email);							//console.log("emailCoords.x: " + emailCoords.x + ", emailCoords.y: " + emailCoords.y);
	caretCoords = getPosition(span);							//console.log("caretCoords.x " + caretCoords.x + ", caretCoords.y: " + caretCoords.y);
	centerCoords = getPosition(mySVG);							//console.log("centerCoords.x: " + centerCoords.x);
	svgCoords = getPosition(mySVG);
	screenCenter = centerCoords.x + (mySVG.offsetWidth / 2);		//console.log("screenCenter: " + screenCenter);
	caretPos = caretCoords.x + emailCoords.x;					//console.log("caretPos: " + caretPos);
	
	dFromC = screenCenter - caretPos; 							//console.log("dFromC: " + dFromC);
	var pFromC = Math.round((caretPos / screenCenter) * 100) / 100;
	if(pFromC < 1) {
		
	} else if(pFromC > 1) {
		pFromC -= 2;
		pFromC = Math.abs(pFromC);
	}

	eyeDistH = -dFromC * .05;
	if(eyeDistH > eyeMaxHorizD) {
		eyeDistH = eyeMaxHorizD;
	} else if(eyeDistH < -eyeMaxHorizD) {
		eyeDistH = -eyeMaxHorizD;
	}
	
	var eyeLCoords = {x: svgCoords.x + 84, y: svgCoords.y + 76};
	var eyeRCoords = {x: svgCoords.x + 113, y: svgCoords.y + 76};
	var noseCoords = {x: svgCoords.x + 97, y: svgCoords.y + 81};
	var mouthCoords = {x: svgCoords.x + 100, y: svgCoords.y + 100};
	var eyeLAngle = getAngle(eyeLCoords.x, eyeLCoords.y, emailCoords.x + caretCoords.x, emailCoords.y + 25);
	var eyeLX = Math.cos(eyeLAngle) * eyeMaxHorizD;
	var eyeLY = Math.sin(eyeLAngle) * eyeMaxVertD;
	var eyeRAngle = getAngle(eyeRCoords.x, eyeRCoords.y, emailCoords.x + caretCoords.x, emailCoords.y + 25);
	var eyeRX = Math.cos(eyeRAngle) * eyeMaxHorizD;
	var eyeRY = Math.sin(eyeRAngle) * eyeMaxVertD;
	var noseAngle = getAngle(noseCoords.x, noseCoords.y, emailCoords.x + caretCoords.x, emailCoords.y + 25);
	var noseX = Math.cos(noseAngle) * noseMaxHorizD;
	var noseY = Math.sin(noseAngle) * noseMaxVertD;
	var mouthAngle = getAngle(mouthCoords.x, mouthCoords.y, emailCoords.x + caretCoords.x, emailCoords.y + 25);
	var mouthX = Math.cos(mouthAngle) * noseMaxHorizD;
	var mouthY = Math.sin(mouthAngle) * noseMaxVertD;
	var mouthR = Math.cos(mouthAngle) * 6;
	var chinX = mouthX * .8;
	var chinY = mouthY * .5;
	var chinS = 1 - ((dFromC * .15) / 100);
	if(chinS > 1) {chinS = 1 - (chinS - 1);}
	var faceX = mouthX * .3;
	var faceY = mouthY * .4;
	var faceSkew = Math.cos(mouthAngle) * 5;
	var eyebrowSkew = Math.cos(mouthAngle) * 25;
	var outerEarX = Math.cos(mouthAngle) * 4;
	var outerEarY = Math.cos(mouthAngle) * 5;
	var hairX = Math.cos(mouthAngle) * 6;
	var hairS = 1.2;
	
	TweenMax.to(eyeL, 1, {x: -eyeLX , y: -eyeLY, ease: Expo.easeOut});
	TweenMax.to(eyeR, 1, {x: -eyeRX , y: -eyeRY, ease: Expo.easeOut});
	TweenMax.to(nose, 1, {x: -noseX, y: -noseY, rotation: mouthR, transformOrigin: "center center", ease: Expo.easeOut});
	TweenMax.to(mouth, 1, {x: -mouthX , y: -mouthY, rotation: mouthR, transformOrigin: "center center", ease: Expo.easeOut});
	TweenMax.to(chin, 1, {x: -chinX, y: -chinY, scaleY: chinS, ease: Expo.easeOut});
	TweenMax.to(face, 1, {x: -faceX, y: -faceY, skewX: -faceSkew, transformOrigin: "center top", ease: Expo.easeOut});
	TweenMax.to(eyebrow, 1, {x: -faceX, y: -faceY, skewX: -eyebrowSkew, transformOrigin: "center top", ease: Expo.easeOut});
	TweenMax.to(outerEarL, 1, {x: outerEarX, y: -outerEarY, ease: Expo.easeOut});
	TweenMax.to(outerEarR, 1, {x: outerEarX, y: outerEarY, ease: Expo.easeOut});
	TweenMax.to(earHairL, 1, {x: -outerEarX, y: -outerEarY, ease: Expo.easeOut});
	TweenMax.to(earHairR, 1, {x: -outerEarX, y: outerEarY, ease: Expo.easeOut});
	TweenMax.to(hair, 1, {x: hairX, scaleY: hairS, transformOrigin: "center bottom", ease: Expo.easeOut});
	
	document.body.removeChild(div);
};

function onEmailInput(e) {
	getCoord(e);
	var value = e.target.value;
	curEmailIndex = value.length;
	
	// very crude email validation for now to trigger effects
	if(curEmailIndex > 0) {
		if(mouthStatus == "small") {
			mouthStatus = "medium";
			TweenMax.to([mouthBG, mouthOutline, mouthMaskPath], 1, {morphSVG: mouthMediumBG, shapeIndex: 8, ease: Expo.easeOut});
			TweenMax.to(tooth, 1, {x: 0, y: 0, ease: Expo.easeOut});
			TweenMax.to(tongue, 1, {x: 0, y: 1, ease: Expo.easeOut});
			TweenMax.to([eyeL, eyeR], 1, {scaleX: .85, scaleY: .85, ease: Expo.easeOut});
		}
		if(value.includes("@")) {
			mouthStatus = "large";
			TweenMax.to([mouthBG, mouthOutline, mouthMaskPath], 1, {morphSVG: mouthLargeBG, ease: Expo.easeOut});
			TweenMax.to(tooth, 1, {x: 3, y: -2, ease: Expo.easeOut});
			TweenMax.to(tongue, 1, {y: 2, ease: Expo.easeOut});
			TweenMax.to([eyeL, eyeR], 1, {scaleX: .65, scaleY: .65, ease: Expo.easeOut, transformOrigin: "center center"});
		} else {
			mouthStatus = "medium";
			TweenMax.to([mouthBG, mouthOutline, mouthMaskPath], 1, {morphSVG: mouthMediumBG, ease: Expo.easeOut});
			TweenMax.to(tooth, 1, {x: 0, y: 0, ease: Expo.easeOut});
			TweenMax.to(tongue, 1, {x: 0, y: 1, ease: Expo.easeOut});
			TweenMax.to([eyeL, eyeR], 1, {scaleX: .85, scaleY: .85, ease: Expo.easeOut});
		}
	} else {
		mouthStatus = "small";
		TweenMax.to([mouthBG, mouthOutline, mouthMaskPath], 1, {morphSVG: mouthSmallBG, shapeIndex: 9, ease: Expo.easeOut});
		TweenMax.to(tooth, 1, {x: 0, y: 0, ease: Expo.easeOut});
		TweenMax.to(tongue, 1, {y: 0, ease: Expo.easeOut});
		TweenMax.to([eyeL, eyeR], 1, {scaleX: 1, scaleY: 1, ease: Expo.easeOut});
	}
}

function onEmailFocus(e) {
	e.target.parentElement.classList.add("focusWithText");
	getCoord();
}

function onEmailBlur(e) {
	if(e.target.value == "") {
		e.target.parentElement.classList.remove("focusWithText");
	}
	resetFace();
}

function onPasswordFocus(e) {
	coverEyes();
}

function onPasswordBlur(e) {
	uncoverEyes();
}

function coverEyes() {
	TweenMax.to(armL, .45, {x: -93, y: 2, rotation: 0, ease: Quad.easeOut});
	TweenMax.to(armR, .45, {x: -93, y: 2, rotation: 0, ease: Quad.easeOut, delay: .1});
}

function uncoverEyes() {
	TweenMax.to(armL, 1.35, {y: 220, ease: Quad.easeOut});
	TweenMax.to(armL, 1.35, {rotation: 105, ease: Quad.easeOut, delay: .1});
	TweenMax.to(armR, 1.35, {y: 220, ease: Quad.easeOut});
	TweenMax.to(armR, 1.35, {rotation: -105, ease: Quad.easeOut, delay: .1});
}

function resetFace() {
	TweenMax.to([eyeL, eyeR], 1, {x: 0, y: 0, ease: Expo.easeOut});
	TweenMax.to(nose, 1, {x: 0, y: 0, scaleX: 1, scaleY: 1, ease: Expo.easeOut});
	TweenMax.to(mouth, 1, {x: 0, y: 0, rotation: 0, ease: Expo.easeOut});
	TweenMax.to(chin, 1, {x: 0, y: 0, scaleY: 1, ease: Expo.easeOut});
	TweenMax.to([face, eyebrow], 1, {x: 0, y: 0, skewX: 0, ease: Expo.easeOut});
	TweenMax.to([outerEarL, outerEarR, earHairL, earHairR, hair], 1, {x: 0, y: 0, scaleY: 1, ease: Expo.easeOut});
}

function getAngle(x1, y1, x2, y2) {
	var angle = Math.atan2(y1 - y2, x1 - x2);
	return angle;
}

function getPosition(el) {
	var xPos = 0;
	var yPos = 0;

	while (el) {
		if (el.tagName == "BODY") {
			// deal with browser quirks with body/window/document and page scroll
			var xScroll = el.scrollLeft || document.documentElement.scrollLeft;
			var yScroll = el.scrollTop || document.documentElement.scrollTop;

			xPos += (el.offsetLeft - xScroll + el.clientLeft);
			yPos += (el.offsetTop - yScroll + el.clientTop);
		} else {
			// for all other non-BODY elements
			xPos += (el.offsetLeft - el.scrollLeft + el.clientLeft);
			yPos += (el.offsetTop - el.scrollTop + el.clientTop);
		}

		el = el.offsetParent;
	}
	return {
		x: xPos,
		y: yPos
	};
}

email.addEventListener('focus', onEmailFocus);
email.addEventListener('blur', onEmailBlur);
email.addEventListener('input', onEmailInput);
password.addEventListener('focus', onPasswordFocus);
password.addEventListener('blur', onPasswordBlur);
TweenMax.set(armL, {x: -93, y: 220, rotation: 105, transformOrigin: "top left"});
TweenMax.set(armR, {x: -93, y: 220, rotation: -105, transformOrigin: "top right"});




출처 : https://codepen.io/dsenneff/pen/QajVxO?editors=0100#0

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

+ Recent posts