linux双网卡配置数据包转发
1. 概述¶
本文主要介绍使用iptables实现linux平台下NAT功能。在传统的标准的TCP/IP通信过程中,所有的路由器仅仅是充当一个中间人的角色,也就是通常所说的存储转发,路由器并不会对转发的数据包进行修改,更为确切的说,除了将源MAC地址换成自己的MAC地址以外,路由器不会对转发的数据包做任何修改。
2. NAT简介¶
NAT(Network Address Translation)是出于某种特殊需要而对数据包的源ip地址、目的ip地址、源端口、目的端口进行改写的操作。将内网数据包中的地址信息更改成统一的对外地址信息,不让内网主机直接暴露在因特网上,保证内网主机的安全,同时,该功能也常用来实现共享上网。
当IP包经过NAT网关时,NAT Gateway会将IP包的源IP转换为NAT Gateway的公共IP并转发到公共网,此时IP包(Dst=202.20.65.4,Src=202.20.65.5)中已经不含任何私有网IP的信息。由于IP包的源IP已经被转换成NAT Gateway的公共IP,Web Server发出的响应IP包(Dst= 202.20.65.5,Src=202.20.65.4)将被发送到NAT Gateway。
Netfilter/IPTables是Linux2.4.x之后引入的一个子系统,其重要工具模块IPTables从用户态的iptables连接到内核态的Netfilter的架构中,Netfilter与IP协议栈是无缝契合的,并允许使用者对数据报进行过滤、地址转换(NAT)、处理等操作。iptables是一个应用程序,可以对netfilter进行配置(包过滤规则,NAT等等)。
图中直观的反应了用户空间的iptables和内核空间的基于Netfilter的ip_tables模块之间的关系和其通讯方式,以及Netfilter在这其中所扮演的角色。
所以在linux平台要实现NAT就要从两方面来着手:
-
内核支持netfilter
-
用户层的iptables配置命令
3. 配置编译内核¶
make menuconfig Linux Kernel Configuration -> Networking support -> Networking options -> Network packet filtering framework(netfilter) -> Core netfilter configuration -> Netfilter connection tracking support -> NetBIOS name service protocal support -> Netfilter Xtables support (required for ip_tables)
Linux Kernel Configuration -> Networking support -> Networking options -> Network packet filtering framework(netfilter) -> IP: Netfilter Configuration -> IPv4 connection tracking support (require for NAT) -> IPv4 NAT -> IP tables support (required for filtering/masq/NAT) -> iptables NAT support ->MASQUERADE target support ->NETMAP target support ->REDIRECT target support -> raw table support (required for NOTRACK/TRACE)
4. iptables的配置和使用¶
-
download iptables
https://git.netfilter.org/iptables/
git clone git://git.netfilter.org/iptables
-
配置
./configure --enable-static --disable-shared --prefix=$PWD/bin CC=/home/wenshuai.xi/bin/arm-linux-gnueabihf-gcc --host=arm-linux-gnueabihf --disable-nftables --enable-static --disable-shared //指定静态编译 --prefix=$PWD/bin //指定make install后的安装目录,这里设置为当前目录下的bin目录 CC //指定toolchain路径
-
编译
make;
-
安装
make install;
编译出来的文件在当前路径下的bin/sbin里,最终文件是xtables-legacy-multi,但是不能直接运行xtables-legacy-multi,必须建立软连接或者重命名为iptables。
iptables命令基本参数和用法:
iptables –[A|I 链] [-i|o 网络接口] [-p 协议] [-s 来源ip/网域] [-d 目标ip/网域] –j[ACCEPT|DROP]
参数 | 作用 |
---|---|
-P | 设置默认策略:iptables -P INPUT (DROP|ACCEPT) |
-F | 清空规则链 |
-L | 查看规则链 |
-A | 在规则链的末尾加入新规则 |
-I num | 在规则链的头部加入新规则 |
-D num | 删除某一条规则 |
-s | 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。 |
-d | 匹配目标地址 |
-i 网卡名称 | 匹配从这块网卡流入的数据 |
-o 网卡名称 | 匹配从这块网卡流出的数据 |
-p | 匹配协议,如tcp,udp,icmp |
--dport num | 匹配目标端口号 |
--sport num | 匹配来源端口号 |
执行 ./iptables -t nat -L
查看当前NAT表
5. 应用实例¶
A机器配有两个网卡:
eth0,接外网,IP地址:172.19.24.108
eth1,接内网,IP地址:192.19.24.2
配置路由表如下:
B机器有一个网卡usb0配置IP地址为:192.19.24.3,配置网关为:192.19.24.2
route add default gw 192.19.24.2
路由表如下:
打开IP转发:
echo 1 > /proc/sys/net/ipv4/ip_forward
把所有发往“192.19.24.0 ”的请求,都转发到外网:
./iptables -t nat -A POSTROUTING -s 192.19.24.0/24 -j MASQUERADE ./iptables -t nat -L
配置完成,此时B机器即可通过A机器eth0访问外网。