Openvpn client自動斷網的問題
我在winxp上安裝兩套openvpn client,它們分別有不同的註冊表鍵值,安裝目錄,不同的tap網卡(網卡的硬體ID也不同),連接不同的server端。openvpn client 1連接server 1后得到10.8.0.x的IP,client 2連接server 2后得到10.7.0.x的IP。
現在的問題是,兩個client同時連接各自的server后,斷開其中任意一個client以後,另一個client也會自動斷開。
以下的日誌是在斷開client 1后,client 2上的日誌,我把日誌級別調到9。
Tue Nov 07 09:11:54 2006 us=13161 event_wait returned 0
Tue Nov 07 09:11:54 2006 us=13195 I/O WAIT status=0x0020
Tue Nov 07 09:11:54 2006 us=13232 WE_CTL n=0 ev=0x00469984 rwflags=0x0001 arg=0x00453560
Tue Nov 07 09:11:54 2006 us=13249 STREAM: SET NEXT, buf= next= len=-1 maxlen=1528
Tue Nov 07 09:11:54 2006 us=13263 WE_CTL n=1 ev=0x00b75bbc rwflags=0x0001 arg=0x00453558
Tue Nov 07 09:11:54 2006 us=13276 WE_CTL n=2 ev=0x00ba6f40 rwflags=0x0001 arg=0x0045355c
Tue Nov 07 09:11:54 2006 us=13294 I/O WAIT TRQ|Tw0|SRQ|Sw1
Tue Nov 07 09:11:54 2006 us=13306 WE_WAIT enter n=3 to=1149
Tue Nov 07 09:11:54 2006 us=13319 ev=0x00000758 rwflags=0x0001 arg=0x00453560
Tue Nov 07 09:11:54 2006 us=13331 ev=0x00000760 rwflags=0x0001 arg=0x00453558
Tue Nov 07 09:11:54 2006 us=13343 ev=0x00000744 rwflags=0x0001 arg=0x0045355c
Tue Nov 07 09:11:54 2006 us=18909 WE_WAIT leave rwflags=0x0001 arg=0x00453560
Tue Nov 07 09:11:54 2006 us=18928 event_wait returned 1
Tue Nov 07 09:11:54 2006 us=20811 I/O WAIT status=0x0010
Tue Nov 07 09:11:54 2006 us=20848 PID packet_id_free
Tue Nov 07 09:11:54 2006 us=20904 SSL alert (write): warning: close notify
Tue Nov 07 09:11:54 2006 us=21080 PID packet_id_free
Tue Nov 07 09:11:54 2006 us=21092 PID packet_id_free
Tue Nov 07 09:11:54 2006 us=21102 PID packet_id_free
Tue Nov 07 09:11:54 2006 us=21132 PID packet_id_free
Tue Nov 07 09:11:54 2006 us=21143 PID packet_id_free
Tue Nov 07 09:11:54 2006 us=21153 PID packet_id_free
Tue Nov 07 09:11:54 2006 us=21163 PID packet_id_free
(我覺得問題出在下面的日誌里,不知道為什麼client 2的tcp連接被斷開)
Tue Nov 07 09:11:54 2006 us=21259 TCP/UDP: Closing socket
Tue Nov 07 09:11:54 2006 us=21666 route DELETE 10.7.0.1 MASK 255.255.255.255 10.7.0.10
Tue Nov 07 09:11:54 2006 us=159550 DEBUG: route find if: on_tun=1 count=1 index=131077
Tue Nov 07 09:11:54 2006 us=165278 Route deletion via IPAPI succeeded
Tue Nov 07 09:11:54 2006 us=165309 Closing TUN/TAP interface
Tue Nov 07 09:11:54 2006 us=165322 Attempting CancelIO on TAP-Win32 adapter
Tue Nov 07 09:11:54 2006 us=176769 Attempting close of overlapped read event on TAP-Win32 adapter
Tue Nov 07 09:11:54 2006 us=176805 Attempting close of overlapped write event on TAP-Win32 adapter
Tue Nov 07 09:11:54 2006 us=176822 Attempting CloseHandle on TAP-Win32 adapter
Tue Nov 07 09:11:54 2006 us=177747 client_down.bat Local Link 17 1500 1528 10.7.0.9 10.7.0.10 init
Tue Nov 07 09:11:54 2006 us=178498 SYSTEM 'client_down.bat Local Link 17 1500 1528 10.7.0.9 10.7.0.10 init'
Tue Nov 07 09:11:54 2006 us=178515 ENV 'script_type=down'
Tue Nov 07 09:11:54 2006 us=178526 ENV 'dev=Local Link 17'
Tue Nov 07 09:11:54 2006 us=178536 ENV 'link_mtu=1528'
Tue Nov 07 09:11:54 2006 us=178546 ENV 'tun_mtu=1500'
Tue Nov 07 09:11:54 2006 us=178556 ENV 'script_context=init'
Tue Nov 07 09:11:54 2006 us=178567 ENV 'signal=sigterm'
Tue Nov 07 09:11:54 2006 us=178577 ENV 'route_gateway_1=10.7.0.10'
Tue Nov 07 09:11:54 2006 us=178587 ENV 'route_netmask_1=255.255.255.255'
Tue Nov 07 09:11:54 2006 us=178598 ENV 'route_network_1=10.7.0.1'
Tue Nov 07 09:11:54 2006 us=178608 ENV 'route_vpn_gateway=10.7.0.10'
Tue Nov 07 09:11:54 2006 us=178619 ENV 'route_net_gateway=192.168.70.1'
Tue Nov 07 09:11:54 2006 us=178629 ENV 'ifconfig_remote=10.7.0.10'
Tue Nov 07 09:11:54 2006 us=178640 ENV 'ifconfig_local=10.7.0.9'
Tue Nov 07 09:11:54 2006 us=178650 ENV 'common_name=SERVER'
Tue Nov 07 09:11:54 2006 us=178661 ENV 'trusted_port=58194'
Tue Nov 07 09:11:54 2006 us=178671 ENV 'trusted_ip=123.123.123.123'
Tue Nov 07 09:11:54 2006 us=178682 ENV 'untrusted_port=58194'
Tue Nov 07 09:11:54 2006 us=178692 ENV 'untrusted_ip=123.123.123.123'
Tue Nov 07 09:11:54 2006 us=178703 ENV 'tls_serial_0=1'
Tue Nov 07 09:11:54 2006 us=178714 ENV 'tls_id_0=/C=KG/ST=NA/O=OpenVPN-TEST/CN=SERVER/emailAddress=me@myhost.mydomain'
Tue Nov 07 09:11:54 2006 us=178725 ENV 'tls_serial_1=0'
Tue Nov 07 09:11:54 2006 us=178736 ENV 'tls_id_1=/C=KG/ST=NA/L=BISHKEK/O=OpenVPN-TEST/CN=CA/emailAddress=me@myhost.mydomain'
Tue Nov 07 09:11:54 2006 us=178747 ENV 'config=client.ovpn'
Tue Nov 07 09:11:54 2006 us=178758 ENV 'proto=tcp-client'
Tue Nov 07 09:11:54 2006 us=178768 ENV 'local_port=1194'
Tue Nov 07 09:11:54 2006 us=178778 ENV 'verb=9'
Tue Nov 07 09:11:54 2006 us=178788 ENV 'daemon=0'
Tue Nov 07 09:11:54 2006 us=178799 ENV 'daemon_log_redirect=0'
Tue Nov 07 09:11:54 2006 us=178810 ENV 'remote_1=123.123.123.123'
Tue Nov 07 09:11:54 2006 us=178822 ENV 'remote_port_1=58194'
C:\Program Files\openvpn-2\config>route delete 10.7.0.0
The route specified was not found.
Tue Nov 07 09:11:54 2006 us=419276 SYSTEM return=0
Tue Nov 07 09:11:54 2006 us=420524 PID packet_id_free
Tue Nov 07 09:11:54 2006 us=420580 SIGTERM received, process exiting
Tue Nov 07 09:11:54 2006 us=421278 Closing Win32 semaphore 'openvpn_netcmd'
[ 本帖最後由 sailer_sh 於 2006-11-7 09:51 編輯 ]
《解決方案》
建議先安裝一個VPN程序,使用2套配置文件,創建2個tap設備
分別連接2個vpn server試試,我印象中A掉了,是不會 影響B的。
《解決方案》
最新發現:兩套openvpn client,一個使用命令行方式連接(bin\openvpn.exe --config ..\config\client.ovpn),另一個使用openvpn-gui連接,那麼,斷開其中任意一個,另一個不會斷開。
如果兩個都使用命令行方式連接,斷開其中任意一個,另一個也不會斷開。
看來問題出在openvpn-gui上,正在看openvpn-gui-1.0.3的代碼,我不熟悉窗口編程,所以看得很吃力。
在openvpn-gui的代碼目錄里,有一個openvpn.c文件,裡面有int StartOpenVPN(int config)、void StopOpenVPN(int config)、void SuspendOpenVPN(int config)、void StopAllOpenVPN()等幾個函數,感覺上是用來操作openvpn客戶端的。
在main.c里有一個函數,DispatchMessage()好像是windows消息機制相關的函數,我不懂這個,不知道誰能解釋一下:
/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static UINT s_uTaskbarRestart;
int i;
switch (message) {
case WM_CREATE:
/* Save Window Handle */
o.hWnd = hwnd;
s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
CreatePopupMenus(); /* Create popup menus */
LoadAppIcon(); /* Load App Icon */
ShowTrayIcon();
if (o.allow_service=='1' || o.service_only=='1')
CheckServiceStatus(); // Check if service is running or not
if (!AutoStartConnections()) {
SendMessage(hwnd, WM_CLOSE, 0, 0);
break;
}
break;
case WM_NOTIFYICONTRAY:
OnNotifyTray(lParam); // Manages message from tray
return TRUE;
case WM_COMMAND:
if ( (LOWORD(wParam) >= IDM_CONNECTMENU) && (LOWORD(wParam) < IDM_CONNECTMENU + MAX_CONFIGS) ) {
StartOpenVPN(LOWORD(wParam) - IDM_CONNECTMENU);
}
if ( (LOWORD(wParam) >= IDM_DISCONNECTMENU) && (LOWORD(wParam) < IDM_DISCONNECTMENU + MAX_CONFIGS) ) {
StopOpenVPN(LOWORD(wParam) - IDM_DISCONNECTMENU);
}
if ( (LOWORD(wParam) >= IDM_STATUSMENU) && (LOWORD(wParam) < IDM_STATUSMENU + MAX_CONFIGS) ) {
ShowWindow(o.cnn.hwndStatus, SW_SHOW);
}
if ( (LOWORD(wParam) >= IDM_VIEWLOGMENU) && (LOWORD(wParam) < IDM_VIEWLOGMENU + MAX_CONFIGS) ) {
ViewLog(LOWORD(wParam) - IDM_VIEWLOGMENU);
}
if ( (LOWORD(wParam) >= IDM_EDITMENU) && (LOWORD(wParam) < IDM_EDITMENU + MAX_CONFIGS) ) {
EditConfig(LOWORD(wParam) - IDM_EDITMENU);
}
#ifndef DISABLE_CHANGE_PASSWORD
if ( (LOWORD(wParam) >= IDM_PASSPHRASEMENU) && (LOWORD(wParam) < IDM_PASSPHRASEMENU + MAX_CONFIGS) ) {
ShowChangePassphraseDialog(LOWORD(wParam) - IDM_PASSPHRASEMENU);
}
#endif
if (LOWORD(wParam) == IDM_PROXY) {
ShowProxySettingsDialog();
}
if (LOWORD(wParam) == IDM_ABOUT) {
DialogBox(o.hInstance, (LPCTSTR)IDD_ABOUTDIALOG, NULL, (DLGPROC)AboutDialogFunc);
}
if (LOWORD(wParam) == IDM_CLOSE) {
CloseApplication(hwnd);
}
if (LOWORD(wParam) == IDM_SERVICE_START) {
MyStartService();
}
if (LOWORD(wParam) == IDM_SERVICE_STOP) {
MyStopService();
}
if (LOWORD(wParam) == IDM_SERVICE_RESTART) MyReStartService();
break;
case WM_CLOSE:
CloseApplication(hwnd);
break;
case WM_DESTROY:
StopAllOpenVPN();
OnDestroyTray(); /* Remove Tray Icon and destroy menus */
PostQuitMessage (0); /* Send a WM_QUIT to the message queue */
break;
case WM_QUERYENDSESSION:
return(TRUE);
case WM_ENDSESSION:
StopAllOpenVPN();
OnDestroyTray();
break;
case WM_POWERBROADCAST:
switch (wParam) {
case PBT_APMSUSPEND:
if (o.disconnect_on_suspend == '1')
{
/* Suspend running connections */
for (i=0; i<o.num_configs; i++)
{
if (o.cnn.connect_status == CONNECTED)
SuspendOpenVPN(i);
}
/* Wait for all connections to suspend */
for (i=0; i<10; i++, Sleep(500))
if (CountConnectedState(SUSPENDING) == 0) break;
}
return FALSE;
case PBT_APMRESUMESUSPEND:
case PBT_APMRESUMECRITICAL:
for (i=0; i<o.num_configs; i++)
{
/* Restart suspend connections */
if (o.cnn.connect_status == SUSPENDED)
StartOpenVPN(i);
/* If some connection never reached SUSPENDED state */
if (o.cnn.connect_status == SUSPENDING)
StopOpenVPN(i);
}
return FALSE;
}
default: /* for messages that we don't deal with */
if (message == s_uTaskbarRestart)
{
/* Explorer has restarted, re-register the tray icon. */
ShowTrayIcon();
CheckAndSetTrayIcon();
break;
}
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
[ 本帖最後由 sailer_sh 於 2006-11-8 17:30 編輯 ]