私は次のようなネットワークを持つDebianを実行しているサーバーを持っています:
eth0 - has public IP address 1.2.3.4
eth1 - has public IP address 1.2.3.5
Android電話から接続できるサーバーにVPNをセットアップしようとしています。 http://wiki.debian.org/)の指示に従いました。 HowTo/AndroidVPNServer xl2tpdとracoonをインストールして構成します。すべて機能しますが、最後に調整したいことが1つあります。それは、電話をVPNに接続するときに、電話からのトラフィックの元となるパブリックIPアドレスです。 routedはeth0、つまり1.2.3.4のものです。VPNトラフィックをeth1のIPアドレス(1.2.3.5)の背後でNAT化する必要があります(理想的には、VPNクライアントは1.2.3.4に接続し続けます)。
私のファイアウォールルールは次のようになります。
VPN_CLIENT_RANGE=192.168.200.0/24
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -p esp -j ACCEPT
iptables -A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport 1701 -j ACCEPT
# Enable VPN traffic on the ppp+ adapters (only active when a call is established)
# to go through the machine using SNAT/masquerading.
iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp+ -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -s $VPN_CLIENT_RANGE -j MASQUERADE
最後の3行でeth0をeth1に変更すると正しい効果が得られることを期待していましたが、そうではありません-VPNクライアントは接続できますが、インターネットを見ることができなくなり、ログにはVPNクライアントからのトラフィックが表示されます(サーバー)はまだeth0から送信されています(ファイアウォールは最後の3行なしでブロックします)。
どういうわけかpppdで送信元アドレスを設定する必要がありますか?または、pppインターフェースのデフォルトルートを変更しますか?
私はそれを解決しました。
クライアントがVPNに接続すると、PPP接続が確立されます。
パケットは、クライアントからサーバー上のpppNインターフェイスに流れます。それらが「間違った」IPアドレスを介してそこからインターネットに流れる原因は、サーバーのデフォルトのルーティングテーブルです。
$ ip route show
default dev eth0 scope link
つまり、すべてのアウトバウンドトラフィックはeth0を経由します。
デフォルトルートを変更したくないと仮定すると、必要なのは、eth1を介したデフォルトルートで別のルーティングテーブルを作成し、VPNにそれを使用させることです。
新しいテーブルのエントリを/ etc/iproute2/rt_tablesに追加します。
101 vpn
番号はファイル内で一意であれば何でもかまいません。名前は、手元の仕事を説明するものです。
次に、eth1経由のデフォルトルートをこのテーブルに追加します。
# ip route add table vpn default dev eth1 scope link
最後に、(pppNインターフェイス上の)着信VPNトラフィックを新しいテーブルに従ってルーティングするように強制します。最も簡単な方法は、/ etc/ppp/ip-up.dおよびip-down.dメカニズムを使用して、pppインターフェイスが起動および停止するときにルールを追加および削除することです。
/etc/ppp/ip-up.d/vpn-routing:
#!/bin/sh
IF=$1
ip rule add dev $IF table vpn
/etc/ppp/ip-down.d/vpn-routing:
#!/bin/sh
IF=$1
ip rule delete dev $IF table vpn
これらすべてを再起動後も存続させるには、起動時に実行されるものに「iprouteadd」行を配置する必要があります。ファイアウォールスクリプト-またはeth0の/ etc/network/interfacesの「up」行として。