기존 설정

기존 설정

저는 오랫동안 Linux 기반의 방화벽/게이트웨이, 내부 클라이언트용 SNAT 등 SOHO 도메인을 운영하고 있으며, DNAT(포트 포워딩)를 비롯한 다양한 서비스를 WAN을 통해 제공하고 있습니다. 방화벽에는 LAN(eth0) 및 WAN(eth1)용 이더넷 네트워크 카드가 있습니다. 좋은 결과.

OpenVPN 터널을 통해 LAN에서 시작되는 모든 나가는 연결을 인터넷 게이트웨이 역할을 하는 OpenVPN 서버로 투명하게 보내도록 이 설정을 수정하고 싶습니다. LAN의 내부 DNS 및 DHCP 서버, 파일 서버 등은 LAN 클라이언트에서 계속 액세스할 수 있어야 합니다. 고정 WAN IP에서 게이트웨이가 제공하는 WAN 서비스는 이전과 같이 계속 사용할 수 있어야 합니다. 지금까지의 연구에 따르면 이 시나리오에서는 연결 태그 지정 및 정책 라우팅을 통해 가장 효과적으로 달성할 수 있는 방화벽에서 분할 터널 VPN을 사용할 것을 권장합니다. 게이트웨이는 OpenVPN 클라이언트가 됩니다.

스택 교환 질문OpenVPN을 통해 무선 LAN 라우팅비슷하지만 답이 없습니다. 이 특정 문제에 대한 다른 리소스는 거의 없습니다.

지금까지 터널을 통해 LAN 클라이언트와 연결하는 데 성공하지 못했습니다. 지금까지의 최선의 시도(아래 설명)에서는 일부 연결이 터널에서 나가고 응답이 돌아오는 것을 보여 주지만 해당 응답은 원래 클라이언트로 라우팅되지 않는 것으로 보입니다. 스푸핑 방지 기능을 비활성화하려고 시도했지만 결과는 바뀌지 않았습니다.

제가 조사한 결과 Linux에서 분할 터널링 VPN에 대한 다음과 같은 훌륭한 개요를 발견했습니다.https://www.htpcguides.com/force-torrent-traffic-vpn-split-tunnel-debian-8-ubuntu-16-04/, 그러나 해당 정책 라우팅은 사용자 ID를 기반으로 하며 LAN 게이트웨이에 필요한 추가 기능을 다루지 않습니다. 다음 번들을 포함하여 정책 라우팅 구현에 대한 세부 정보를 제공하는 많은 리소스가 있습니다.http://security.maruhn.com/iptables-tutorial/x9125.html귀중한 iproute2 "치트 시트"는 다음과 같습니다.http://baturin.org/docs/iproute2.

기존 설정

기존 설정에는 다음과 같은 간단한 기본 경로 테이블이 있습니다(내 ISP는 /30 서브넷에 고정 IP를 제공하고 게이트웨이의 내부 IP는 LAN 192.168.0.0/24에서 192.168.0.1입니다).

# ip route list all
default via <isp_gw_ip> dev eth1
<isp_subnet>/30 dev eth1  proto kernel  scope link  src <ext_ip>
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.1 

로컬 테이블에는 여기에 표시되지 않은 10개의 로컬 및 브로드캐스트 경로가 있습니다(이 경로가 중요합니까?).

방화벽은 다음 방법을 사용하여 SNAT를 구현합니다.

iptables -t nat -A POSTROUTING -o eth1 \! -d 192.168.0.0/24 -s 192.168.0.0/24 -j SNAT —to-source <ext_ip>

그래서 그게 가장 쉬운 일이에요.

계획

내가 해야 할 일은 다음과 같다.

  • 나중에 SNAT될 연결의 모든 패킷을 표시합니다. PREROUTING전달된 연결 및 OUTPUT게이트웨이 시작 연결 로 표시

  • 다음을 통해 태그가 지정된 패킷을 라우팅합니다 tun0.

    • tunnel테이블 사용ip rule add fwmark ... table tunnel
  • tun0VPN 서버에서 받은 매개변수를 사용 하도록 게이트웨이 및 기본 경로를 설정합니다.

    • 사용ip route add ... table tunnel
    • 테이블은 기본 테이블과 유사하게 구성되어야 하지만 LAN 라우팅은 필요하지 않습니다.
  • SNAT를 tun0출력 장치로 추가하고 tun0IP 주소를 새 소스 IP로 추가합니다.

이것이 올바른 변화인가?

내가 얼마나 멀리 왔는지

OpenVPN 클라이언트를 시작하면 연결이 성공적으로 시작되고 클라이언트(게이트웨이)가 tun0다음 syslog 항목을 사용하여 장치를 생성합니다.

/sbin/ip addr add dev tun0 local 10.95.3.110 peer 10.95.3.109

tun0일단 설정되면 OpenVPN 클라이언트는 다음 스크립트를 실행합니다(셸 변수에는 $ifconfig_remote/30 터널 서브넷에 있는 게이트웨이 장치의 IP 주소, $ifconfig_localIP 주소 tun0$dev장치 이름이 포함되어 있음 tun0).

# Set packet mark on to-be-SNATed packet (first one only)
iptables -t nat -A PREROUTING -i eth0 \! --dst 192.168.0.0/24 --source 192.168.0.0/24 -j MARK --set-mark 99

# Save packet mark to connection on first packet
iptables -t nat -A PREROUTING -j CONNMARK --save-mark

# Restore connection mark to packets
iptables -t mangle -A PREROUTING  -j CONNMARK --restore-mark

# Same for locally-generated packets
iptables -t nat -A OUTPUT \! --dst 192.168.0.0/24 -j MARK --set-mark 99
iptables -t nat -A OUTPUT -j CONNMARK --save-mark
iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark

# SNAT for tun0
iptables -t nat -A POSTROUTING -o $dev \! -d 192.168.0.0/24 -s 192.168.0.0/24 -j SNAT --to-source $ifconfig_local

# Set default route for all marked packets to go out the VPN, governed by custom routing table
#
# First derive the network CIDR
network=`ipcalc $ifconfig_local/30 | grep ^Network: | awk ‘{print $2}’`

# Flush it first
ip route flush table tunnel

# Rule and routes
ip rule add fwmark 99 table tunnel
ip route add $network dev $dev table tunnel
ip route add default via $ifconfig_remote dev $dev table tunnel

# Flush route cache (unnecessary in recent kernels?)
ip route flush cache

OpenVPN 클라이언트는 초기화 시퀀스가 ​​경고나 오류 없이 완료되었다고 보고합니다.

결과

ifconfigtun0(Tx 및 Rx)을 통해 전송된 소수의 패킷을 표시합니다. traceroute 4.2.2.2게이트웨이의 정보에 따르면 패킷은 여전히 ​​eth1을 통해 일반 ISP 경로로 나가고 있으므로 OUTPUT체인 태그를 기반으로 한 정책 라우팅이 작동하지 않을 수 있습니다. 그러나 ping 4.2.2.2첫 번째 패킷만 반환되는 것으로 보이며 후속 패킷은 반환되지 않습니다. LAN 클라이언트는 외부적으로 전혀 연결할 수 없습니다. 외부 IP 주소를 ping하면 시간 초과가 발생합니다.

tcpdump -i tun0 -vvv일부 트래픽이 터널을 통과하고 있음을 보여줍니다. 예:

11:05:48.610910 IP (tos 0x0, ttl 63, id 14981, offset 0, flags [DF], proto ICMP (1), length 84)
    10.95.3.110 > b.resolvers.Level3.net: ICMP echo request, id 13207, seq 29, length 64
11:05:48.623063 IP (tos 0x0, ttl 57, id 9307, offset 0, flags [none], proto ICMP (1), length 84)
    b.resolvers.Level3.net > 10.95.3.110: ICMP echo reply, id 13207, seq 29, length 64

이는 ping 또는 경로 추적이 터널을 통해 성공적으로 라우팅된 것으로 나타남을 의미합니다. 하지만 원래 클라이언트로 돌아가지 않을 수도 있나요? 비슷한 DNS 트래픽과 다른 트래픽도 보입니다.

추가 진단 정보

ip route list maintun0VPN 시작으로 테이블에 추가된 을 포함한 추가 경로를 표시해도 괜찮습니까 main?

default via <isp_gw_ip> dev eth1 
10.95.3.109 dev tun0  proto kernel  scope link  src 10.95.3.110 
<isp_subnet>/30 dev eth1  proto kernel  scope link  src <ext_ip>
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.1 

iptables -L -t mangle프로그램

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
CONNMARK   all  --  anywhere             anywhere             CONNMARK restore

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
CONNMARK   all  --  anywhere             anywhere            CONNMARK restore

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         

iptables -L -t nat프로그램

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
NAT_PREROUTING_CHAIN  all  --  anywhere             anywhere            
POST_NAT_PREROUTING_CHAIN  all  --  anywhere             anywhere           
MARK       all  --  192.168.0.0/24      !192.168.0.0/24       MARK set 0x63
CONNMARK   all  --  anywhere             anywhere             CONNMARK save

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
MARK       all  --  anywhere            !192.168.0.0          MARK set 0x63
CONNMARK   all  --  anywhere             anywhere            CONNMARK save

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
TCPMSS     tcp  --  anywhere             anywhere             tcp flags:SYN,RST/SYN TCPMSS clamp to PMTU
NAT_POSTROUTING_CHAIN  all  --  anywhere             anywhere            
SNAT       all  --  192.168.0.0/24      !192.168.0.0/24       to:<ext_ip>
POST_NAT_POSTROUTING_CHAIN  all  --  anywhere             anywhere            
SNAT       all  --  192.168.0.0/24      !192.168.0.0/24       to:10.95.3.110

Chain NAT_POSTROUTING_CHAIN (1 references)
target     prot opt source               destination         

Chain NAT_PREROUTING_CHAIN (1 references)
target     prot opt source               destination         

Chain POST_NAT_POSTROUTING_CHAIN (1 references)
target     prot opt source               destination         

Chain POST_NAT_PREROUTING_CHAIN (1 references)
target     prot opt source               destination          

route-noexecOpenVPN 서버가 OpenVPN 구성 파일에서 게이트웨이에 푸시하는 데 사용하는 기본 경로를 비활성화하고 있습니다.

관련 정보