內容參考鏈接:http://blog.csdn.net/wangzhen209/article/details/39344703
1)內核配置:
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 網絡搭建
通過向防火牆提供有關對來自某個源、到某個目的地或具有特定協議類型的信息包要做些什么的指令,規則控制信息包的過濾。 通過使用 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 3INPUT
鏈刪除規則,它指定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 ! ICMPTCP
和UDP
信息包都將與該規則匹配。 通過指定! ICMP
,我們打算允許所有其它協議(在這種情況下是TCP
和UDP
), 而將ICMP
排除在外。-s
或--source
: 該源匹配用於根據信息包的源 IP 地址來與它們匹配。該匹配還允許對某一范圍內的 IP 地址進行匹配,可以使用!
符號,表示不與該項匹配。缺省源匹配與所有 IP 地址匹配。
示例:
第二條命令指定該規則與所有來自 192.168.0.0 到 192.168.0.24 的 IP 地址范圍的信息包匹配。第三條命令指定該規則將與 除來自源地址 203.16.1.89 外的任何信息包匹配。$ 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-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 腳本中。