首页 > 编程知识 正文

ifconfig命令用不了为什么,ssh反向隧道

时间:2023-05-05 08:35:57 阅读:112969 作者:2608

通常,使用ip命令创建sit隧道设备,如下所示:

# iptunneladdsit1modesitremote 192.168.20.1本地192.168.20.5 # # IP link 5: sit0@ none : noarp MTU 1480 qdiscnoopstatedownmodedefaultgroupdefaultqlen 1000 link/sit0.0.0.0brd0.0.0.0 noarp MTU 1480 qdiscnoopstatedownmodedefaultgroupdefaultqlen 1000 link/sit 192.168.20.5 peer 192.168.20.1也使用ifconfig命令

新创建的sit2设备与ifconfig命令参数sit0无关,只是位于相同的命名空间中。

# ifconfig s it0 tunnel :3360192.168.10.1 siocsifdstaddr 3360 nobufferspaceavailable # # IP link 73360 sit2@ none : poi NNT noarp MTU 1480 qdiscnoopstatedownmodedefaultgroupdefaultqlen 1000 link/sit0.0.0peer 192.168 $ iptunnelsit 03333 ipremoteanylocalanyttl 64 nopmtudisc6rd-prefix 200233603360/16 sit 1: ipv6/IP remote 192.168.20.1 local 192.168.20.5 TTL inherit6rd-prefix 200233603360/16 sit 2: ipv6/IP remote 192.168.1110 16ifconfig子命令tunnel使用ioctl控制字SIOCSIFDSTADDR将数据分发到内核,并使用函数inet6(通过

intinet6_ ioctl (structsocket * sock,unsigned int cmd,unsigned long arg ) {void__user*argp=) void _ u u u user * } sructnet*net=sock_net(sk; sitch(cmd ) casesiocsifdstaddr 3360 returnaddrconf _ set _ dstaddr (net,argp ); ifconfig参数中的设备(sit0 )的要求必须为ARPHRD_SIT,如以下addrconf_set_dstaddr函数所示:

/* * setdestinationaddress.* specialcaseforsitinterfaceswherewecreateanew ' virtual ' device.*/intaddrconf _ set _ dsseate int err=-ENODEV; if (! is_enabled(config_ipv6_sit ) ) return -ENODEV; if(copy_from_user(ireq,arg,sizeof ) structin6_ifreq ) )返回故障; rtnl_lock (; dev=__dev_get_by_index(net,ireq.ifr6_ifindex ); if(devdev-type==arphrd_sit ) err=addr conf _ set _ sit _ dstaddr (net,dev,ireq ); rtnl_unlock (; 返回错误; 隧道参数仅设置有目标地址daddr、版本版本、IP标头长度ihl和协议(41,TTL值64 )。 ndo_tunnel_ctl执行隧道添加操作,然后根据返回的隧道名称搜索设备,如果有错误则返回ENOBUFS。 也就是说,虽然是上述的ifconfig错误(后述),但是隧道已经创建完毕。 仅dev_open未运行,隧道处于down状态。

ifconfig配置的远程地址必须是与IPv4兼容的IPv6地址,您可以从中检索IPv4地址。

staticintaddrconf _ set _ sit _ dstaddr (结构net * net,结构net _ device * dev,结构in6 _ ifreq * ireq ) {结构(ipv6_addr_type(ireq-IFR6_addr ) IPV6_ADDR_COMPATv4 ) )返回地址; p.iph.daddr=ireq-IFR6_ addr.S6 _ addr 32 [3]; p.iph.version=4; p.iph.ihl=5; p.iph.protocol=IPPROTO_IPV6; p.iph.ttl=64; if (! dev-netdev_ops-ndo_tunnel_ctl ) return -EOPNOTSUPP; err=dev-netdev _ ops-ndo _ tunnel _ CTL (dev,p,SIOCADDTUNNEL ); if(err )返回错误; dev=__dev_get_by_name(net,p.name ); if (! dev )返回无缓冲区; 返回dev _ open (dev,NULL ); 对于sit模块,注册的ioctl命令是ipip6_tunnel_ctl,隧道添加操作由函数ipip6_tunnel_add实现。

staticconststructnet _ device _ ops ipip6_ netdev _ ops={ . ndo _ tunnel _ CTL=ipip6_ tunnel _ CTL,}; staticintipip6_ tunnel _ CTL (结构net _ device * dev,struct ip_tunnel_parm *p,int cmd ) switch ) cmd ) cassion 函数ipip6_tunnel_locate检查是否存在相同的隧道,并返回现有隧道结构以供真实使用。 如果不存在,请创建新隧道。 如果创建失败,也会返回错误ENOBUFS。

staticintipip6_ tunnel _ add (struct net _ device * dev,struct ip_tunnel_parm *p ) structIP_tunnel*t=netddel if(err )返回错误; t=ipip6_tunnel_locate(t-net,p,1 ); if (! t )返回无缓冲区; 返回0; 由于在ifconfig配置期间未指定隧道名称,parms-name为空,将使用系统自动分配的名称“sit%d”在隧道设备注册完成后进行完整命名。 但是,函数最后不更新parms-name的值,仍然为空。

因此,在上述函数addrconf_set_sit_dstaddr中,即使基于parms-name搜索设备,也一定找不到该设备。

staticstructip _ tunnel * ipip6_ tunnel _ locate (struct net * net,struct ip_tunnel_parm *parms,int create )…。 dev_valid_name(parms-name ) ) goto failed; strlcpy(name,parms-name,IFNAMSIZ ); }else{strcpy(name,' sit%d ' ); }dev=alloc_netdev(sizeof(t ) name,NET_NAME_UNKNOWN,ipip6_tunnel_setup ); if (! dev )返回空值; dev_net_set(dev,net ); nt=netdev_priv(dev ); nt-parms=*parms; if(ipip6_tunnel_create(dev )0) goto failed_free; 这种创建sit隧道的方法应该已经过时了。

内核版本5.10

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。