로컬에서 포트를 리디렉션/전달하는 방법

로컬에서 포트를 리디렉션/전달하는 방법

동일한 호스트 내에서 포트 500을 포트 2500으로 전달하고 싶고 다음은 Lubuntu 16.04에서 작동했지만 iptables 명령을 재부팅하고 다시 실행하면 작동하지 않습니다.

iptables -t nat -A PREROUTING -p udp -d 192.168.1.10 –dport 500 -j DNAT –to-destination 192.168.1.10:2500
iptables -A FORWARD -p udp -d 192.168.1.10 –dport 2500 -j ACCEPT

여기서 192.168.1.10은 내 로컬 호스트의 IP입니다.
한 세션에서 테스트하려면 netcat을 실행합니다.

nc -u 192.168.1.10:500

두 번째 세션에서는 다음을 실행합니다.

nc -l -u 500

세 번째 세션에서는 다음을 실행합니다.

nc -l -u 2500

따라서 세션 1에 입력한 데이터가 세션 2가 아닌 세션 3에서 수신되기를 원합니다. 세션 2는 작동했지만 다시 작동할 수는 없습니다.

나는 또한 다음을 시도했습니다.

iptables -t nat -A PREROUTING -p udp --dport 500 -j REDIRECT --to-port 2500

하지만 패킷은 여전히 ​​2500이 아닌 포트 500에서 수신되고 있습니다.

ufw가 비활성화되어 있고 iptables가 작동하는지 확인하기 위해 다음을 시도했습니다.

iptables -A INPUT -p udp --dport 500 -j DROP

예상대로 포트 500 또는 2500에서 패킷이 수신되지 않았습니다. 포트 전달이 활성화되었습니다:

# cat /proc/sys/net/ipv4/ip_forward
1

아래 세션 출력:

root@mike-TravelMate-8371:~/nat/out# iptables -t nat -S;iptables  -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A PREROUTING -d 192.168.1.10/32 -p udp -m udp --dport 500 -j DNAT --to-destination 192.168.1.10:2500
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -d 192.168.1.10/32 -p udp -m udp --dport 2500 -j ACCEPT
root@mike-TravelMate-8371:~/nat/out# nohup nc -l -u 2500 > nc_2500.out &
[1] 29806
root@mike-TravelMate-8371:~/nat/out# nohup: ignoring input and redirecting stderr to stdout

root@mike-TravelMate-8371:~/nat/out# nohup nc -l -u 500 > nc_500.out &
[2] 29810
root@mike-TravelMate-8371:~/nat/out# nohup: ignoring input and redirecting stderr to stdout

root@mike-TravelMate-8371:~/nat/out# jobs
[1]-  Running                 nohup nc -l -u 2500 > nc_2500.out &
[2]+  Running                 nohup nc -l -u 500 > nc_500.out &
root@mike-TravelMate-8371:~/nat/out# nc -u 192.168.1.10 500
test forwarding UDP port 500 to 2500
^C
[2]+  Done                    nohup nc -l -u 500 > nc_500.out
root@mike-TravelMate-8371:~/nat/out# head nc*.out
==> nc_2500.out <==

==> nc_500.out <==
test forwarding UDP port 500 to 2500
root@mike-TravelMate-8371:~/nat/out# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp2s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 00:1e:33:24:98:86 brd ff:ff:ff:ff:ff:ff
3: wlp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:22:fb:64:bd:42 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.10/24 brd 192.168.1.255 scope global dynamic wlp1s0
       valid_lft 85651sec preferred_lft 85651sec
    inet6 fd58:7f66:569d:5300:c5df:415:6c56:50d6/64 scope global temporary dynamic 
       valid_lft 6788sec preferred_lft 3188sec
    inet6 fd58:7f66:569d:5300:75d:bbe9:652e:6587/64 scope global mngtmpaddr noprefixroute dynamic 
       valid_lft 6788sec preferred_lft 3188sec
    inet6 fe80::e214:14f8:d95c:73a7/64 scope link 
       valid_lft forever preferred_lft forever
4: vboxnet0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 0a:00:27:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.1/24 brd 192.168.56.255 scope global vboxnet0
       valid_lft forever preferred_lft forever
    inet6 fe80::800:27ff:fe00:0/64 scope link 
       valid_lft forever preferred_lft forever
root@mike-TravelMate-8371:~/nat/out# ip route
default via 192.168.1.1 dev wlp1s0  proto static  metric 600 
192.168.1.0/24 dev wlp1s0  proto kernel  scope link  src 192.168.1.10  metric 600 
192.168.56.0/24 dev vboxnet0  proto kernel  scope link  src 192.168.56.1 linkdown 

포트를 전달하려는 이유는 외부 서버와 Virtual Box에서 실행되는 게스트 사이에 VPN을 설정하고 싶기 때문입니다. Vbox 게스트는 "NAT" 네트워크를 사용하므로 Vbox에는 IP 10.0.2.15가 있는 VM으로 포트를 전달하기 위한 자체 포트 전달 기능이 있으므로 Vbox에서 포트 전달 규칙은 다음과 같습니다.

  1. TCP 호스트 2222 - Vbox 게스트 22
  2. UDP 호스트 4500에서 Vbox 게스트 4500으로
  3. UDP 호스트 2500에서 Vbox 게스트 500으로

첫 번째는 "ssh -p 2222"를 사용하여 게스트에게 SSH를 통해 연결할 수 있다는 의미입니다.[이메일 보호됨]"

두 번째는 4500에서 UDP 패킷을 보낼 수 있다는 의미이므로 호스트에서 "nc -u 192.168.1.10 4500"을 사용하여 패킷을 보낼 수 있고 "nc -l -u 4500"을 사용하여 Vbox 게스트에서 수신되는 것을 볼 수 있습니다(패킷 호스트에서 "nc -l -u 4500"을 실행하면 표시되지 않습니다)

세 번째는 Vbox가 1024 아래로 예약된 포트를 전달하지 않기 때문에 포트 500을 전달할 수 없습니다. 따라서 이 규칙을 사용하면 호스트에서 "nc -u 192.168.1.10 2500"을 사용할 수 있고 "nc -l -을 사용하여 Vbox 게스트에서 UDP 패킷을 수신할 수 있습니다. 너 500".

그래서 호스트의 UDP 500 포트를 포트 2500으로 전달하여 Vbox에서 게스트의 포트 500으로 전달하도록 하고 싶었지만 작동했지만 iptables 명령을 재부팅하고 다시 실행한 후에는 작동하지 않았고 몇 시간 후에 작동했습니다. 이것에 대해서는 내가 무엇을 다르게 했는지 알 수 없습니다.

TCP forwadring을 사용하여 iptables(및 Vbox) 설정을 시도했지만 이것도 작동하지 않으며 ufw를 시도했으며 Vbox 실행 여부에 관계없이 로컬 포트 ​​전달을 시도했지만 포트는 전달되지 않습니다.

또한 존재하지 않는 IP로 포트를 전달해 보았습니다.

iptables -t nat -A PREROUTING -p udp -d 192.168.1.10 --dport 500 -j DNAT --to-destination 192.168.1.30:500
iptables -A FORWARD -p udp -d 192.168.1.30 --dport 500 -j ACCEPT

따라서 여기서 IP 192.168.1.30은 존재하지 않지만 한 세션에서 "nc -u 192.168.1.10 500"을 실행하면 호스트(IP 192.168.1.10)에서 수신 대기하는 패킷을 계속 수신할 수 있습니다.

Netcat 없이 테스트할 수 있도록 TCP 포트 3222를 포트 22로 전달하려고 시도했지만 작동하지 않습니다.

root@mike-TravelMate-8371:~/nat# iptables -t nat -S;iptables  -S 
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A PREROUTING -d 192.168.1.10/32 -p tcp -m tcp --dport 3222 -j DNAT --to-destination 192.168.1.10:22
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -d 192.168.1.10/32 -p tcp -m tcp --dport 22 -j ACCEPT
root@mike-TravelMate-8371:~/nat# telnet 192.168.1.10 22
Trying 192.168.1.10...
Connected to 192.168.1.10.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.4
^C
Connection closed by foreign host.
root@mike-TravelMate-8371:~/nat# telnet 192.168.1.10 3222
Trying 192.168.1.10...
telnet: Unable to connect to remote host: Connection refused
root@mike-TravelMate-8371:~/nat# 

따라서 여기서는 포트 22를 사용하여 SSH 포트에 직접 연결할 수 있지만 3222를 통해 연결할 수 없으므로 전달이 작동하지 않습니다.

답변1

Iptables 규칙은 재부팅 시 지속되지 않습니다. 재부팅 후 규칙을 다시 추가하거나 iptables-save / iptables-persist를 사용해야 할 수도 있습니다. 이 링크를 참조하세요. 특정 iptables 규칙 세트를 영구적으로 만들려면 어떻게 해야 합니까?

답변2

동일한 요구 사항이 있었고 해당 두 명령을 사용하여 작동했습니다. 로컬 통화만 리디렉션해야 했지만 127.0.0.1외부 IP로 대체할 수 있습니다.

sudo iptables -t nat -A PREROUTING -s 127.0.0.1 -p tcp --dport 1234 -j REDIRECT --to 1235
sudo iptables -t nat -A OUTPUT -s 127.0.0.1 -p tcp --dport 1234 -j REDIRECT --to 1235

관련 정보