web-dev-qa-db-ja.com

一部のポートでのOpenVPNバイパス

Debian 7を実行しているサーバーがあり、VPNに接続して、一部のポート(SSH、ホストされているWebサイトなど)を除き、すべてのトラフィックをVPN経由で通過させたいと考えています。

しばらくインターネットで検索しましたが、期待どおりに機能するようには見えません。

私はiptables /ネットワークの専門家ではないので、何かが足りない...

これが私のスクリプトです:

VPNスクリプトの前

これはVPNの前に開始されるスクリプトです。一部のポート(ここではSSH)を除いて、VPNを経由せずに出入りするすべてのトラフィックをブロックするために使用されます。

このスクリプトだけを起動すると、彼の仕事がうまくいきます。 SSH経由でサーバーに接続できますが、他のすべてのポートがブロックされ、サーバーはインターネットにアクセスできません(VPNが起動されていないため)。

#!/bin/bash

# Flush iptables
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

# Default policy
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# Accept packets through VPN
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT

# Accept local connections
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Accept connection to/from VPN servers
iptables -A INPUT -s xxx.xxx.xxx.xxx -j ACCEPT
iptables -A OUTPUT -d xxx.xxx.xxx.xxx -j ACCEPT

# Disable Reverse Path Filtering on all network interfaces
for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do
    echo 0 > $i
done

# Open ports on iptable
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

ルートアップOpenVPNスクリプト

「route-up」OpenVPNのオプションを介して呼び出されるスクリプトは次のとおりです。これは、ポートがVPNをバイパスするようにするスクリプトです。

#!/bin/bash

WAN_GATEWAY="xxx.xxx.xxx.xxx"

echo 1 > /proc/sys/net/ipv4/ip_forward

# Delete table 100 and flush all existing rules
ip route flush table 100
ip route flush cache
iptables -t mangle -F PREROUTING

# Table 100 will route all traffic with mark 1 to WAN (no VPN)
ip route add default table 100 via $WAN_GATEWAY dev eth0
ip rule add fwmark 1 table 100
ip route flush cache

# Mark packets on port 22
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 1

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

OpenVPN設定ファイル

OpenVPNクライアントの設定ファイルは次のとおりです。

client
dev tun
proto udp
resolv-retry infinite
nobind
tun-mtu 1500
tun-mtu-extra 32
mssfix 1450
persist-key
persist-tun
comp-lzo
verb 3
redirect-gateway def1
user nobody
group nogroup
script-security 2
auth-user-pass /path/to/config/login.conf
route-up /path/to/scripts/vpn_up.sh
remote xxx.xxx.xxx.xxx 443
ca /path/to/config/certs/ch.crt

私の問題は、VPNが起動すると、サーバーにアクセスできなくなることです。

何が悪いのですか?

助けてくれてありがとう!

6
Leeroy Brun

少し検索したところ、次のスレッドが見つかりました: https://forum.linode.com/viewtopic.php?p=50114&sid=b440414422596bb7dbc96cf7c9ee511f#p50114

"route-up" OpenVPNスクリプトを次のように変更しました。ようやく動作しました。他のすべての厄介なルール(iptable PREROUTING、MASQUERADEなど)を削除しました。

これが私の最後の「ルートアップ」スクリプトです。

ip route flush table 100
ip route flush cache

ip rule add from x.x.x.x table 100
ip route add table 100 to y.y.y.y/y dev ethX
ip route add table 100 default via z.z.z.z

ここで、x.x.x.xはサーバーのパブリックIP、y.y.y.y/yはサーバーのパブリックIPアドレスのサブネット、ethXはサーバーのパブリックイーサネットインターフェイス、z.z.z.zはデフォルトゲートウェイです。

これが他の誰かを助けることを願っています。

7
Leeroy Brun

私自身同じ試練を経験した後、私はルーティングアップスクリプトに少なくとも1つの問題を発見しました。

iptables -t mangle -A PREROUTING ...

でなければなりません:

iptables -t mangle -A OUTPUT ...

理由についてはこちらをお読みください: http://www.iptables.info/en/structure-of-iptables.html

IP転送をオンにする必要はありませんでした。

2
Björn