web-dev-qa-db-ja.com

iptablesポートベースのルーティング

私はこれを何日もグーグルして成功しませんでした。サーバーからVPNに時々接続し、VPN経由でポート80と443のみを使用し、eth0インターフェイス経由で他のすべてのポートを使用するようにDebianサーバーを構成しようとしています。

これを行うための助けは大歓迎です。

2
Arya

まず、このガイドを参照してください: http://lartc.org/howto/lartc.rpdb.multiple-links.html (および/または複数のデフォルトルートを使用するための他のガイド)

したがって、あなたの場合、解決策は、サーバーに2つのネットワークインターフェイス(デフォルトのeth0と、LANとは異なる有効なIPを持つeth0:1など)を構成し、デフォルトですべてのトラフィックがVPNに送られるようにルートを構成することだと思います。 、およびセカンダリインターフェイスから発信されたトラフィックはVPNから離れたままになります。次に、sshを使用して、-bオプションを使用してセカンダリインターフェイスにバインドします。

または、セカンダリインターフェイスからのトラフィックがVPNに送信されるように複数のルートを設定してから、セカンダリIPアドレスに(のみ)バインドされるwwwプロキシサーバーを設定します。次に、そのプロキシサーバーをブラウザで使用します。

または、(のみ)wgetを使用する場合は、上記を実行し、-bind-addressオプションを使用してセカンダリインターフェイスにバインドします。

または、より一般的ではない解決策として、laurentが12月20日に他の回答でコメントしたように、複数のルーティングテーブルをいじることなく、接続しているサーバーのIP固有のルートを構成できます。このような:

route add -Host [the Host you're connecting to] gateway [your gateway address]

これが実際の例です。 VPN接続を設定し、VPNアドレスは23.21.xxx.yyy、ローカル外部アドレスは91.157.xxx.yyy、ローカル内部ゲートウェイアドレスは192.168.0.1です。

root@Dell64:~# curl -s ipchicken.com|egrep '[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+.*<br>'|sed 's/[0-9][0-9]*[.][0-9][0-9]* .*/xxx.yyy/'
        23.21.xxx.yyy
root@Dell64:~# route add -Host ipchicken.com gateway 192.168.0.1
root@Dell64:~# curl -s ipchicken.com|egrep '[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+.*<br>'|sed 's/[0-9][0-9]*[.][0-9][0-9]* .*/xxx.yyy/'
        91.157.xxx.yyy

(ipchicken.com Webサイトには外部IPアドレスのみが表示され、grepは外部IPアドレスを持つ行のみをフィルター処理し、sedは最後の部分をxxx.yyyに置き換えます)

1
Viljo Viitanen

「使用」とは、リクエストの受信とサイトへのサービス提供を意味する場合、Listen vpnIP:80Listen vpnIP:443でそれを行うようにApache(またはWebサーバー)を構成する必要があります。したがって、他のIPでは機能しません。

さらに、iptablesを使用すると、eth0のポート80と443を削除し、VPNインターフェイス(以下ではtun0を使用)でのみ許可できます。

-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j DROP
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j DROP
-A INPUT -i tun0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i tun0 -p tcp -m tcp --dport 443 -j ACCEPT

「使用」とは発信接続(Webサーフィン)を意味する場合、1つの方法は、サーバー(またはVPN内のどこかに)にプロキシ(squidなど)をインストールし、VPNデフォルトゲートウェイを介してすべてのトラフィックを送信するようにプロキシを構成することです。 iptables NAT tableを使用して、ポート80および443をプロキシポート(squidの場合は3128)にリダイレクトできます。

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.2:3128
iptables -t nat -A PREROUTING -i tun0 -p tcp --dport 80 -j REDIRECT --to-port 3128

仮定:

tun0 = vpn interface
192.168.1.2 = IP of your server on tun0 (vpn)

また、ポート443についても同じようにします。

おそらくいくつかのテストと調整が必要ですが、これはこの方法で行う場合の一般的な動作です。

0
laurent