LAN에서 VPN으로 iptables 네트워크 주소 변환 [닫기]

LAN에서 VPN으로 iptables 네트워크 주소 변환 [닫기]

2018년 6월 13일: 누군가에게 도움이 될 수 있는 해결책을 찾았고 이 게시물을 편집했습니다.

먼저 원본 게시물은 다음과 같습니다.

포털이 있고 TCP 및 UDP 트래픽은 물론 RTSP에 대해 네트워크 주소를 공용 IP 주소와 특정 공용 포트 번호에서 특정 VPN IP 주소와 특정 VPN 포트 번호로 변환하고 싶습니다. HTTP 터널을 통한 RTP. 문제는 패킷이 통과하지 못한다는 것입니다. 포털에는 openvpn을 실행하는 것 외에도 LAN과 VPN 간에 트래픽을 라우팅할 수 있게 해주는 Proxypass 및 Proxypassreverse 문이 있는 apache2 서버가 있지만 TCP 트래픽에만 해당됩니다. apache2는 UDP 트래픽을 처리할 수 없기 때문에 이를 수행하기 위해 iptables를 설정해 보았습니다. 이더넷 인터페이스는 하나만 있습니다. VPN의 장치는 인터넷에 있으므로 eth0 및 tun0 트래픽은 모두 eth0을 통해 흐릅니다.

iptables에 규칙을 설정하고 eth0( /proc/sys/net/ipv4/conf/eth0/forwarding = 1), tun0( /proc/sys/net/ipv4/conf/tun0/forwarding = 1) 및 모두('/proc/sys/net/ipv4/ip_forward = 1')에 대한 전달을 활성화했지만 아무 일도 일어나지 않습니다.

기본 iptables 규칙에 다음 규칙을 추가했습니다.

-A PREROUTING -d 192.168.192.203/32 -p udp -m udp --dport 10073 -j DNAT --to-destination 10.221.0.73:80
-A PREROUTING -d 192.168.192.203/32 -p tcp -m tcp --dport 10073 -j DNAT --to-destination 10.221.0.73:80
-A POSTROUTING -s 10.221.0.73/32 -p udp -m udp --sport 80 -j SNAT --to-source 192.168.192.203
-A POSTROUTING -s 10.221.0.73/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.192.203

그리고

-A FORWARD -d 10.221.0.73/32 -p udp -m state --state NEW,RELATED,ESTABLISHED -m udp --dport 80 -j ACCEPT
-A FORWARD -d 10.221.0.73/32 -p tcp -m state --state NEW,RELATED,ESTABLISHED -m tcp --dport 80 -j ACCEPT

이러한 규칙에 따라 인터넷에서 포트 10073에 대한 UDP 및 TCP 트래픽을 가져와(이 경우에는 192.168.192.203을 사용함) VPN IP 주소 10.221.0.73 및 포트 80으로 전달하려고 합니다.

전체 규칙 세트는 다음과 같습니다.

# Generated by iptables-save v1.4.14 on Thu Jun  7 16:52:00 2018
*raw
:PREROUTING ACCEPT [1930:216976]
:OUTPUT ACCEPT [1477:229328]
-A PREROUTING -p udp -m udp --dport 8073 -j TRACE
-A OUTPUT -p udp -m udp --sport 8073 -j TRACE
COMMIT
# Completed on Thu Jun  7 16:52:00 2018

# Generated by iptables-save v1.4.14 on Thu Jun  7 16:52:00 2018
*nat
:PREROUTING ACCEPT [462:32832]
:INPUT ACCEPT [462:32832]
:OUTPUT ACCEPT [98:6069]
:POSTROUTING ACCEPT [98:6069]
-A PREROUTING -d 192.168.192.203/32 -p udp -m udp --dport 10073 -j DNAT --to-destination 10.221.0.73:80
-A PREROUTING -d 192.168.192.203/32 -p tcp -m tcp --dport 10073 -j DNAT --to-destination 10.221.0.73:80
-A POSTROUTING -s 10.221.0.73/32 -p udp -m udp --sport 80 -j SNAT --to-source 192.168.192.203
-A POSTROUTING -s 10.221.0.73/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.192.203
COMMIT
# Completed on Thu Jun  7 16:52:00 2018

# Generated by iptables-save v1.4.14 on Thu Jun  7 16:52:00 2018
*filter
:INPUT ACCEPT [1738:195868]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1333:210602]
:ufw-after-forward - [0:0]
:ufw-after-input - [0:0]
:ufw-after-logging-forward - [0:0]
:ufw-after-logging-input - [0:0]
:ufw-after-logging-output - [0:0]
:ufw-after-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-before-input - [0:0]
:ufw-before-logging-forward - [0:0]
:ufw-before-logging-input - [0:0]
:ufw-before-logging-output - [0:0]
:ufw-before-output - [0:0]
:ufw-reject-forward - [0:0]
:ufw-reject-input - [0:0]
:ufw-reject-output - [0:0]
:ufw-track-input - [0:0]
:ufw-track-output - [0:0]
-A INPUT -j ufw-before-logging-input
-A INPUT -j ufw-before-input
-A INPUT -j ufw-after-input
-A INPUT -j ufw-after-logging-input
-A INPUT -j ufw-reject-input
-A INPUT -j ufw-track-input
-A FORWARD -j ufw-before-logging-forward
-A FORWARD -j ufw-before-forward
-A FORWARD -j ufw-after-forward
-A FORWARD -j ufw-after-logging-forward
-A FORWARD -j ufw-reject-forward
-A FORWARD -d 10.221.0.73/32 -p udp -m state --state NEW,RELATED,ESTABLISHED -m udp --dport 80 -j ACCEPT
-A FORWARD -d 10.221.0.73/32 -p tcp -m state --state NEW,RELATED,ESTABLISHED -m tcp --dport 80 -j ACCEPT
-A OUTPUT -j ufw-before-logging-output
-A OUTPUT -j ufw-before-output
-A OUTPUT -j ufw-after-output
-A OUTPUT -j ufw-after-logging-output
-A OUTPUT -j ufw-reject-output
-A OUTPUT -j ufw-track-output
COMMIT
# Completed on Thu Jun  7 16:52:00 2018

이 문제를 어떻게 해결할 수 있나요? 미리 감사드립니다.

둘째, 제가 해결한 방법은 다음과 같습니다.

라우터로 사용하는 컴퓨터와 트래픽을 전달하는 컴퓨터에 tcpdump를 설정했습니다. 핵심은 다른 트래픽이 두 시스템을 통해 흐를 때 보고할 관련 패킷을 선택하고 충분히 상세한 방식으로 보고할 만큼 충분히 광범위한 규칙을 설정하는 것입니다. 그리고 작업을 단순화하기 위해 라우터 시스템을 OpenVPN 클라이언트가 아닌 OpenVPN 호스트이기도 한 시스템으로 변경했습니다.

이것은 LAN IP 주소가 192.168.192.166이고 VPN IP 주소가 10.254.0.1인 라우터 시스템에서 사용하는 명령입니다.

tcpdump -n -vv -c 5000 "port 80 or port 10073 or host 10.254.0.1 or host 10.254.0.73 or (host 192.168.192.166 and port 80) or (host 192.168.192.166 and port 10073)" -i any

10.254.0.73은 포트 80을 사용하여 패킷을 전달하는 시스템입니다. 라우터의 포트 10073으로 패킷을 보냅니다.

다음은 패킷을 전달하는 머신에 대한 명령입니다.

tcpdump -vv -n -c 5000 "port 80 or port 10073 or host 192.168.192.166 or host 10.254.0.1" -i any

"-i any"는 "공용" 포트 eth0과 "개인" 포트 tun0에서 트래픽을 가져옵니다.

나에게 적합한 라우팅 규칙은 다음과 같습니다.

root@B16:~# iptables-save
# Generated by iptables-save v1.3.8 on Wed Jun 13 14:52:56 2018
*mangle
:PREROUTING ACCEPT [73673:9416551]
:INPUT ACCEPT [71740:8067234]
:FORWARD ACCEPT [1933:1349317]
:OUTPUT ACCEPT [120157:14972014]
:POSTROUTING ACCEPT [122090:16321331]
COMMIT
# Completed on Wed Jun 13 14:52:56 2018
# Generated by iptables-save v1.3.8 on Wed Jun 13 14:52:56 2018
*nat
:PREROUTING ACCEPT [12313:867446]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [11426:951748]
-A PREROUTING -i eth0 -p udp -m udp --dport 10073 -j DNAT --to-destination 10.254.0.73:80
-A PREROUTING -i eth0 -p tcp -m tcp --dport 10073 -j DNAT --to-destination 10.254.0.73:80
-A POSTROUTING -j MASQUERADE
COMMIT
# Completed on Wed Jun 13 14:52:56 2018
# Generated by iptables-save v1.3.8 on Wed Jun 13 14:52:56 2018
*filter
:INPUT ACCEPT [71741:8067274]
:FORWARD ACCEPT [1250:1319002]
:OUTPUT ACCEPT [120162:14973202]
:INBOUND - [0:0]
:LOG_FILTER - [0:0]
:LSI - [0:0]
:LSO - [0:0]
:OUTBOUND - [0:0]
-A FORWARD -d 10.254.0.73 -p tcp -m tcp --dport 80 -j ACCEPT
-A FORWARD -d 10.254.0.73 -p udp -m udp --dport 80 -j ACCEPT
COMMIT
# Completed on Wed Jun 13 14:52:56 2018

규칙을 올바르게 적용하는 것이 너무 어렵기 때문에 iptables의 TRACE가 유용하지 않다고 생각합니다. tcpdump를 사용하면 규칙과 세부 사항이 정확해졌습니다. 전달이 언제 시작되었는지 알 수 있었지만 패킷은 라우터로 반환되지 않았으며 메시지를 전달하려고 시도하면서 랩톱으로 반환되었습니다. 라우터. 또한 전혀 예상하지 못한 체크섬 오류가 발생하는 것도 볼 수 있습니다.

나는 "이것이 나에게 효과가 있었다"라고 말하는 상충되는 게시물을 많이 읽었지만 그들은 나에게 효과가 없었습니다. 한 가지 문제는 iptables 규칙이 분명히 OS에 따라 다르다는 것입니다. 저는 Debian을 사용하고 있는데 이로 인해 규칙이 변경됩니다. 이유는 누가 알겠습니까? 나는 iptables 규칙을 작성하는 방법에 대한 완전한 설명을 찾지 못했고 단지 몇 가지 예만 찾았습니다.

건배.

관련 정보