linux双网卡配置数据包转发

Version 1.0


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就要从两方面来着手:

  1. 内核支持netfilter

  2. 用户层的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的配置和使用

  • 下载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访问外网。