动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Oracle教程 ]的信息

本月文章推荐
.Oracle调优与深入之灌水篇.
.Oracle中将数字转化成字符串.
.Oracle8分区功能研究与应用.
.使用特殊索引的注意事项.
.手工建置档案系统.
.Oracle的一个内部工具block corr.
.postfix技巧.
.oracle数据库备份与恢复 a piece.
.oracle--SQL 变量.
.ORACLE没有自动增长的数据类型.
.建立与Oracle数据库服务器连接的.
.不要忽视Oracle 10g STATSPACK.
.Oracle DBA 回滚段管理试题选.
.迅速安装Linux与Oracle数据库步骤.
.Oracle9i,如何监视索引并清除监视.
.如何学习Oracle?.
.数据库登录说明.
.在Linux机器上安装运行Oracle.
.Linux下架设FTP.
.Oracle 10g 中管理物化视图变得更.

改tcp/ip协议栈屏蔽nat的尝试

发表日期:2008-2-9 |



  在开发H323设备时,发现有一个公网ip地址实在不错,因为H245协议中的TransportAddress包含了ip地址的信息,有时候可能portforward后也搞不定(至少理论上是这样)。可惜用adsl上网,一般都是使用私有地址,没办法,试试看改内核。
  使LAN中的一台PC(或其它设备以下称A)和某些internet网IP的PC(或其它设备以下称B)通信时,和拨号服务器(以下称C)一样,拥有外网IP地址。
  
  基本思路:
  从PPPOE(严格地说是PPP)来的数据数据包,避开NAT,直接转发到内网;反之亦然。我把截获数据包的点选在ip_rcv中。
  当然,原来的拨号网关还有一个代理arp的功能,在arp_rcv中截下A发出的arp包,非凡应答一下(conv.c)。
  
  具体过程如下:
  1.在arp.c和ip_input.c中各埋下一个钩子(函数指针),实际的处理把它放到外面的模块中实现,这样便于调试和修改,内核只需要改一次。
  2.在模块程序中实现实际的ip数据包的转发:假如ip包来自某个地址,则给这个包加上MAC帧头,然后从把这个包通过dev_queue_xmit()转发到内部局域网。跳过路由,NAT,防火墙等功能模块;在反方向,从A收到的MAC包(通过IP辨认),直接去头转发给ppp设备。
  3.收到A的arp请求(通过 A的MAC地址确认)直接应答。然后丢弃这个arp请求包。
  4.应用程序中读取ppp0的ip地址(就是拨号得到的动态ip),交给模块。
  
  说明:
  1.new_ip_rcv中返回0,表示这个数据包经过了短路处理,内核对这个包不做进一步处理。
  返回1;此包有问题要系统丢弃它;其它,一般数据包,内核应该继续正常处理。
  2.new_arp_rcv中返回0,表示是一般arp包,系统继续正常处理,返回1,系统对此包不作进一步处理。
  3.程序中有许多hardcode的地方,如ppp0,eth0。还有拨号服务器判定数据包是否是A发出的时,用的是IP,可能用MAC地址更合理。
  
  [code]
  
  内核(2.2.20)的修改:
  1. arp.c
  加入:
  int (*arp_rcv_hook)(strUCt sk_buff *skb, struct device *dev, struct packet_type *pt) = 0;
  改:
  …….
  int arp_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt)
  {
  …..
  /*
  * Check for bad requests for 127.x.x.x and requests for multicast
  
  * and in the case of requests for us we add the requester to the arp
  * cache.
  */
  /* Special case: IPv4 duplicate address detection packet (RFC2131) */
  if(arp_rcv_hook && arp_rcv_hook(skb,dev,pt)) /* 大约689行*/
  goto out;
  if (sip == 0) {
  …..
  }
  
  2. ip_input.c
  加入:
  int (*ip_rcv_hook)(struct skb_buff *) = 0;
  改:
  int ip_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt)
  {
  ……
  if(ip_rcv_hook) /* 大约第464行*/
  {
  int retval;
  
  retval = (*ip_rcv_hook)(skb);
  if(retval == 0)
  return 0;
  else if(retval == 1)
  goto drop;
  }
  
  #ifdef CONFIG_FIREWALL
  ……
  }
  
  3. netsyms.c
  加入:
  extern int (*arp_rcv_hook)(struct sk_buff*,struct device *,struct packet_type*);
  EXPORT_SYMBOL_NOVERS(arp_rcv_hook);
  extern int (*ip_rcv_hook)(struct sk_buff*);
  EXPORT_SYMBOL_NOVERS(ip_rcv_hook);
  
  应用程序:
  
  /*conv.c shortcut between adsl and lan device
  * email: jundai20@hotmail.com
  */
  #include
  #include
  #include
  #include
  #include
  #include
  
  #include "conv.h"
  
  int ppp_ipaddr;
  
  MODULE_PARM(ppp_ipaddr,"i");
  /* This our_memcpy it is runs in kernel,
  * so the des, src is equ to phy address
  */
  void our_memcpy(unsigned char* des,unsigned char* src,unsigned int len)
  {
  unsigned int i;
  for(i=0;i *(des+i) = *(src+i);
  }
  
  struct sk_buff* ppp2eth(struct sk_buff* skb)
  {
  unsigned char ethhdr[14] ={0x00,0x06,0x4e,0x00,0x04,0x94,0x00,0xe0,0x4c,0xe0,0xf8,0x35,0x08,0x00};/* change the mac addr pls*/
  struct sk_buff* skb2;
  unsigned int size;
  
  size = skb->len + 14;
  skb2 = alloc_skb(size,GFP_ATOMIC);
  our_memcpy(skb2->data,ethhdr,14);
  our_memcpy(skb2->data+14,skb->data,skb->len);
  skb2->tail += size;
  skb2->len = size;
  __kfree_skb(skb);
  return skb2;
  }
  
  struct sk_buff* eth2ppp(struct sk_buff* skb)
  {
  return skb;
  }
  
  int new_ip_rcv(struct sk_buff *skb)
  {
  struct device* lan_eth,*ppp_h;
  struct sk_buff* skb_new;
  
  lan_eth = dev_get("eth1");
  ppp_h = dev_get("ppp0");
  if(lan_eth == NULL ppp_h == NULL)
  return 0;
  if(skb->dev->name[0] == 'p')
  {
  if(skb->nh.iph->saddr !
= 0x12345678)/* change to the ip addr as you wish*/
  return 3;
  skb_new = ppp2eth(skb);
  skb_new->dev = lan_eth;
  dev_queue_xmit(skb_new);
  return 0;
  }
  else if (skb->dev->name[0] == 'e' && skb->dev->name[3] == '1')
  {
  if(skb->nh.iph->saddr != ppp_ipaddr)
  return 3;
  skb_new = eth2ppp(skb);
  skb_new->dev = ppp_h;
  dev_queue_xmit(skb_new);
  }
  // if we return 1 , we will free skb
  return 0;
  }
  
  int new_arp_rcv(struct sk_buff* skb,struct device* dev,struct packet_type* pt)
  {
  struct arphdr *arp = skb->nh.arph;
  unsigned char *arp_ptr= (unsigned char *)(arp+1);
  unsigned long sip,tip;
  unsigned char* sha;
  
  sha=arp_ptr;
  arp_ptr += dev->addr_len;
  our_memcpy((unsigned char*)(&sip),arp_ptr,4);
  arp_ptr += 4;
  arp_ptr += dev->addr_len;
  our_memcpy((unsigned char*)(&tip),arp_ptr,4);
  if(*sha== 0x00 && *(sha+1) == 0x06 && *(sha+2) == 0x4e && *(sha+3) == 0x00 && *(sha+4) == 0x04 && *(sha+5) == 0x94 && arp->ar_op == __constant_htons(ARPOP_REQUEST))
  {
  arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,dev->dev_addr,sha);
  return 1;
  }
  else
  return 0;
  
  }
  
  int init_module()
  {
  EXPORT_NO_SYMBOLS;
  arp_rcv_hook = new_arp_rcv;
  ip_rcv_hook = new_ip_rcv;
  printk("now enter ipnat : %x...\n",ppp_ipaddr);
  return 0;
  }
  
  void cleanup_module()
  {
  arp_rcv_hook = 0;
  ip_rcv_hook = 0;
  printk("now net_hook will quit.\n");
  }
  
  /* conv.h: head file for conv.c
  * email:jundai20@hotmail.com
  */
  extern int (*ip_rcv_hook)(struct sk_buff *);
  extern int (*arp_rcv_hook)(struct sk_buff *,struct device* dev,struct packet_type* pt);
  extern void arp_send(int type, int ptype, u32 dest_ip,
  struct device *dev, u32 src_ip,
  unsigned char *dest_hw, unsigned char *src_hw, unsigned char *th);
  
  extern struct device* dev_get(const char* name);
  
  extern struct sk_buff * skb_realloc_headroom(struct sk_buff *skb, int newheadroom);
  
  extern void __kfree_skb(struct sk_buff*);
  #ifndef ARPOP_REPLY
  #define ARPOP_REPLY 2
  #endif
  #ifndef ETH_P_ARP
  #define ETH_P_ARP 0x0806
  #endif
  #ifndef GFP_ATOMIC
  #define GFP_ATOMIC 0x08
  #endif
  
  /* passnat.c : user interface for use conv
  * email: jundai20@hotmail.com
  */
  
  #include
  #include
  #include
  #include
  #include
  #include
  
  int main()
  {
  struct ifreq ifr;
  struct sockaddr_in *skt;
  int eth_s;
  unsigned long ip_addr_rtrn;
  unsigned char command[256]={0};
  
  if((eth_s = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
  {
  perror("socket");

  exit(0);
  }
  
  strcpy(ifr.ifr_name, "ppp0");
  
  if(ioctl(eth_s, SIOCGIFADDR, &ifr) < 0);
  
  skt = (struct sockaddr_in*)&ifr.i
上一篇:在Linux下打开32位I/O和DMA 人气:376
下一篇:LILO修复还原 人气:445
浏览全部Oracle教程的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-5 Coppermine Photo Gallery v1.4.
2008-9-5 清松网络日记本 v2.4
2008-9-5 AyWeb企业网站管理系统 v2.3 bui
2008-9-5 美女写真小偷程序联盟 v3.0 buil
2008-9-5 老Y文章管理系统 v2.1
2008-9-5 SiteDynamic企业网站管理系统 v1
2008-9-5 MyCOM企业网站管理系统 v1.0 Bui
2008-9-5 乐风CMS影视版 2008
2008-9-5 幻影电影视频系统TvsCms v1.3 伪
2008-8-23 Mini WinMount V0.4
2008-8-23 Vista优化大师3.11正式版
2008-8-23 Wine 1.13
2008-8-23 KlipFolio 5.0 Build 5899-80
2008-8-23 Windows Sysinternals Desktops
2008-8-23 OneTap Movies1.2破解版
2008-8-23 AnnotaterPDF阅读1.1.503 破解版
2008-8-23 SoundMeter分贝测量仪 v1.0汉化破
2008-8-23 iDrum音乐节拍1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵