亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ip_nat_ftp.c

?? 優(yōu)龍2410linux2.6.8內(nèi)核源代碼
?? C
字號(hào):
/* FTP extension for TCP NAT alteration. *//* (C) 1999-2001 Paul `Rusty' Russell * (C) 2002-2004 Netfilter Core Team <coreteam@netfilter.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */#include <linux/module.h>#include <linux/netfilter_ipv4.h>#include <linux/ip.h>#include <linux/tcp.h>#include <net/tcp.h>#include <linux/netfilter_ipv4/ip_nat.h>#include <linux/netfilter_ipv4/ip_nat_helper.h>#include <linux/netfilter_ipv4/ip_nat_rule.h>#include <linux/netfilter_ipv4/ip_conntrack_ftp.h>#include <linux/netfilter_ipv4/ip_conntrack_helper.h>MODULE_LICENSE("GPL");MODULE_AUTHOR("Rusty Russell <rusty@rustcorp.com.au>");MODULE_DESCRIPTION("ftp NAT helper");#if 0#define DEBUGP printk#else#define DEBUGP(format, args...)#endif#define MAX_PORTS 8static int ports[MAX_PORTS];static int ports_c;MODULE_PARM(ports, "1-" __MODULE_STRING(MAX_PORTS) "i");DECLARE_LOCK_EXTERN(ip_ftp_lock);/* FIXME: Time out? --RR */static unsigned intftp_nat_expected(struct sk_buff **pskb,		 unsigned int hooknum,		 struct ip_conntrack *ct,		 struct ip_nat_info *info){	struct ip_nat_multi_range mr;	u_int32_t newdstip, newsrcip, newip;	struct ip_ct_ftp_expect *exp_ftp_info;	struct ip_conntrack *master = master_ct(ct);		IP_NF_ASSERT(info);	IP_NF_ASSERT(master);	IP_NF_ASSERT(!(info->initialized & (1<<HOOK2MANIP(hooknum))));	DEBUGP("nat_expected: We have a connection!\n");	exp_ftp_info = &ct->master->help.exp_ftp_info;	LOCK_BH(&ip_ftp_lock);	if (exp_ftp_info->ftptype == IP_CT_FTP_PORT	    || exp_ftp_info->ftptype == IP_CT_FTP_EPRT) {		/* PORT command: make connection go to the client. */		newdstip = master->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.ip;		newsrcip = master->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip;		DEBUGP("nat_expected: PORT cmd. %u.%u.%u.%u->%u.%u.%u.%u\n",		       NIPQUAD(newsrcip), NIPQUAD(newdstip));	} else {		/* PASV command: make the connection go to the server */		newdstip = master->tuplehash[IP_CT_DIR_REPLY].tuple.src.ip;		newsrcip = master->tuplehash[IP_CT_DIR_REPLY].tuple.dst.ip;		DEBUGP("nat_expected: PASV cmd. %u.%u.%u.%u->%u.%u.%u.%u\n",		       NIPQUAD(newsrcip), NIPQUAD(newdstip));	}	UNLOCK_BH(&ip_ftp_lock);	if (HOOK2MANIP(hooknum) == IP_NAT_MANIP_SRC)		newip = newsrcip;	else		newip = newdstip;	DEBUGP("nat_expected: IP to %u.%u.%u.%u\n", NIPQUAD(newip));	mr.rangesize = 1;	/* We don't want to manip the per-protocol, just the IPs... */	mr.range[0].flags = IP_NAT_RANGE_MAP_IPS;	mr.range[0].min_ip = mr.range[0].max_ip = newip;	/* ... unless we're doing a MANIP_DST, in which case, make	   sure we map to the correct port */	if (HOOK2MANIP(hooknum) == IP_NAT_MANIP_DST) {		mr.range[0].flags |= IP_NAT_RANGE_PROTO_SPECIFIED;		mr.range[0].min = mr.range[0].max			= ((union ip_conntrack_manip_proto)				{ .tcp = { htons(exp_ftp_info->port) } });	}	return ip_nat_setup_info(ct, &mr, hooknum);}static intmangle_rfc959_packet(struct sk_buff **pskb,		     u_int32_t newip,		     u_int16_t port,		     unsigned int matchoff,		     unsigned int matchlen,		     struct ip_conntrack *ct,		     enum ip_conntrack_info ctinfo){	char buffer[sizeof("nnn,nnn,nnn,nnn,nnn,nnn")];	MUST_BE_LOCKED(&ip_ftp_lock);	sprintf(buffer, "%u,%u,%u,%u,%u,%u",		NIPQUAD(newip), port>>8, port&0xFF);	DEBUGP("calling ip_nat_mangle_tcp_packet\n");	return ip_nat_mangle_tcp_packet(pskb, ct, ctinfo, matchoff, 					matchlen, buffer, strlen(buffer));}/* |1|132.235.1.2|6275| */static intmangle_eprt_packet(struct sk_buff **pskb,		   u_int32_t newip,		   u_int16_t port,		   unsigned int matchoff,		   unsigned int matchlen,		   struct ip_conntrack *ct,		   enum ip_conntrack_info ctinfo){	char buffer[sizeof("|1|255.255.255.255|65535|")];	MUST_BE_LOCKED(&ip_ftp_lock);	sprintf(buffer, "|1|%u.%u.%u.%u|%u|", NIPQUAD(newip), port);	DEBUGP("calling ip_nat_mangle_tcp_packet\n");	return ip_nat_mangle_tcp_packet(pskb, ct, ctinfo, matchoff, 					matchlen, buffer, strlen(buffer));}/* |1|132.235.1.2|6275| */static intmangle_epsv_packet(struct sk_buff **pskb,		   u_int32_t newip,		   u_int16_t port,		   unsigned int matchoff,		   unsigned int matchlen,		   struct ip_conntrack *ct,		   enum ip_conntrack_info ctinfo){	char buffer[sizeof("|||65535|")];	MUST_BE_LOCKED(&ip_ftp_lock);	sprintf(buffer, "|||%u|", port);	DEBUGP("calling ip_nat_mangle_tcp_packet\n");	return ip_nat_mangle_tcp_packet(pskb, ct, ctinfo, matchoff, 					matchlen, buffer, strlen(buffer));}static int (*mangle[])(struct sk_buff **, u_int32_t, u_int16_t,		     unsigned int,		     unsigned int,		     struct ip_conntrack *,		     enum ip_conntrack_info)= { [IP_CT_FTP_PORT] = mangle_rfc959_packet,    [IP_CT_FTP_PASV] = mangle_rfc959_packet,    [IP_CT_FTP_EPRT] = mangle_eprt_packet,    [IP_CT_FTP_EPSV] = mangle_epsv_packet};static int ftp_data_fixup(const struct ip_ct_ftp_expect *ct_ftp_info,			  struct ip_conntrack *ct,			  struct sk_buff **pskb,			  enum ip_conntrack_info ctinfo,			  struct ip_conntrack_expect *expect){	u_int32_t newip;	struct iphdr *iph = (*pskb)->nh.iph;	struct tcphdr *tcph = (void *)iph + iph->ihl*4;	u_int16_t port;	struct ip_conntrack_tuple newtuple;	MUST_BE_LOCKED(&ip_ftp_lock);	DEBUGP("FTP_NAT: seq %u + %u in %u\n",	       expect->seq, ct_ftp_info->len,	       ntohl(tcph->seq));	/* Change address inside packet to match way we're mapping	   this connection. */	if (ct_ftp_info->ftptype == IP_CT_FTP_PASV	    || ct_ftp_info->ftptype == IP_CT_FTP_EPSV) {		/* PASV/EPSV response: must be where client thinks server		   is */		newip = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip;		/* Expect something from client->server */		newtuple.src.ip = 			ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.ip;		newtuple.dst.ip = 			ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip;	} else {		/* PORT command: must be where server thinks client is */		newip = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.ip;		/* Expect something from server->client */		newtuple.src.ip = 			ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.ip;		newtuple.dst.ip = 			ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.ip;	}	newtuple.dst.protonum = IPPROTO_TCP;	newtuple.src.u.tcp.port = expect->tuple.src.u.tcp.port;	/* Try to get same port: if not, try to change it. */	for (port = ct_ftp_info->port; port != 0; port++) {		newtuple.dst.u.tcp.port = htons(port);		if (ip_conntrack_change_expect(expect, &newtuple) == 0)			break;	}	if (port == 0)		return 0;	if (!mangle[ct_ftp_info->ftptype](pskb, newip, port,					  expect->seq - ntohl(tcph->seq),					  ct_ftp_info->len, ct, ctinfo))		return 0;	return 1;}static unsigned int help(struct ip_conntrack *ct,			 struct ip_conntrack_expect *exp,			 struct ip_nat_info *info,			 enum ip_conntrack_info ctinfo,			 unsigned int hooknum,			 struct sk_buff **pskb){	struct iphdr *iph = (*pskb)->nh.iph;	struct tcphdr *tcph = (void *)iph + iph->ihl*4;	unsigned int datalen;	int dir;	struct ip_ct_ftp_expect *ct_ftp_info;	if (!exp)		DEBUGP("ip_nat_ftp: no exp!!");	ct_ftp_info = &exp->help.exp_ftp_info;	/* Only mangle things once: original direction in POST_ROUTING	   and reply direction on PRE_ROUTING. */	dir = CTINFO2DIR(ctinfo);	if (!((hooknum == NF_IP_POST_ROUTING && dir == IP_CT_DIR_ORIGINAL)	      || (hooknum == NF_IP_PRE_ROUTING && dir == IP_CT_DIR_REPLY))) {		DEBUGP("nat_ftp: Not touching dir %s at hook %s\n",		       dir == IP_CT_DIR_ORIGINAL ? "ORIG" : "REPLY",		       hooknum == NF_IP_POST_ROUTING ? "POSTROUTING"		       : hooknum == NF_IP_PRE_ROUTING ? "PREROUTING"		       : hooknum == NF_IP_LOCAL_OUT ? "OUTPUT" : "???");		return NF_ACCEPT;	}	datalen = (*pskb)->len - iph->ihl * 4 - tcph->doff * 4;	LOCK_BH(&ip_ftp_lock);	/* If it's in the right range... */	if (between(exp->seq + ct_ftp_info->len,		    ntohl(tcph->seq),		    ntohl(tcph->seq) + datalen)) {		if (!ftp_data_fixup(ct_ftp_info, ct, pskb, ctinfo, exp)) {			UNLOCK_BH(&ip_ftp_lock);			return NF_DROP;		}	} else {		/* Half a match?  This means a partial retransmisison.		   It's a cracker being funky. */		if (net_ratelimit()) {			printk("FTP_NAT: partial packet %u/%u in %u/%u\n",			       exp->seq, ct_ftp_info->len,			       ntohl(tcph->seq),			       ntohl(tcph->seq) + datalen);		}		UNLOCK_BH(&ip_ftp_lock);		return NF_DROP;	}	UNLOCK_BH(&ip_ftp_lock);	return NF_ACCEPT;}static struct ip_nat_helper ftp[MAX_PORTS];static char ftp_names[MAX_PORTS][10];/* Not __exit: called from init() */static void fini(void){	int i;	for (i = 0; i < ports_c; i++) {		DEBUGP("ip_nat_ftp: unregistering port %d\n", ports[i]);		ip_nat_helper_unregister(&ftp[i]);	}}static int __init init(void){	int i, ret = 0;	char *tmpname;	if (ports[0] == 0)		ports[0] = FTP_PORT;	for (i = 0; (i < MAX_PORTS) && ports[i]; i++) {		ftp[i].tuple.dst.protonum = IPPROTO_TCP;		ftp[i].tuple.src.u.tcp.port = htons(ports[i]);		ftp[i].mask.dst.protonum = 0xFFFF;		ftp[i].mask.src.u.tcp.port = 0xFFFF;		ftp[i].help = help;		ftp[i].me = THIS_MODULE;		ftp[i].flags = 0;		ftp[i].expect = ftp_nat_expected;		tmpname = &ftp_names[i][0];		if (ports[i] == FTP_PORT)			sprintf(tmpname, "ftp");		else			sprintf(tmpname, "ftp-%d", i);		ftp[i].name = tmpname;		DEBUGP("ip_nat_ftp: Trying to register for port %d\n",				ports[i]);		ret = ip_nat_helper_register(&ftp[i]);		if (ret) {			printk("ip_nat_ftp: error registering "			       "helper for port %d\n", ports[i]);			fini();			return ret;		}		ports_c++;	}	return ret;}NEEDS_CONNTRACK(ftp);module_init(init);module_exit(fini);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品你懂的在线欣赏| 日韩午夜在线影院| 国产精品传媒入口麻豆| www.视频一区| 亚洲色图在线看| 欧美午夜在线一二页| 首页综合国产亚洲丝袜| 日韩午夜中文字幕| 成人一级黄色片| 亚洲人成人一区二区在线观看| 色菇凉天天综合网| 视频一区二区不卡| 国产亚洲精品福利| 91色在线porny| 午夜伦欧美伦电影理论片| 日韩精品在线看片z| 成人av免费在线播放| 亚洲摸摸操操av| 91精品国产综合久久精品性色| 精品中文字幕一区二区| 亚洲日本在线看| 欧美妇女性影城| 国产91综合网| 亚洲成国产人片在线观看| 精品国产电影一区二区| 91一区二区在线| 日本少妇一区二区| 国产精品不卡视频| 日韩美女一区二区三区| 99久久伊人精品| 日本三级亚洲精品| 中文字幕一区日韩精品欧美| 538prom精品视频线放| 福利一区二区在线| 日韩精品色哟哟| 国产精品第一页第二页第三页| 91麻豆精品国产无毒不卡在线观看| 成人三级在线视频| 免费成人av在线播放| 亚洲视频在线一区二区| 久久久精品欧美丰满| 欧美三级午夜理伦三级中视频| 国产精品456| 奇米综合一区二区三区精品视频| 中文字幕一区二区不卡| 久久久亚洲国产美女国产盗摄| 欧美日韩另类一区| 91免费在线视频观看| 国产精品一二一区| 美女久久久精品| 亚洲成人福利片| 亚洲精品国产成人久久av盗摄| 久久久国产精品午夜一区ai换脸| 欧美一二三区在线| 欧美视频在线不卡| 99热精品一区二区| 成人午夜免费av| 精品一区二区三区的国产在线播放 | 国产精品久久久99| 2021久久国产精品不只是精品| 欧美日韩亚洲综合一区| 色婷婷激情久久| 成人av片在线观看| 成人高清av在线| 国产98色在线|日韩| 国产精品一卡二卡| 国产一区91精品张津瑜| 国产中文字幕精品| 久久99久久99小草精品免视看| 污片在线观看一区二区| 午夜av一区二区三区| 亚洲成人中文在线| 亚洲成人动漫一区| 日韩国产欧美三级| 日韩精品高清不卡| 午夜私人影院久久久久| 亚洲综合免费观看高清完整版在线 | 国产精品香蕉一区二区三区| 国产麻豆精品在线| 国产成人自拍在线| 粉嫩一区二区三区在线看| 成人午夜精品一区二区三区| 国产99久久精品| 91在线观看一区二区| 91久久精品网| 欧美天堂一区二区三区| 精品污污网站免费看| 欧美日韩成人综合| 日韩免费一区二区| 久久午夜老司机| 国产精品―色哟哟| 亚洲精品成a人| 丝袜亚洲精品中文字幕一区| 久久国产精品99久久人人澡| 国产高清成人在线| 91视频xxxx| 91精品国产91综合久久蜜臀| 日韩精品一区二区三区老鸭窝| 久久久青草青青国产亚洲免观| 国产精品福利一区二区| 一区二区三区四区在线免费观看| 亚洲一区二区三区四区五区中文 | 国产剧情一区二区| 99久久精品免费| 欧美高清精品3d| 国产视频一区二区在线| 洋洋av久久久久久久一区| 日本三级亚洲精品| 风间由美性色一区二区三区| 91猫先生在线| 欧美一区二区三区四区视频| 国产情人综合久久777777| 一区二区三区精品视频| 久久99精品久久久久久国产越南| 成人毛片在线观看| 欧美吻胸吃奶大尺度电影| 久久久午夜电影| 一区二区三区四区精品在线视频| 蜜臀av一级做a爰片久久| 97久久精品人人爽人人爽蜜臀| 欧美日韩www| 中文字幕高清一区| 奇米在线7777在线精品| 91视频在线看| 欧美精品一区二区三区很污很色的| 日韩一区在线免费观看| 精久久久久久久久久久| 日本韩国欧美在线| 国产欧美日韩另类视频免费观看| 亚洲国产精品尤物yw在线观看| 国产一区二区在线观看视频| 欧美午夜视频网站| 国产精品久久久久久亚洲毛片| 日本成人超碰在线观看| 99精品热视频| 久久人人97超碰com| 亚洲国产wwwccc36天堂| av午夜一区麻豆| 精品乱人伦一区二区三区| 亚洲va欧美va人人爽午夜| 波多野结衣在线一区| 久久夜色精品一区| 日韩成人伦理电影在线观看| 96av麻豆蜜桃一区二区| 国产视频一区在线观看| 久久99精品久久久久久国产越南| 欧美日韩另类国产亚洲欧美一级| 综合色中文字幕| 成人高清视频在线观看| 久久久精品tv| 精品一区免费av| 日韩一区二区精品| 丝袜美腿亚洲综合| 欧美日韩小视频| 一区二区不卡在线视频 午夜欧美不卡在| 国产精品91一区二区| 2014亚洲片线观看视频免费| 捆绑变态av一区二区三区| 欧美年轻男男videosbes| 一区二区三区鲁丝不卡| 91久久精品午夜一区二区| 亚洲精品视频在线看| 日本高清不卡视频| 亚洲欧美日韩精品久久久久| 99国产精品国产精品毛片| 亚洲图片另类小说| 99九九99九九九视频精品| 亚洲欧美日韩成人高清在线一区| 99视频精品免费视频| 亚洲少妇30p| 91国内精品野花午夜精品| 亚洲自拍都市欧美小说| 欧美日韩综合在线| 五月激情六月综合| 日韩一本二本av| 激情六月婷婷久久| 国产欧美一区二区精品性色超碰| 国产精品12区| 中文字幕综合网| 在线观看免费亚洲| 视频在线观看91| 精品国产亚洲在线| 成人国产在线观看| 一区二区三区欧美| 91精品国产全国免费观看| 精品一区二区免费看| 亚洲国产精品二十页| av高清久久久| 亚洲一区二区三区在线播放| 91精品国产综合久久精品麻豆| 美女性感视频久久| 中文天堂在线一区| 欧美日韩一级二级三级| 蜜桃久久久久久久| 中文字幕av免费专区久久| 欧美色网站导航| 久久99精品国产.久久久久久| 中文成人综合网| 欧美精品亚洲一区二区在线播放| 美国av一区二区|