설정:
서버/클라이언트 IP가 각각 10.10.1.1/10.10.1.2, 10.10.2.1/10.10.2.2 및 10.10인 "client1", "client2" 및 "client3"이라는 레이블이 붙은 여러 정적 키 OpenVPN 클라이언트/서버 구성이 있습니다. 3.1/10.10.3.2는 각각 Linux 서버와 Linux 클라이언트에서 호스팅됩니다(각각에는 서로 다른 tunX 인터페이스를 사용하는 세 개의 openvpn 프로세스가 있습니다). 내 Linux 클라이언트 시스템에는 "client1", "client2" 및 "client3"이라는 세 명의 사용자가 있습니다. 내 서버는 10.10.1.2의 client1에서 들어오는 트래픽이 한 IP에서 인터넷으로 나가고(iptables의 -j SNAT를 통해) 10.10.2.2의 client2가 다른 IP로 나가도록 NAT를 수행하도록 설정되어 있습니다.
질문:
클라이언트 Linux 시스템이 OpenVPN 터널을 통해 각 사용자의 트래픽을 올바른 OpenVPN 서버 IP로 올바르게 라우팅하도록 할 방법이 없습니다. 기본적으로 저는 client1의 모든 인터넷 트래픽이 OpenVPN 서버의 하나의 인터넷 연결 IP에서 나가고, client2의 트래픽이 다른 IP에서 나가기를 원하며, 추가하려는 사용자 수에 따라 계속 진행됩니다. . 하지만 이 모든 작업은 서로 다른 모든 클라이언트 사용자를 호스팅하는 하나의 시스템에서 수행되어야 합니다. iptables 기능에는 사용자 ID로 패킷에 태그를 지정한 다음 해당 태그를 기반으로 IP 경로를 설정하는 작업이 포함된다는 것을 알고 있지만 실제로 구현하는 방법은 모르겠습니다.
이 문제에 대해 도움을 줄 수 있는 iptables/netfilter/etc 전문가가 있습니까?
답변1
iptables
생성 프로세스의 UID를 기반으로 패킷에 태그를 지정할 수 있습니다 . (고급) 라우팅( ip rule
: man ip
또는 man ip-rule
; 키워드 "fwmark") 및 DNAT 에 이 Netfilter 표시를 사용할 수 있습니다 . 어느 것이 더 쉽고 좋은지 잘 모르겠습니다.
편집 1 각 사용자에 대해:
iptables -t mangle -A PREROUTING -m owner --uid-owner $user -j MARK --set-mark $usermark
# one line in /etc/iproute2/rt_tables (numbers don't matter)
ip route add default via $user_gw_ip dev $user_if src $user_if_local_ip table $user_table
ip rule add type unicast fwmark $usermark priority 100 table $user_table