Linux Ethernet Over Usb

内容参考链接:http://blog.csdn.net/wangzhen209/article/details/39344703

1)内核配置:  

一般象PC机充当USB Host角色,带USB Host的接口的Linux开发板也可以充当这个角色.
如果是LINUX主机,需要安装安装 rndis_host.ko 这个驱动。一般发行版均已经编译好,直接运行即可。
如果嵌入式开发板可以配置内核的rndis_host为动态模块

Location: 

 -> Device Drivers                                             

-> Network device support (NETDEVICES [=y])                   

-> USB Network Adapters │

-> Multi-purpose USB Networking Framework (USB_USBNET [=m])

-> Host for RNDIS and ActiveSync devices

在USB的另一端,一般是嵌入式设备,以嵌入式LINUX为例,需要安装USB Gadget驱动g_ether.ko 来进行通讯。g_ether.ko在配置菜单位置如下

Location: 

│ -> Device Drivers │

│ -> USB support (USB_SUPPORT [=y]) │

│ -> USB Gadget Support (USB_GADGET [=y]) │

│ -> USB Gadget Drivers (<choice> [=m]) │

│ -> Ethernet Gadget (with CDC Ethernet support) (USB_ETH [=n │

2)结束内核配置

make

3)Linux USB 网络搭建

modprobe rndis_host
它将安装 rndis_host.ko和usbnet.ko
 
ifconfig usb0 192.168.3.1 up
 
在主机端做类似配置,配成另一个IP即可
 
ifconfig usb0 192.168.3.2 up
 
 4)建立规则和链

通过向防火墙提供有关对来自某个源、到某个目的地或具有特定协议类型的信息包要做些什么的指令,规则控制信息包的过滤。 通过使用 netfilter/iptables 系统提供的特殊命令 iptables ,建立这些规则,并将其添加到内核空间的特定信息包过滤表内的链中。关于添加/除去/编辑规则的命令的一般语法如下:

$ iptables [-t table] command [match] [target]

 配置Linux 内核并利用iptables 做端口映射的具体工作如下:

  主机 IP:192.168.1.100

  目标机 IP:192.168.2.101

  要求将到主机 192.168.1.100:11101 的请求映射到内部网目标机的 sshd 服务端口上,即:192.168.2.101:22。

  配置Linux内核(以 2.6.18 为例)

  如果执行 iptable -L 出现以下信息,那么就需要重新配置和编译内核:

  iptables v1.4.2: can't initialize iptables table `filter': Table does not exist (do you need to insmod?)

  Perhaps iptables or your kernel needs to be upgraded.

  配置选项:

  Networking —->

  Networking options —->

  [*] Network packet filtering (replaces ipchains) —>

  Core Netfilter Configuration —>

  <*> Netfilter Xtables support (required for ip_tables)

  IP: Netfilter Configuration —>

  <*> Connection tracking (required for masq/NAT)

  <*> IP tables support (required for filtering/masq/NAT)

  <*> IP range match support

  <*> Packet filtering

  <*> REJECT target support

  <*> Full NAT

  以上配置只为端口映射准备,如果需要其它功能,请根据需要增加相关的配置。

  编译安装内核步骤略过。

  iptabes

  iptables 规则如下:

  iptables -t nat -A PREROUTING -p tcp –dport 11101 -d 192.168.1.100 -j DNAT –to-destination 192.168.2.101:22

  查看 iptables 规则定义:

  # iptables -t nat -L

  Chain PREROUTING (policy ACCEPT)

  target prot opt source destination

  DNAT tcp – anywhere 192.168.1.100 tcp dpt:11101 to:192.168.2.101:22

  Chain POSTROUTING (policy ACCEPT)

  target prot opt source destination

  Chain OUTPUT (policy ACCEPT)

  target prot opt source destination

  ip_forward

  除此之外,需要在主机上打开 ip 转发以保持连接通道。

  查看是否已打开 ip 转发(1 表示打开):

  cat /proc/sys/net/ipv4/ip_forward

  如果未打开,则用以下命令打开:

  echo 1 > /proc/sys/net/ipv4/ip_forward

  保存设置

  以上 iptables 设置和 ip 转发设置在重启系统之后就会消失,因此如果有需要,请将设置保存。

  保存 iptables 设置:

  /etc/init.d/iptables save

  设置系统启动时自动加载 iptables 设置(以 gentoo 为例):

  rc-update add iptables default

  保存 ip_forward 设置(在 /etc/sysctl.conf 中设置):

  net.ipv4.ip_forward = 1

  安全隐患

  在打开了 ip_forward 后,一般要同时打开 rp_filter (Reverse Path filter),对数据包的源地址进行检查。

  如果在没有打开这个设置,就很容易受到来自内部网的 IP 欺骗。

  打开 rp_filter:

  for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 1 > $f ; done

  保存设置(在 /etc/sysctl.conf 中设置):

  net.ipv4.conf.default.rp_filter = 1

  net.ipv4.conf.all.rp_filter = 1

  测试

  root@192.168.1.100 -p 11101

  是不是能够连接到 192.168.2.101 主机上了?

  共享上网测试成功的命令:

iptables -t nat -A POSTROUTING -s 192.168.3.0/255.255.255.0 -o mlan0 -j MASQUERADE

当执行此条命令 -j MASQUERADE 出现“iptables: No chain/target/match by that name.” 错误, 原因是内核配置需要打开,MASQUERADE target support.

 IP: Netfilter Configuration —>

  <*> Connection tracking (required for masq/NAT)

  <*> IP tables support (required for filtering/masq/NAT)

  <*>   IPv4 NAT 

  <*>    MASQUERADE target support 

iptables -t nat -A POSTROUTING -s 192.168.3.0/255.255.255.0 -o mlan0 -j SNAT --to-source 10.1.66.248     WIFI client模式联网

iptables -t nat -A POSTROUTING -s 192.168.100.0/255.255.255.0 -o ppp0 -j SNAT --to-source 10.161.199.203  3G拨号联网

备注:内网客户端的DNS地址一定要设置外围的DNS服务器地址

  如何是WIN7 64位驱动的安装方法参考:http://geekswithblogs.net/WindowsEmbeddedCookbook/archive/2010/08/31/installing-windows-ce-6.0-tools-on-a-windows7-64bit-pc.aspx

表(table)

[-t table] 选项允许使用标准表之外的任何表。表是包含仅处理特定类型信息包的规则和链的信息包过滤表。 有三种可用的表选项:filter 、 nat 和 mangle 。该选项不是必需的,如果未指定, 则 filter 用作缺省表。

filter 表用于一般的信息包过滤,它包含 INPUT 、 OUTPUT 和 FORWARD 链。nat 表用于要转发的信息包,它包含 PREROUTING 、 OUTPUT 和POSTROUTING 链。 如果信息包及其头内进行了任何更改,则使用 mangle 表。 该表包含一些规则来标记用于高级路由的信息包,该表包含PREROUTING 和 OUTPUT 链。

注:PREROUTING 链由指定信息包一到达防火墙就改变它们的规则所组成,而 POSTROUTING 链由指定正当信息包打算离开防火墙时改变它们的规则所组成。

命令(command)

上面这条命令中具有强制性的 command 部分是 iptables 命令的最重要部分。 它告诉 iptables 命令要做什么,例如,插入规则、将规则添加到链的末尾或删除规则。 以下是最常用的一些命令:

  • -A 或 --append : 该命令将一条规则附加到链的末尾。 
    示例:

    $ iptables -A INPUT -s 205.168.0.1 -j ACCEPT

    该示例命令将一条规则附加到 INPUT 链的末尾,确定来自源地址 205.168.0.1 的信息包可以 ACCEPT 。
  • -D 或 --delete : 通过用 -D 指定要匹配的规则或者指定规则在链中的位置编号,该命令从链中删除该规则。 下面的示例显示了这两种方法。 
    示例:

    $ iptables -D INPUT --dport 80 -j DROP 
    $ iptables -D OUTPUT 3

    第一条命令从 INPUT 链删除规则,它指定 DROP 前往端口 80 的信息包。第二条命令只是从 OUTPUT 链删除编号为 3 的规则。
  • -P 或 --policy : 该命令设置链的缺省目标,即策略。 所有与链中任何规则都不匹配的信息包都将被强制使用此链的策略。 
    示例:

    $ iptables -P INPUT DROP

    该命令将 INPUT 链的缺省目标指定为 DROP 。这意味着,将丢弃所有与 INPUT 链中任何规则都不匹配的信息包。
  • -N 或 --new-chain : 用命令中所指定的名称创建一个新链。 
    示例:

    $ iptables -N allowed-chain

  • -F 或 --flush : 如果指定链名,该命令删除链中的所有规则, 如果未指定链名,该命令删除所有链中的所有规则。此参数用于快速清除。 
    示例:

    $ iptables -F FORWARD 
    $ iptables -F

  • -L 或 --list : 列出指定链中的所有规则。 
    示例:

    $ iptables -L allowed-chain

匹配(match)

iptables 命令的可选 match 部分指定信息包与规则匹配所应具有的特征(如源和目的地地址、协议等)。 匹配分为两大类: 通用匹配和 特定于协议的匹配。这里,我将研究可用于采用任何协议的信息包的通用匹配。 下面是一些重要的且常用的通用匹配及其示例和说明:

  • -p 或 --protocol : 该通用协议匹配用于检查某些特定协议。 协议示例有 TCP 、 UDP 、 ICMP 、用逗号分隔的任何这三种协议的组合列表以及 ALL (用于所有协议)。 ALL 是缺省匹配。可以使用 ! 符号,它表示不与该项匹配。 
    示例:

    $ iptables -A INPUT -p TCP, UDP 
    $ iptables -A INPUT -p ! ICMP

    在上述示例中,这两条命令都执行同一任务 — 它们指定所有 TCP 和 UDP 信息包都将与该规则匹配。 通过指定 ! ICMP ,我们打算允许所有其它协议(在这种情况下是 TCP 和 UDP ), 而将 ICMP 排除在外。
  • -s 或 --source : 该源匹配用于根据信息包的源 IP 地址来与它们匹配。该匹配还允许对某一范围内的 IP 地址进行匹配,可以使用 ! 符号,表示不与该项匹配。缺省源匹配与所有 IP 地址匹配。 
    示例:

    $ iptables -A OUTPUT -s 192.168.1.1 
    $ iptables -A OUTPUT -s 192.168.0.0/24 
    $ iptables -A OUTPUT -s ! 203.16.1.89

    第二条命令指定该规则与所有来自 192.168.0.0 到 192.168.0.24 的 IP 地址范围的信息包匹配。第三条命令指定该规则将与 除来自源地址 203.16.1.89 外的任何信息包匹配。
  • -d 或 --destination : 该目的地匹配用于根据信息包的目的地 IP 地址来与它们匹配。 该匹配还允许对某一范围内 IP 地址进行匹配,可以使用 ! 符号,表示不与该项匹配。 
    示例:

    $ iptables -A INPUT -d 192.168.1.1 
    $ iptables -A INPUT -d 192.168.0.0/24 
    $ iptables -A OUTPUT -d ! 203.16.1.89

目标(target)

我们已经知道,目标是由规则指定的操作,对与那些规则匹配的信息包执行这些操作。 除了允许用户定义的目标之外,还有许多可用的目标选项。下面是常用的一些目标及其示例和说明:

  • ACCEPT : 当信息包与具有 ACCEPT 目标的规则完全匹配时, 会被接受(允许它前往目的地),并且它将停止遍历链(虽然该信息包可能遍历另一个表中的其它链,并且有可能在那里被丢弃)。 该目标被指定为 -j ACCEPT 。
  • DROP : 当信息包与具有 DROP 目标的规则完全匹配时,会阻塞该信息包,并且不对它做进一步处理。 该目标被指定为 -j DROP 。
  • REJECT : 该目标的工作方式与 DROP 目标相同,但它比 DROP 好。和 DROP 不同, REJECT 不会在服务器和客户机上留下死套接字。 另外, REJECT 将错误消息发回给信息包的发送方。该目标被指定为 -j REJECT 。 
    示例:

    $ iptables -A FORWARD -p TCP --dport 22 -j REJECT

  • RETURN : 在规则中设置的 RETURN 目标让与该规则匹配的信息包停止遍历包含该规则的链。 如果链是如 INPUT 之类的主链,则使用该链的缺省策略处理信息包。 它被指定为 -jump RETURN 。示例:

    $ iptables -A FORWARD -d 203.16.1.89 -jump RETURN

还有许多用于建立高级规则的其它目标,如 LOG 、 REDIRECT 、 MARK 、 MIRROR 和 MASQUERADE 等。

保存规则

现在,您已经学习了如何建立基本的规则和链以及如何从信息包过滤表中添加或删除它们。 但是,您应该记住:用上述方法所建立的规则会被保存到内核中,当重新引导系统时,会丢失这些规则。 所以,如果您将没有错误的且有效的规则集添加到信息包过滤表,同时希望在重新引导之后再次使用这些规则, 那么必须将该规则集保存在文件中。可以使用 iptables-save命令来做到这一点:

$ iptables-save > iptables-script

现在,信息包过滤表中的所有规则都被保存在文件 iptables-script 中。无论何时再次引导系统, 都可以使用 iptables-restore命令将规则集从该脚本文件恢复到信息包过滤表,如下所示:

$ iptables-restore iptables-script

如果您愿意在每次引导系统时自动恢复该规则集,则可以将上面指定的这条命令放到任何一个初始化 shell 脚本中。

原文地址:https://www.cnblogs.com/chunqiao/p/5431675.html