ftp應用模組沒有全域性初始化操作,僅是註冊了網路命名空間操作ip_vs_ftp_ops,初始化init函式為__ip_vs_ftp_init。
static struct pernet_operations ip_vs_ftp_ops = ;
static int __init ip_vs_ftp_init(void)
當初始化網路命名空間時,執行此函式。全域性變數ports_count指定了ftp應用使用的埠數量,當前為1。陣列ports定義了ftp應用使用的埠號列表,當前只有ftp的有名埠號21。
static unsigned int ports_count = 1;
static int __net_init __ip_vs_ftp_init(struct net *net)
}
.name = "ftp",
.protocol = ipproto_tcp,
.module = this_module,
.incs_list = list_head_init(ip_vs_ftp.incs_list),
.init_conn = ip_vs_ftp_init_conn,
.done_conn = ip_vs_ftp_done_conn,
.bind_conn = null,
.unbind_conn = null,
.pkt_out = ip_vs_ftp_out,
.pkt_in = ip_vs_ftp_in,};
連線初始化函式。
data++;
}
/*
* to support virtual ftp server, the scenerio is as follows: ftp client ----> load balancer ----> ftp server
*/if (ip_vs_ftp_get_addrport(data_start, data_limit, client_string, sizeof(client_string)-1, ' ', '\r', &to.ip, &port,
&start, &end) != 1)
return 1;
/* passive mode off */
為了保證隨後的ftp資料通道的連線與控制通道的連線都由同乙個真實伺服器進行處理,之後,核心根據以上獲取到的位址和埠號,在加上當前連線的目的位址和目的埠號,建立乙個新的連線。並且,將此新連線的控制連線設定為當前的連線,表明新連線是由當前連線派生出來的。
}
/* move tunnel to listen state */
ip_vs_tcp_conn_listen(n_cp);
ip_vs_conn_put(n_cp);
}
最後,由於在以上的過程中,沒有對實際的報文進行任何修改,所以不存在任何差值:diff等於0。以下為ftp主動模式的報文互動流程:
buf_len = strlen(buf);使用nf_nat_mangle_tcp_packet函式將資料報中的位址和埠資訊替換為虛擬伺服器的位址和埠資訊。由於在此函式中已經調整了報文的tcp頭部中的序列號,因此返回報文長度差值引數應設定為0,即diff = 0。
ct = nf_ct_get(skb, &ctinfo);
if (ct && (ct->status & ips_nat_mask))
}ip_vs_tcp_conn_listen(n_cp);
ip_vs_conn_put(n_cp);
return ret;
}return 1;
}
以下為ftp被動模式的報文互動流程:
函式ip_vs_ftp_get_addrport負責解析報文中的位址和埠號,在以上的ftp輸出輸入處理中都會使用到。在ftp被動模式下,ftp服務端將傳送自身的位址和資料通道埠號到客戶端,並被動等待客戶端的連線,其格式為:227 õýôú½øèë±»¶¯ä£ê½ (192,168,1,115,246,168) 。
對於ftp主動模式,ftp客戶端使用命令port傳送自身的位址和資料通道埠號到伺服器,其格式為:port 192,168,1,114,140,247 。以下為在函式ip_vs_ftp_out和ip_vs_ftp_in中的呼叫引數。
函式ip_vs_ftp_get_addrport執行字串解析操作,首先資料報文的開頭需要匹配指定長度的pattern字串,對於ftp被動模式,需要匹配字串:"227 ";對於主動模式需要匹配字串:"port "。
static int ip_vs_ftp_get_addrport(char *data, char *data_limit, const char *pattern, size_t plen, char skip, char term,
__be32 *addr, __be16 *port, char **start, char **end)
引數skip用於跳過其所指定的字元,對於ftp被動模式,需要跳過的是:』(『字元;對於主動模式,需要跳過的是:』 '空格字元。
s = data + plen;
if (skip) else if (*s != skip) }}
引數term指定了要解析的資料中結尾的字元。對於ftp被動模式,結尾字元為:』)』;對於主動模式,結尾字元為:』\r』。
for (data = s; ; data++)
*end = data;
以下迴圈將位址和埠號組成的字串解析為整數型數字,儲存在陣列p中。其中前4個陣列元素儲存ip位址,後2個陣列元素儲存埠號。
memset(p, 0, sizeof(p));
for (data = s; ; data++) else if (c == ',' && i < 5) else
}if (i != 5)
return -1;
*start = s;
*addr = get_unaligned((__be32 *) p);
*port = get_unaligned((__be16 *) (p + 4));
return 1;
}
核心版本 4. 手動載入ip vs模組的方法和步驟
2.lvs之ipvsadm命令 億速雲負載均衡 cloud load balancer 是對多台雲伺服器進行流量分發的服務。億速雲負載均衡可以通過流量分發擴充套件應用系統對外的服務能力,通過消除單點故障提公升應用系統的可用性。億速雲負載均衡服務通過設定虛擬服務位址 vip 將位於同一地域的多台雲伺服...
Perl中ftp的應用
連線ftp有兩種連線模式,預設模式和passive模式。ftp伺服器工作在預設模式下,連線比較簡單 use net ftp initial ftp my ftp net ftp new ftpserver,debug 0,timeout 60 or return 1 ftp login ftpuse...
php的ftp函式簡單應用
ftp server 192.168.1.127 ftp user foo ftp pass bar 連線ftp伺服器 con ftp connect ftp server 傳送使用者名稱和密碼 ftp login con,ftp user,ftp pass 取得伺服器的系統型別 ftp systy...