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 주소에서 나오는 것으로 보입니다.
\
규칙에는 요구 사항이 없습니다. 규칙을 두 줄로 분할하는 데에만 사용됩니다.