웹포트로 나가는 패킷을 막으려고 하는데 질문이 있습니다.

blue39의 이미지

안녕하세요~~

디바이스 드라이버에서 나가는 패킷을 검사해서 웹으로 나가는 포트를 검색

해서 패킷을 막으려고 합니다. 그래서 코드를 넣어서 테스트를 해봤는데요

왜 TCP로 나가는 패킷의 포트번호가 80이 아닐까요.. ^^;

찍히는 메시지들로 보아 패킷의 목적지 포트가 32774가 됩니다. 이거는 십진

수로 찍은거구요 혹시나 해서 16진수로 찍었더니 같은 포트가 나오더군요.

음.. 제가 잘못 알고 있는걸까요? 전 들어 온 패킷의 skb_buff 데이터를 IP

헤더를 잘라내고 TCP 헤더를 보고 한 작업이거든요. 이 부분에 웹 포트나 특정

포트를 막을려면 어떻게 해야 할까요? 여러분의 조언 부탁드립니다.

그럼 좋은 하루 보내시구요

운형의 이미지

80포트에대해 tcp커넥션을 처음 시도할때, 즉 SYN 플래그를 달고 나갈때는 웰노운 포트인 80을 사용할겁니다.
그후 3way hand shaking이 끝나면, 서버측에서는 accept()가 리턴하고 클라이언트와 1:1로 연결된 포트가 생성됩니다. 이 과정이 지난후 패킷을 덤프하면 말씀하신 것 처럼 포트가 다르게 나오겠죠.

Do you think that's the air you are breathing now?

blue39의 이미지

네 답변 감사드리구요. 저두 그 생각은 해봤는데요 그렇다면 왜 초기에 패킷이

나갈때 그 패킷의 포트가 80이 아닐까요? 일단 연결이 확립되어야 서로간에

임의 포트를 지정하고 데이터가 교환되는게 정상이잖아요. 그런데 패킷의 흐름

을 보아서는 초기에 80으로 나가는 패킷이 없더라구요.

음.. 어찌 된 영문인지 너무나 궁금하군요. ^^

eungkyu의 이미지

막아야 하는 것이 서버가 있는 곳인가요? 아니면 클라이언트가 있는 곳인가요?
source와 destination을 잘못체크한 것 아닌가요?

eungkyu의 이미지

운형 wrote:
80포트에대해 tcp커넥션을 처음 시도할때, 즉 SYN 플래그를 달고 나갈때는 웰노운 포트인 80을 사용할겁니다.
그후 3way hand shaking이 끝나면, 서버측에서는 accept()가 리턴하고 클라이언트와 1:1로 연결된 포트가 생성됩니다. 이 과정이 지난후 패킷을 덤프하면 말씀하신 것 처럼 포트가 다르게 나오겠죠.

아닙니다. 포트는 변하지 않습니다.

초코리의 이미지

eungkyu wrote:
운형 wrote:
80포트에대해 tcp커넥션을 처음 시도할때, 즉 SYN 플래그를 달고 나갈때는 웰노운 포트인 80을 사용할겁니다.
그후 3way hand shaking이 끝나면, 서버측에서는 accept()가 리턴하고 클라이언트와 1:1로 연결된 포트가 생성됩니다. 이 과정이 지난후 패킷을 덤프하면 말씀하신 것 처럼 포트가 다르게 나오겠죠.

아닙니다. 포트는 변하지 않습니다.

클라이언트와 서버간의

커넥션이 맺어지면

클라이언트와 통신하는 서버쪽 포트는

80이 아닌 다른 포트로 통신하지않나요??

아니라면 어떻게 되나요?

eungkyu의 이미지

초코리 wrote:
클라이언트와 서버간의

커넥션이 맺어지면

클라이언트와 통신하는 서버쪽 포트는

80이 아닌 다른 포트로 통신하지않나요??

아니라면 어떻게 되나요?

소켓이 (serverip, serverport, clientip, clientport)인 tuple이라 한다면,
(80번 포트로 아무 ip의 접속을 받는) 일반적인 웹서버의 경우

먼저 (serverip, 80, 0.0.0.0, 0)인 소켓이 만들어져 listen을 하고 있다가,
클라이어트가 접속하면 (serverip, 80, clientip, clientport)인 소켓이 만들어져서 통신을 하게 됩니다.

물론 serverip, clientip는 각 컴퓨터의 ip일테고 clientport는 client가 자동으로 만들어준 포트겠죠.

서버의 포트는 변하지 않습니다.
왠만한 network 책이라면 소켓을 구분하는 identifier정도는 설명되어있을 것으로 생각합니다만...

jyj9782의 이미지

어려운거 하시네요.. 하시면 소스좀 보내주세요 ^^
일단 서버측의 포트가 80 포트(소스포트)를 막아야하지 안나요? 웹포트로 접속을 거부하려면..
상대측이 접근하려면 syn 을 보내와도.. drop 해버려야죠.. 소스포트를 가지고 막아버리면 안될까요? syn ~ ack 해야하니가.. ack 를 안보내면 =.= 뭐 지가 별수가 있나요.. syn 패킷이 80포트를 목적지로하면.. 먹어버리고 =.=;; jyj9782@chollian.net 메일주소남깁니다.. 소스 다 작성하시면 좀 보내주세요.. 부탁드려요 ^^ 요즘 공부중이거든요.. 커널..

힘내세요.

blue39의 이미지

여러분들 답변 감사드리구요 ^^

아~~ 그리고 이게 머 대단한 거라고.. 아무것도 모르고 그냥 삽질하는 겁니다.

^^; 그리고 지금 테스트 하는 시스템은 클라이언트가 있고 클라이언트는 일단

공유기를 거쳐서 나가게 됩니다. 정확히 말하면 무선 AP가 되겠죠. 그 공유기

는 외부로 연결이 된 상태이구요. 그리고 공유기에 달린 2개의 NIC은 브리지로

묶여있는 상태입니다. 이 상태에서 클라이언트가 웹 접속을 시도하면 중간의

공유기에서 그 패킷을 돌려 특정 사이트를 보여주려 하는 거거든요. 그런데 이

놈의 포트가 이상하니 이거 원... 아무래도 제가 뭘 잘못하고 있는거 같기도 한

데요.. 일단 제가 작성한 소스라도 보여 드릴테니 여러분이 보시고 잘못된데 있

음 지적 좀 해주세요. 이상 초보가~~~ ^^;

/************************************************************/
	/*************************CHAN******************************/
	struct tcphdr *temptcp; 

	if(skb->nh.iph->protocol == IPPROTO_TCP){
		temptcp = skb->h.th;
		printk("The port Number : %d %d \n", ntohs(temptcp->dest), ntohs(temptcp->source));
		if((temptcp->dest) == htons(80)){
			printk("TX : Same port 80!! goto drop!!\n");
			netif_stop_queue(dev);
			return 0;
		}
			
	}else
                        printk("TX : It`s not  same port.\n");
	/************************************************************/

위 코드는 현재 디바이스 드라이버 내에 패킷을 보내는 최종 함수 내에 들어가

있는 상태입니다. 그럼~~

eungkyu의 이미지

그런데 단순히 웹트래픽을 막는 것이라면 iptables를 이용해서 간단히 할 수 있을텐데 커널부분을 직접 건드는 이유가 따로 있나요?

공부하기 위해서라면야 상관없지만.

jyj9782의 이미지

공부를 위한것 같네요.. IPTABLES 도 역시 모듈이잖아요.. 그러니까.. IPTABLES 를 구현하는 첫걸음 ?=.= 인듯.. 데비안에는 af_packet 인가 하는 모듈을 쓰는데요.. 이거 프린터해서 저도 한번 보고 고쳐써먹어야겠네요 =.=;;

힘내세요.

blue39의 이미지

^^ 웹 트래픽을 막으려는 목적이 아니고 시스템 상에서 인증을 받지 못한 놈

들을 우회 시키려고 하는 겁니다. 한마디로 로그인 않된 놈들은 로그인 하라는

쪽으로 돌리는 거죠.

eungkyu의 이미지

blue39 wrote:
^^ 웹 트래픽을 막으려는 목적이 아니고 시스템 상에서 인증을 받지 못한 놈

들을 우회 시키려고 하는 겁니다. 한마디로 로그인 않된 놈들은 로그인 하라는

쪽으로 돌리는 거죠.


그런 것은 웹 프로그래밍으로 해야 하는 것 아닌가요?
blue39의 이미지

정확히 말씀 드리면 무선 AP에서 접속한 클라이언트들에 대해 802.1x 인증을

받지 못한 녀석들에 대해 웹 리다이렉션을 하려고 합니다. 이런 상황이 아니면

간단히 우회 시키겠지만 802.1x와 연동을 시켜야 하기 때문에 커널 내부에서

돌리려고 하는 겁니다. 우회 시킬 때는 여러 가지 경우의 수가 존재 하기 때문에

무선 AP의 설정에 따라 상황이 틀려지는 일도 있구요.

eungkyu의 이미지

blue39 wrote:
정확히 말씀 드리면 무선 AP에서 접속한 클라이언트들에 대해 802.1x 인증을

받지 못한 녀석들에 대해 웹 리다이렉션을 하려고 합니다. 이런 상황이 아니면

간단히 우회 시키겠지만 802.1x와 연동을 시켜야 하기 때문에 커널 내부에서

돌리려고 하는 겁니다. 우회 시킬 때는 여러 가지 경우의 수가 존재 하기 때문에

무선 AP의 설정에 따라 상황이 틀려지는 일도 있구요.


여기부터는 제가 잘 아는것이 아니라 도와드릴 수가 없네요 :)

언뜻 생각하기에는 iptables에 802.1x 인증 조건을 체크하는 모듈을 만들어서 해결하는 방법도 괜찮을 것 같기는 합니다만, 제가 상황을 알고 있는 것이 아니니.

빨리 해결하시길...

최병현의 이미지

blue39 wrote:
^^ 웹 트래픽을 막으려는 목적이 아니고 시스템 상에서 인증을 받지 못한 놈

들을 우회 시키려고 하는 겁니다. 한마디로 로그인 않된 놈들은 로그인 하라는

쪽으로 돌리는 거죠.

상황을 정확히 모르면서 쓰는 것 같아 조심스럽게 질문을 드립니다.

혹시 AP에서 WEP를 지원하지 않습니까?
지원하면 그냥 WEP를 사용하면 될 것으로 생각됩니다.

제일 궁금한 것은 인증의 목적이 무엇이냐 하는 것입니다.

혹시 이런 것을 구현하시려는 것인지요?
http://wiki.kldp.org/wiki.php/DocbookSgml/Authentication-Gateway-HOWTO

To be a rich

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.