iptables로 어떻게 포워드 할 수 있습니까?


118

포트 8001의 ppp0에서 들어오는 연결이 포트 8080의 eth0에서 192.168.1.200으로 라우팅되기를 원합니다.

이 두 가지 규칙이 있습니다

-A PREROUTING  -p tcp -m tcp --dport 8001 -j DNAT --to-destination 192.168.1.200:8080

-A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state NEW,ESTABLISHED,RELATED -j ACCEPT

작동하지 않습니다. 내가 무엇을 놓치고 있습니까?



나는 NPR 태그와 함께 갈거야 (이것은 비록 제대로 물론 표현한 불구하고 프로그래밍하는 관련 될 수있다.)
미하이 Limbăşan

어떻습니까 : 나는 환경을 설정하려고하는 프로그래머이므로 내부 서버에서 호출되는 일식에서 서버 응용 프로그램을 디버깅 할 수 있습니다. 충분히 가까이?

물론, 이것이 "잘못 표현 된 것"의 의미입니다. 질문을 적절히 편집 할 수 있습니까?
Mihai Limbăşan

답변:


97

우선-전달이 허용되는지 확인해야합니다.

cat /proc/sys/net/ipv4/conf/ppp0/forwarding 
cat /proc/sys/net/ipv4/conf/eth0/forwarding 

둘 다 반환되면 1괜찮습니다. 그렇지 않으면 다음을 수행하십시오.

echo '1' | sudo tee /proc/sys/net/ipv4/conf/ppp0/forwarding
echo '1' | sudo tee /proc/sys/net/ipv4/conf/eth0/forwarding

두 번째 DNATnat테이블에만 적용 할 수 있습니다 . 따라서 테이블 사양 ( -t nat) 을 추가하여 규칙을 확장해야합니다 .

iptables -t nat -A PREROUTING -p tcp -i ppp0 --dport 8001 -j DNAT --to-destination 192.168.1.200:8080
iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

두 규칙 모두 TCP 트래픽에만 적용됩니다 (UDP를 변경하려는 경우 유사한 규칙을 제공하지만 -p udp옵션 세트 를 제공해야 함 ).

마지막은 라우팅 구성입니다. 유형:

ip route

192.168.1.0/24라우팅 항목 중 반환 된 항목이 있는지 확인하십시오 .


16
개인적으로 다음 sysctl과 같은 구문을 선호합니다sysctl net.ipv4.conf.eth0.forwarding=1
Doud

1
잘못 입력 한 규칙을 어떻게 제거합니까?
Nickolai Leschov

2
두 번째 줄 : 방화벽 제한 / 보안이없는 경우 "iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT"는 필요하지 않습니다. 대부분의 가정용 LAN의 경우, 그렇지 않으면 -A에주의하십시오. 제한 / 보안 후에 추가하고 작동하지 않을 수 있습니다 (따라서 -I 대신 iptables 규칙의 IN FRONT를 추가하고 있는지 확인하십시오)
THESorcerer

2
@ ÁronLőrincz, No. Iptables 규칙은 부팅시 명시 적으로로드되지 않는 한 일시적입니다.
sherrellbc

1
@Nickolai Leschov,-A-D
Alexei Martianov

14

나는 당신이 원하는 것이 있다고 생각합니다.

iptables -A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state 
    NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -t nat -A PREROUTING -p tcp --dport 8001 -j DNAT --to-destination
    192.168.1.200:8080

2
음 ... 그게 내가 이미 한 것입니다. iptables-restore를 사용하여로드하여 각 섹션이 자체 섹션에 있지만 위에서 작성한 것입니다.

좋아, 구문은 원본에서 나빠 보였습니다. 규칙에서 -i ppp0을 시도 했습니까? 문제가 정확히 무엇입니까?
Robert Gamble

13

postrouting 소스 주소 SNAT를 잊어 버렸습니다.

sysctl net.ipv4.ip_forward=1
yours_wan_ip=101.23.3.1
-A PREROUTING  -p tcp -m tcp -d $yours_wan_ip --dport 8001 -j DNAT --to-destination 192.168.1.200:8080

-A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state NEW,ESTABLISHED,RELATED -j ACCEPT

-A POSTROUTING -t nat -p tcp -m tcp -s 192.168.1.200 --sport 8080 -j SNAT --to-source $yours_wan_ip

그리고 192.168.1.200 주소를 가진 컴퓨터에서 리눅스 방화벽을 기본 게이트웨이로 설정하는 것을 잊지 마십시오.


당신은 POSTROUNTING단계에서 거꾸로 얻었다 . 이 시점에서 대화는 여전히 --destination그렇습니다 --source.
sherrellbc 2018 년

6

내 리눅스 라우터 에서이 작업을 수행하기 위해 다음 bash 스크립트를 만들었습니다. 계속 진행하기 전에 WAN IP를 자동으로 추론하고 선택을 확인합니다.

#!/bin/bash

# decide which action to use
action="add"
if [[ "-r" == "$1" ]]; then
  action="remove"
  shift
fi

# break out components
dest_addr_lan="$1"
dest_port_wan="$2"
dest_port_lan="$3"

# figure out our WAN ip
wan_addr=`curl -4 -s icanhazip.com`

# auto fill our dest lan port if we need to
if [ -z $dest_port_lan ]; then
  dest_port_lan="$dest_port_wan"
fi

# print info for review
echo "Destination LAN Address: $dest_addr_lan"
echo "Destination Port WAN: $dest_port_wan"
echo "Destination Port LAN: $dest_port_lan"
echo "WAN Address: $wan_addr"

# confirm with user
read -p "Does everything look correct? " -n 1 -r
echo    # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]; then
  if [[ "remove" == "$action" ]]; then
    iptables -t nat -D PREROUTING  -p tcp -m tcp -d $wan_addr --dport     $dest_port_wan -j DNAT --to-destination $dest_addr_lan:$dest_port_lan
    iptables -D FORWARD -m state -p tcp -d $dest_addr_lan --dport     $dest_port_lan --state NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -t nat -D POSTROUTING -p tcp -m tcp -s $dest_addr_lan --sport     $dest_port_lan -j SNAT --to-source $wan_addr
    echo "Forwarding rule removed"
  else
    iptables -t nat -A PREROUTING  -p tcp -m tcp -d $wan_addr --dport     $dest_port_wan -j DNAT --to-destination $dest_addr_lan:$dest_port_lan
    iptables -A FORWARD -m state -p tcp -d $dest_addr_lan --dport     $dest_port_lan --state NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -t nat -A POSTROUTING -p tcp -m tcp -s $dest_addr_lan --sport $dest_port_lan -j SNAT --to-source $wan_addr
    echo "Forwarding rule added"
  fi
else
  echo "Info not confirmed, exiting..."
fi

스크립트 사용은 간단하게 복사하여 파일에 붙여 넣습니다.

# chmod +x port_forward.sh
# ./port_forward.sh 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule added

동일한 규칙을 제거하려면

# ./port_forward.sh -r 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule removed

나는 이것이 각자의 라우터에서 시간을 절약 할 수 있다고 생각했습니다.


2

MACHINE_A에서 서비스가 MACHINE_B에서 실제로 실행되고 있다고 생각하도록해야하지만 모든 요청을 MACHINE_C로 투명하게 다시 라우팅해야했습니다.

트릭은 MASQUERADE를 사용하는 것이 었습니다.

sysctl net.ipv4.ip_forward=1

iptables -t nat -A PREROUTING -p tcp -d MACHINE_B --dport 443 -j DNAT --to-destination MACHINE_C

iptables -t nat -A POSTROUTING -s MACHINE_A -o INTERFACE_NAME -j MASQUERADE

명령을 조정하고 싶을 수도 있습니다.

  1. 특정 인터페이스에서만 패킷 전달을 허용합니다. 예를 들면 다음과 같습니다.

    sysctl net.ipv4.conf.eth0.forwarding=1
    
  2. MACHINE_A뿐만 아니라 다른 모든 포트가 포트 포워딩을 사용하도록하려면 다음을 제거하십시오.

    -s MACHINE_A
    

1

시험

echo "1" > /proc/sys/net/ipv4/conf/ppp0/forwarding
echo "1" > /proc/sys/net/ipv4/conf/eth0/forwarding

이 파일들은 커널에게 인터페이스 사이에서 패킷을 전달할 수있게합니다.


0

이 명령은 저에게 효과적이지 않습니다.

-A POSTROUTING -t nat -p tcp -m tcp -s 192.168.1.200 --sport 8080 -j SNAT --to-source $yours_wan_ip

2 개의 LAN 인터페이스가 있으며 다음과 같이 작성하면 FORWARD가 작동합니다.

iptables -t nat -A POSTROUTING -o $LAN_IF -p tcp -m tcp --dport $FW_PORT -j SNAT --to-source $LAN_IP
  • LAN_IF-LAN 인터페이스 (예 : eth1, br0 ...)
  • FW_PORD-전달 포트 (detination 호스트)
  • LAN_IP-LAN 인터페이스 (라우터)의 IP 주소

물론 PREROUTING과 FORWARD도 필요합니다 :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.