iptables를 사용하여 네트워크 간 패킷 라우팅

iptables를 사용하여 네트워크 간 패킷 라우팅

iptables만 사용하여 일종의 프록시를 만들려고 합니다.

Linux 머신(내 에이전트)에는 두 개의 포트가 있습니다.

  • p2p1이 인터넷에 연결됩니다.
  • em1은 로컬 네트워크에 연결되어 있습니다.

로컬 네트워크에는 두 개의 장치가 있습니다(Linux 시스템 제외). 여기에 연결하려면 다음을 입력해야 합니다(인터넷상의 모든 컴퓨터에서).

  • xx.xx.xx.xx:10001
  • xx.xx.xx.xx:10002

여기서 xx.xx.xx.xx는 공용 IP(동적 IP)입니다.

이러한 장치는 다음 IP에 액세스하여 em1 포트의 Linux 시스템에서 액세스할 수 있습니다.

  • 192.168.3.100:80
  • 192.168.3.101:80

따라서 p2p1에서 xx.xx.xx.xx:10001로 라우팅된 모든 트래픽은 em1에서 192.168.3.100으로 리디렉션되어야 합니다.

또한 패킷이 되돌아오는 길을 찾을 수 있도록 소스 IP나 이와 유사한 것을 보존해야 합니다.

이것이 IP 테이블 스크립트에서 사용하는 것입니다.

iptables -t nat -F  # Clear out any old rules.

MyIP=10.27.155.200
MyPort=10001
DestIP=192.168.3.100
DestPort=80

iptables -t nat -A PREROUTING --dst $MyIP -p tcp --dport $MyPort -j DNAT --to-destination $DestIP:$DestPort
iptables -t nat -A POSTROUTING -p tcp --dst $DestIP --dport $DestPort -j SNAT --to-source $MyIP
iptables -t nat -A OUTPUT --dst $MyIP -p tcp--dport $MyPort -j DNAT --to-destination $DestIP:$DestPort

내 IP가 동적이기 때문에 분명히 문제가 있지만 매번 하드코딩합니다. 또한 패킷이 컴퓨터로 반환되면 원래 소스에 어떻게 도달했는지 알 수 없습니다.

여기서 어디로 가야할지 모르겠습니다.

답변1

포트를 전달하려면 먼저 다음 두 가지 방법 중 하나를 사용하여 커널에서 전달을 활성화해야 합니다.

  • /proc루트로 설정을 수정합니다. 재부팅할 때까지만 지속됩니다.

    echo 1 > /proc/sys/net/ipv4/ip_forward

  • 설정 수정 /etc/sysctl.conf: 이는 지속됩니다.

    연결 net.ipv4.ip_forward=1/etc/sysctl.conf후 실행$ sudo sysctl -p

두 번째로 해야 할 일은 iptables다음 구문을 사용하여 전달 규칙을 구성하는 것입니다.

iptables -t nat -A PREROUTING -i [external_interface] -p [protocol] \ 
--dport [external_port] -j DNAT --to-destination [internal_ip]:[internal_port]

따라서 스크립트를 사용하십시오.

external_iface=p2p1
iptables -t nat -A PREROUTING -i $external_iface -p tcp \
--dport $MyPort -j DNAT --to-destination ${DestIP}:${DestPort}

그러면 psp1의 포트 10001(IP 주소에 관계 없음)에서 192.168.3.100의 포트 80으로 모든 트래픽이 전달됩니다. 192.168.3.100에서는 트래픽이 em1에 할당된 모든 IP 주소에서 나오는 것으로 보입니다.

\규칙에는 요구 사항이 없습니다. 규칙을 두 줄로 분할하는 데에만 사용됩니다.

관련 정보