홈 네트워크 프록시 서버

홈 네트워크 프록시 서버

먼저 내 설정은 다음과 같습니다.

  1. 케이블 모뎀과 나를 인터넷에 연결해주는 Fritz!Box
  2. 네트워크 케이블을 통해 Fritz Box에 연결된 PC
  3. Fritz Box에도 연결된 여러 Wi-Fi 장치

내가 달성하고 싶은 것은 다음과 같습니다. 별도의 컴퓨터에 네트워크 프록시 서버와 같은 것을 설정하여 내 네트워크의 모든 장치와 인터넷 사이의 모든 트래픽을 가로채서 (잠재적으로) 중계하고 싶습니다. 네트워크의 장치 간 트래픽에는 관심이 없습니다. 특정 프로토콜/포트/IP 주소의 메시지로 제한되고 싶지 않습니다. 나의 주요 목표는 네트워킹/프로토콜 등에 대해 배우고 여러 응용 프로그램을 구현하고 해당 프록시 서버에서 놀아 보는 것입니다. 예는 다음과 같습니다.

  • 지속적인 통신이 있었던 모든 IP/포트에 대한 통계를 수집합니다(따라서 기본적으로 모든 트래픽을 전달하고 일부 계산을 수행함).
  • 일부 트래픽을 차단합니다(예: IP 주소를 기반으로 하여 아이들이 보지 말아야 할 항목에 액세스하지 못하도록 방지합니다. 소프트웨어가 나에 대한 개인정보 관련 데이터를 전송하지 못하도록 방지합니다.)
  • 내 홈 네트워크의 새 장치에 대해 경고(예: 누군가 내 Wi-Fi를 오용함)
  • 메시지를 전달하기 전에 변경하세요(예: 들어오는 웹 콘텐츠에 텍스트 추가).
  • 인터넷의 서버나 연결된 장치 중 하나에 자신의 메시지를 보냅니다(예: 웹 인터페이스에 표시할 수집된 사용 통계).
  • 더 많은 ...

사용 가능한 Unix(/Linux) 시스템이 있다고 가정합니다.

  • 네트워크 설정: 어떤 네트워크 토폴로지가 필요합니까? 내 네트워크의 어디에 프록시 시스템을 배치해야 합니까?
  • 설정: 들어오고 나가는 모든 트래픽을 수신하고 전달하려면 프록시에서 무엇을 구성해야 합니까? 호스트 장치의 설정을 변경하고 싶지 않습니다. 네트워크에 연결하면 충분합니다.
  • 프로그래밍 가능성: Python을 사용하여 메시지/패킷을 읽고, 수정하고, 쓰고, 보내고, 차단하려면 무엇을 추가로 설정해야 합니까?
  • 제한 사항: 이러한 설정이 네트워크 속도에 심각한 영향을 미칠 수 있습니까?

--- 편집 --- 약간의 진전을 이루고 들어오는 연결을 허용하는 Python 스크립트를 만들었습니다. 또한 첫 번째 컴퓨터를 게이트웨이로 사용하도록 다른 컴퓨터의 Wi-Fi 연결을 설정했습니다. 이제 메시지를 성공적으로 받았지만 문제는 메시지를 실제로 어디로 보내야 할지 전혀 모른다는 것입니다. 소켓 구성을 변경하고 투명 프록시를 사용해야 한다고 가정했지만 실제로 Python에서 이를 수행하는 방법에 대해서는 많이 찾지 못했습니다. 또한 내 스크립트는 현재 Mac에서 실행되므로 소켓에 대한 모든 옵션을 사용할 수 없을 수도 있습니다.

내 현재 스니펫 아래:

import socket


def received_from(sock, timeout):
    dt = ""
    sock.settimeout(timeout)
    try:
        while True:
            dt = sock.recv(4096)
            if not dt:
                break
            dt = + dt
    except:
        pass
    return dt


def hexdump(data, length=16):
    filter = ''.join([(len(repr(chr(x))) == 3) and chr(x) or '.' for x in range(256)])
    lines = []
    digits = 4 if isinstance(data, str) else 2
    for c in range(0, len(data), length):
        chars = data[c:c+length]
        hex = ' '.join(["%0*x" % (digits, (x)) for x in chars])
        printable = ''.join(["%s" % (((x) <= 127 and filter[(x)]) or '.') for x in chars])
        lines.append("%04x  %-*s  %s\n" % (c, length*3, hex, printable))
    print(''.join(lines))


s = socket.socket()
print("Socket successfully created")

try:
    port = 12222

    s.bind(('', port))
    print("socket bound to port {}".format(port))

    s.listen(5)
    print("socket listening")

    print("proxy sock: {}".format(s.getsockname()))

    while True:
        try:
            c, addr = s.accept()
            print("got connection from {}".format(addr))
            print("client peer: {}".format(c.getpeername()))
            print("client sock: {}".format(c.getsockname()))

            data = received_from(c, 3)
            hexdump(data)
            print()

            c.send("Connection received. Thanks and bye!".encode('utf-8'))

            c.close()
        except Exception as e:
            c.close()
            raise e

except Exception as e:
    s.close()
    raise e

답변1

몇 가지 제안이 있습니다 :

1) 먼저 홈 게이트웨이(FritzBox)의 관리 페이지에 접속하세요. 일반적으로 브라우저를 통해 192.168.1.1에 대한 사용자 이름/비밀번호 연결입니다. WAN, LAN, Wi-Fi 설정을 검토하고 이에 대해 읽어보세요.

2) Linux 및 명령줄 도구 설치: tcpdump, netstat, nc, telnet

3) 사용자 인터페이스가 있는 다른 컴퓨터 Windows/Linux가 있고 거기에 Wireshark를 설치합니다.

4) 몇 가지 간단한 개발을 시도하십시오.Python 소켓 수준 프로그램(파이썬 소켓 라이브러리는 C 소켓 API에 잘 맞습니다)

5) tcpdump를 사용하여 서로 다른 컴퓨터에 있는 프로그램 간의 트래픽을 기록하고 Wireshark를 사용하여 패키지를 검사합니다.

6) 홈 LAN 네트워크에 프록시 서버(전용 컴퓨터)를 추가해 보세요.

7) Apache 웹 서버, CuteFTP, SMPT Relay, MiniDLNA 등과 같은 프로그램을 설치합니다.

당신은 내치트시트리눅스가 네트워크 관련 것들을 실험하기 위해

8) 네트워크에 있는 컴퓨터 간의 연결을 보호하기 위해 자신만의 SSL 인증서를 만들어 보십시오.

귀하의 질문에 대한 답변:

네트워크 설정: 프록시는 다른 시스템과 마찬가지로 네트워크에 배치됩니다. 그러나 모든 시스템에서는 이를 참조합니다("게이트웨이"로 사용).

설정: 모든 시스템은 구성 매개변수를 통해 프록시(포트, 주소)에 대한 정보를 받아야 합니다.

프로그래밍 가능성: 아무것도 없습니다. 그것은 즉시 작동합니다.

제한 사항: 이러한 설정이 네트워크 속도에 심각한 영향을 미칠 수 있습니까? 아니요.

관련 정보