質問: 既存のtcp接続に影響を与えずにデフォルトルートを変更する サーバーに2つのパブリックネットワークアドレスがあるとします。1つはispを介したnat(192.168.99.0/24)で、もう1つは別のispを介したvpn(192.168.1.0/24)で、すでにper- ispを介したvpnサーバーへのホストルート。これが私の最初のルーティングテーブルです。現在、サブネット192.168.99.0/24のispを介してルーティングしています。$ route -n kernel ip routing table destination gateway genmask flags metric ref use iface 0.0.0.0 192.168.99.1 0.0.0.0 ug 0 0 0 eth1 55.66.77.88 192.168.99.1 255.255.255.255 ugh 0 0 0 eth1 192.168.99.0 0.0.0.0 255.255.255.0 u 0 0 0 eth1 192.168.1.0 0.0.0.0 255.255.255.0 u 0 0 0 tap0 ここで、新しいtcp接続を192.168.1.0/24に切り替えたいので、次のように入力します。$ route add -net 0.0.0.0 gw 192.168.1.1 dev tap0 これを行うと、長年のtcp接続がハングします。既存のtcp接続が古いルートを使用できるようにしながら、新しい接続のデフォルトインターフェイスを安全に変更する方法はありますか(つまり、ある種のステートフルルーティングテーブルを有効にする必要がありますか)?私は確立されたtcp接続でのみ機能するソリューションで大丈夫です、そしてそれがどれほどハックであるかは気にしません。たとえば、既存の接続に一時的なiptablesルールを追加して、それらを古いルートに強制する方法がある場合です。しかし、これを行うにはsome方法が必要です。編集:既存の接続の単純な「routeadd -host ...」についてのメモ:このソリューションは、古いインターフェイスにipのサブセットを残して問題がなければ機能します。ただし、私のアプリケーションでは、ソースipが同じであっても、新しいインターフェイスで新しい接続を許可したいので、これでは実際には問題は解決しません。現在、「iproute」コマンドを使用してソースベースのルーティングルールを設定することを検討しています。
回答: 次のコマンドは、開いているtcp接続を調べ、ローカルネットワーク外の宛先を一覧表示します。$ netstat -4ntu | tail -n +3 | cut -c45-65 | cut -d: -f1 | grep -v '192.168.99' | grep -v '192.168.1' 214.236.220.101 63.171.235.16 174.63.61.132 159.47.216.178 62.59.197.29 139.47.218.150 56.4.17.22 204.63.49.5 155.9.79.196 144.31.207.66 したがって、このリストを繰り返し処理し、デフォルトルートを変更する前に、メインルーターに向けて特定のルートを設定する必要があります。for i in $(netstat -4nt | tail -n +3 | cut -c45-65 | cut -d: -f1 |grep -v '192\.168\.99' | grep -v '192\.168\.1') ; do echo route add -host $i gw 192.168.1.99; done (私はそこに「echo」コマンドを残しているので、それが何をするのかを見ることができます。実際にやりたいときにこれを削除できます。次に、デフォルトルートを変更します。$ route add -net 0.0.0.0 gw 192.168.1.1 dev tap0 追加されたルートはより具体的であるため、デフォルトルートよりも優先されます。明らかに、これをスクリプトに入れて簡単にすることができます。