네트워크 네임 스페이스를 설정하고 openvpn으로 터널을 설정 한 다음 네임 스페이스 내에서이 터널을 사용하는 응용 프로그램을 시작할 수있었습니다. 지금까지는 좋았지만이 응용 프로그램은 웹 인터페이스를 통해 액세스 할 수 있으며 LAN 내 웹 인터페이스로 요청을 라우팅하는 방법을 알 수 없습니다.
@schnouki의 가이드를 따라 네트워크 네임 스페이스를 설정하고 그 안에서 OpenVPN을 실행하는 방법을 설명 했습니다.
ip netns add myvpn
ip netns exec myvpn ip addr add 127.0.0.1/8 dev lo
ip netns exec myvpn ip link set lo up
ip link add vpn0 type veth peer name vpn1
ip link set vpn0 up
ip link set vpn1 netns myvpn up
ip addr add 10.200.200.1/24 dev vpn0
ip netns exec myvpn ip addr add 10.200.200.2/24 dev vpn1
ip netns exec myvpn ip route add default via 10.200.200.1 dev vpn1
iptables -A INPUT \! -i vpn0 -s 10.200.200.0/24 -j DROP
iptables -t nat -A POSTROUTING -s 10.200.200.0/24 -o en+ -j MASQUERADE
sysctl -q net.ipv4.ip_forward=1
mkdir -p /etc/netns/myvpn
echo 'nameserver 8.8.8.8' > /etc/netns/myvpn/resolv.conf
그런 다음 외부 IP를 확인하고 의도 한 것처럼 네임 스페이스 내부와 외부에서 다른 결과를 얻을 수 있습니다.
curl -s ipv4.icanhazip.com
<my-isp-ip>
ip netns exec myvpn curl -s ipv4.icanhazip.com
<my-vpn-ip>
응용 프로그램이 시작되었습니다.이 예제에서는 deluge를 사용하고 있습니다. 웹 인터페이스를 사용하여 여러 가지 응용 프로그램을 시도하여 특정 문제가 아닌지 확인했습니다.
ip netns exec myvpn sudo -u <my-user> /usr/bin/deluged
ip netns exec myvpn sudo -u <my-user> /usr/bin/deluge-web -f
ps $(ip netns pids myvpn)
PID TTY STAT TIME COMMAND
1468 ? Ss 0:13 openvpn --config /etc/openvpn/myvpn/myvpn.conf
9302 ? Sl 10:10 /usr/bin/python /usr/bin/deluged
9707 ? S 0:37 /usr/bin/python /usr/bin/deluge-web -f
veth vpn1의 ip를 지정하면 네임 스페이스 내에서 또는 외부에서 포트 8112의 웹 인터페이스에 액세스 할 수 있습니다.
ip netns exec myvpn curl -Is localhost:8112 | head -1
HTTP/1.1 200 OK
ip netns exec myvpn curl -Is 10.200.200.2:8112 | head -1
HTTP/1.1 200 OK
curl -Is 10.200.200.2:8112 | head -1
HTTP/1.1 200 OK
그러나 포트 8112를 내 서버에서 네임 스페이스의 응용 프로그램으로 리디렉션하고 싶습니다. 목표는 내 LAN 내부의 컴퓨터에서 브라우저를 열고 http : // my-server-ip : 8112 (my-server-ip는 네트워크 인터페이스를 인스턴스화 한 서버의 고정 IP 임)로 웹 인터페이스를 얻는 것 입니다.
편집 : iptables 규칙을 만들려는 시도를 제거했습니다. 내가하려고하는 것은 위에 설명되어 있으며 다음 명령은 HTTP 200을 출력해야합니다.
curl -I localhost:8112
curl: (7) Failed to connect to localhost port 8112: Connection refused
curl -I <my-server-ip>:8112
curl: (7) Failed to connect to <my-server-ip> port 8112: Connection refused
나는 DNAT와 SNAT 규칙을 시도하고 좋은 척도를 위해 MASQUERADE를 던졌지 만, 내가하고있는 일을 모르기 때문에 내 시도는 쓸모가 없습니다. 어쩌면 누군가이 구성을 정리하는 데 도움이 될 수 있습니다.
편집 :의 tcpdump 출력 tcpdump -nn -q tcp port 8112
. 당연히, 첫 번째 명령은 HTTP 200을 반환하고 두 번째 명령은 거부 된 연결로 종료됩니다.
curl -Is 10.200.200.2:8112 | head -1
listening on vpn0, link-type EN10MB (Ethernet), capture size 262144 bytes
IP 10.200.200.1.36208 > 10.200.200.2.8112: tcp 82
IP 10.200.200.2.8112 > 10.200.200.1.36208: tcp 145
curl -Is <my-server-ip>:8112 | head -1
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
IP <my-server-ip>.58228 > <my-server-ip>.8112: tcp 0
IP <my-server-ip>.8112 > <my-server-ip>.58228: tcp 0
편집 : @schnouki 자신은 일반적인 iptables TCP 프록시를 설명하는 데비안 관리 기사 를 지적했습니다 . 당면한 문제에 적용되는 스크립트는 다음과 같습니다.
YourIP=<my-server-ip>
YourPort=8112
TargetIP=10.200.200.2
TargetPort=8112
iptables -t nat -A PREROUTING --dst $YourIP -p tcp --dport $YourPort -j DNAT \
--to-destination $TargetIP:$TargetPort
iptables -t nat -A POSTROUTING -p tcp --dst $TargetIP --dport $TargetPort -j SNAT \
--to-source $YourIP
iptables -t nat -A OUTPUT --dst $YourIP -p tcp --dport $YourPort -j DNAT \
--to-destination $TargetIP:$TargetPort
불행히도, veth 인터페이스 사이의 트래픽은 탈취되었고 다른 일은 발생하지 않았습니다. 그러나 @schnouki는 socat
TCP 프록시로 사용하도록 제안했으며 이는 완벽하게 작동합니다.
curl -Is <my-server-ip>:8112 | head -1
IP 10.200.200.1.43384 > 10.200.200.2.8112: tcp 913
IP 10.200.200.2.8112 > 10.200.200.1.43384: tcp 1495
트래픽이 veth 인터페이스를 통과하는 동안 이상한 포트 셔플 링을 아직 이해하지 못했지만 이제는 문제가 해결되었습니다.
veth
장치에 대한 경험이 전혀 없습니다 (이것은 매우 흥미 롭습니다 ... ;-)). 당신은 사용해 본 적이tcpdump
들어오는 패킷이 얼마나 멀리 확인하기 위해? 경우tcpdump -i veth0
아무것도 표시되지 않습니다 다음tcpdumo -i lo
필요할 수 있습니다.