我在 ubuntu 服务器上有一个带有 OpenVpn 的 vpn,它适用于每个连接。
服务器配置是:
port 1194
proto udp
dev tun
ca easy-rsa/keys/ca.crt
cert easy-rsa/keys/CommonName.crt
key easy-rsa/keys/CommonName.key
dh easy-rsa/keys/dh2048.pem
server 10.8.0.0 255.255.255.0
#push "redirect-gateway def1 bypass-dhcp"
push "redirect-gateway def1"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
push "topology subnet"
topology subnet
route 10.8.0.0 255.255.255.0
keepalive 10 120
comp-lzo
user openvpn
group openvpn
persist-key
persist-tun
status openvpn-status.log
verb 3
我的 client.conf 包含:
client
dev tun
proto udp
remote IP_ADDRESS 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert user.crt
key user.key
ns-cert-type server
comp-lzo
verb 3
当前服务器正在通过 vpn 连接路由每个连接。
这是通过 iptables 完成的:
iptables -A FORWARD -o ens3 -i tun0 -s 10.8.0.0/24 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
所以,这样就很好了。
现在,如果源目的地是 example.com,我只想使用 vpn 连接。否则就不行。
所以我尝试了这个:
iptables -A FORWARD -o ens3 -i tun0 -s 10.8.0.0/24 -d example.com -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack -s example.com --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
但这不起作用。我也使用了来自的 IP 地址example.com
。
但如果我浏览其他网站,它将使用 vpn 连接。我通过以下测试验证了这一点:show my current ip adress services
我做错了什么?
iptables --help
向我展示
[!] --目标 -d 地址[/掩码][...]
或者它对此不起作用?我该如何修复它?
答案1
您需要向路由表添加规则。
ip route add $example.com.ip via $vpn.gateway
对于更复杂的路由,您可以使用 iptables 在数据包上设置标记,然后ip rule
根据标记进行路由。
此外,您的配置会将 VPN 添加为所有内容的“默认”路由。您需要删除该redirect-gateway
选项。
另一个想法是,如果您从建立 VPN 隧道的同一台机器(客户端)进行测试,那么根本就不会使用 FORWARD 链。FORWARD 不适用于本地生成的数据包。