2. 网络配置

2.1. 以太网口通用参数配置

2.1.1. 查看以太网通用参数

以太网的通用参数包括:自协商,双工模式和接口速率

ethtool eth0

2.1.2. 配置以太网通用参数

2.1.2.1. 打开或关闭自协商

ethtool -s port_name autoneg { on | off }

2.1.2.2. 修改双工模式

ethtool -s port_name duplex { half | full }

注意:

  • 当以太网接口工作在自协商模式时,缺省情况下双工模式是和对端接口协商得到的。

  • 当以太网接口工作在非自协商模式时,缺省情况下双工模式为全双工模式。

2.1.2.3. 修改速率

ethtool -s port_name speed { 10 | 100 | 1000 }

注意:

  • 当以太网接口工作在自协商模式时,缺省情况下接口速率是和对端接口协商得到的。

  • 当以太网接口工作在非自协商模式时,缺省情况下接口速率为接口支持的最大接口速率。

2.1.3. 配置举例

手动设置 eth0 的接口速率为 100,工作在全双工模式下。

ethtool -s eth0 autoneg off
ethtool -s eth0 speed 100
ethtool -s eth0 duplex full

2.2. 使用Netplan管理网络

Netplan 是一个用于在 linux 系统上轻松配置网络的实用程序。您只需创建所需网络接口的 YAML 描述以及每个应配置的功能。根据此描述,Netplan 将为您选择的渲染器工具生成所有必要的配置。在Ubuntu18.04及其以上版本进行了支持。

2.2.1. 配置

要配置 netplan,请/etc/netplan/使用.yaml扩展名(例如/etc/netplan/config.yaml)保存配置文件,然后运行sudo netplan apply. 此命令解析配置并将其应用于系统。

注意:

  • 如果 netplan apply 报错,说明您的yaml配置文件未被系统支持,请仔细检查

  • 对于以太网口,必须保证有网线接入,并且网卡灯闪烁,才能保证Netplan配置生效

下面根据最常使用的工作场景进行配置,需要更多的配置案例教程,请阅读netplan官方实例

2.2.2. 基础配置

Netplan支持networkd和NetworkManager两种网络后端,一般为networkd

network:
  version: 2
  renderer: networkd

如果不存在networkd,可以使用NetworkManager,都是一样的。

network:
  version: 2
  renderer: NetworkManager

2.2.3. 以太网连接:动态IP

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: yes
    eth1:
      dhcp4: yes

2.2.4. 以太网连接:静态IP

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      addresses:
        - 10.10.10.3/24
      nameservers:
        addresses: [202.96.128.86]
      routes:
        - to: 0.0.0.0/0
          via: 10.10.10.1
    
    eth1:
      addresses:
        - 10.10.10.2/24
      nameservers:
        addresses: [202.96.128.86]
      routes:
        - to: 0.0.0.0/0
          via: 10.10.10.1

2.2.5. WIFI连接:静态IP

network:
  version: 2
  renderer: networkd
  wifis:
    wlan0:
      dhcp4: no
      dhcp6: no
      addresses: [192.168.1.200/24]
      nameservers:
        addresses: [202.96.128.86]
      access-points:
        "NETGEAR25":
            password: "ceshizhuanyong"
      routes:
        - to: 0.0.0.0/0
          via: 192.168.1.1

2.2.6. WIFI连接:动态IP

network:
  version: 2
  renderer: networkd
  wifis:
    wlan0:
      dhcp4: yes
      access-points:
        "NETGEAR25":
            password: "ceshizhuanyong"

2.3. 使用nmcli管理网络

nmcli是用来管理NetworkManager网络连接的命令行工具

2.3.1. 常用命令

  • 显示所有连接

    nmcli connection show
    
  • 显示连接信息

    nmcli connection show connection_name
    
  • 显示网络设备列表、其状态以及使用该设备的连接

    nmcli device
    
  • 激活连接

    nmcli connection up connection_name
    
  • 取消激活连接

    nmcli connection down connection_name
    
  • 删除连接

    nmcli connection del connection_name
    

2.3.2. 以太网连接:静态IP

假设进行配置以太网网卡为eth0,IP为192.168.1.10/24,默认网关为192.168.1.1,DNS服务器为202.96.128.86

  1. 为以太网连接添加新的连接

    nmcli connection add con-name Example-Connection ifname eth0 type ethernet
    
  2. 设置 IPv4 地址

    nmcli connection modify Example-Connection ipv4.addresses 192.168.1.10/24
    
  3. 将 IPv4 连接方法设置为 manual

    nmcli connection modify Example-Connection ipv4.method manual
    
  4. 设置 IPv4 默认网关

    nmcli connection modify Example-Connection ipv4.gateway 192.168.1.1
    
  5. 设置 IPv4 DNS 服务器地址

    nmcli connection modify Example-Connection ipv4.dns "202.96.128.86"
    
  6. 激活连接

    nmcli connection up Example-Connection
    

2.3.3. 以太网连接:动态IP

  1. 为以太网连接添加新的连接

    nmcli connection add con-name Example-Connection ifname eth0 type ethernet
    
  2. 激活连接

    nmcli connection up Example-Connection
    

2.3.4. WIFI连接:动态IP

  1. 确保 WiFi 被启用(默认)

    nmcli radio wifi on
    
  2. 刷新可用的 Wi-Fi 连接列表:

    nmcli device wifi rescan
    
  3. 查看可用的 Wi-Fi 接入点:

    nmcli dev wifi list
    
    IN-USE  SSID      MODE   CHAN  RATE        SIGNAL  BARS  SECURITY
    ...
            MyCafe    Infra  3     405 Mbit/s  85      ▂▄▆█  WPA1 WPA2
    
  4. 使用 nmcli 连接到 Wi-Fi 连接:

    nmcli dev wifi connect SSID-Name password wireless-password
    

    例如:

    nmcli dev wifi connect MyCafe password wireless-password
    

    请注意,如果要禁用 Wi-Fi 状态:

    nmcli radio wifi off
    

2.4. 快速创建无线AP热点

2.4.1. 对无线热点的IP局域网段无要求

在这种情况下,只需要使用nmcli命令创建一个无线AP热点即可:

nmcli device wifi hotspot ifname wlan0 con-name MyHostspot ssid MyHostspotSSID password 12345678

说明:

  • con-name:连接名称:这里设置为MyHostspot(可自定义)

  • ssid:创建的AP热点的名称:这里设置为MyHostspotSSID(可自定义)

  • password:创建的AP热点的密码:这里设置为12345678(可自定义)

2.4.2. 对无线热点的IP局域网段有要求

请阅读章节《创建桥接无线AP》

2.5. 创建桥接无线AP热点

2.5.1. 功能需求

假设有一局域网,网段为10.10.0.0,掩码为255.255.255.0。Firefly的开发板,以下简称Firefly Board,其网口通过路由器Router,获取到本局域网内的动态IP地址:为10.10.0.2

需求:将系统配置成软路由,具体要求如下:

(1)Firefly Board开启一个无线AP热点,平板和手机等外设通过该无线AP热点访问网络,进行上网。

(2)Firefly Board开启的无线热点局域网为:192.168.4.1

(3)Firefly Board如果有多个网口,要求eth0作为WAN口功能,自动从路由器获取IP地址,eth1作为LAN口功能,能够为接入的设备分配192.168.4.0/24网段的IP地址。

网络拓扑如下:

_images/wifi-bridge-topology.png

2.5.2. 安装管理AP热点必要的软件包

安装hostapdhostapd可以用来模拟软AP,所以是实现该功能必须的:

apt install hostapd

允许hostapd开机启动,这样重启之后无线AP热点会自动打开

systemctl unmask hostapd
systemctl enable hostapd

安装isc-dhcp-serverisc-dhcp-server用于为接入无线AP的设备自动分配IP地址和DNS服务器地址

apt install isc-dhcp-server 

允许isc-dhcp-server开启启动

systemctl enable isc-dhcp-server 

安装netfilter-persistent iptables-persistent:用于保存防火墙规则

apt install netfilter-persistent iptables-persistent

安装bridge-utils:用于创建虚拟网桥

apt install bridge-utils

2.5.3. 配置Netplan

目的是创建网桥br0,网桥IP为192.168.4.1。允许系统eth0网卡分配IP地址,禁止系统为eth1网卡分配IP地址,将eth1网卡绑定到网桥br0

假设netplan的配置文件为:/etc/netplan/netplan.yaml,内容如下所示:

network:
        version: 2
        renderer: networkd
        ethernets:
                eth0:
                        dhcp4: yes
                eth1:
                        dhcp4: no

        bridges:
                br0:
                        dhcp4: no
                        addresses:
                                - 192.168.4.1/24
                        interfaces:
                                - eth1

接着运行如下命令启用网络配置:

netplan apply

2.5.4. 配置hostapd

创建一个hostapd.conf配置文件,用来设置无线热点的名称,密码,信道等属性

vim /etc/hostapd.conf

在其中写入如下内容:

country_code=CN
interface=wlan0
bridge=br0
ssid=Example-Wifi-Name
hw_mode=g
channel=11
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

重要参数说明:

  • country_code:国家码,中国使用CN

  • interface:开启无线AP热点的无线网卡

  • bridge:绑定到br0网桥,使得无线AP热点和以太网口在同一个局域网内

  • hw_mode:设置无线模式

  • channel:信道

  • ssid:无线AP名称,这里设置Example-Wifi-Name

  • wpa_passphrase:无线AP密码,这里设置为12345678

关于更多,hostapd.conf的配置无疑是非常复杂的,hw_mode支持的模式有a,gchannel信道与hw_modecountry_code等都有关系,这里不再展开。如果需要对这些无线参数进行更自动化且紧密的配置,可以使用OpenWRT软路由系统来代替Ubuntu系统。

接下来,需要配置hostapd的全局配置文件

vim /etc/default/hostapd

取消DAEMON_CONF的注释,设置它的值为上面创建的/etc/hostapd.conf

# Defaults for hostapd initscript
# 
# See /usr/share/doc/hostapd/README.Debian for information about alternative
# methods of managing hostapd.
#
# Uncomment and set DAEMON_CONF to the absolute path of a hostapd configuration
# file and hostapd will be started during system boot. An example configuration
# file can be found at /usr/share/doc/hostapd/examples/hostapd.conf.gz
#
DAEMON_CONF="/etc/hostapd.conf"

# Additional daemon options to be appended to hostapd command:-
#       -d   show more debug messages (-dd for even more)
#       -K   include key data in debug messages
#       -t   include timestamps in some debug messages
#
# Note that -B (daemon mode) and -P (pidfile) options are automatically
# configured by the init.d script and must not be added to DAEMON_OPTS.
#
#DAEMON_OPTS=""

重启hostapd服务

systemctl restart hostapd

到此,已经可以通过手机等设备,查看到有一个无线AP热点开启,名称为“Example-Wifi-Name”,但是连接之后无法为设备分配IP地址,设备会立即断开。

2.5.5. 配置isc-dhcp-server

isc-dhcp-server 作为一个dhcp服务器,为接入无线AP节点的设备,比如拓扑图中的Laptop1Laptop2自动分配IP地址和DNS服务器地址。

编辑/etc/dhcp/dhcpd.conf

vim /etc/dhcp/dhcpd.conf

用如下内容进行替换:

# 为设备指定DNS地址,多个DNS使用","隔开
option domain-name-servers 202.96.128.86,202.96.128.166,8.8.8.8,114.114.114.114;
default-lease-time 600;
max-lease-time 7200;
ddns-update-style none; ddns-updates off;

subnet 192.168.4.0 netmask 255.255.255.0 {
    range 192.168.4.2 192.168.4.200;
    option routers 192.168.4.1;
    option broadcast-address 192.168.4.255;
    option subnet-mask 255.255.255.0;
}

重要参数说明:

  • domain-name-servers:DNS服务器地址列表,为接入192.168.4.0/24网段的设备,分配DNS

  • subnet 192.168.4.0 netmask 255.255.255.0:定义子网网段192.168.4.0/24

  • range 192.168.4.2 192.168.4.200:分配的IP地址范围

  • option routers 192.168.4.1:默认路由

  • option broadcast-address 192.168.4.255:广播地址

  • option subnet-mask 255.255.255.0:子网掩码

重启isc-dhcp-server,让配置生效:

systemctl restart isc-dhcp-server

2.5.6. 开启IP转发

经过如上内容的配置,接入eth1的设备,和连接入无线AP热点的设备,都能获取到192.168.4.0/24网段的IP,且都能ping通192.168.4.1,也可以查看到设备获取到的DNS服务器地址。但是设备还无法访问internet。

开启IP转发

sysctl -w net.ipv4.ip_forward=1

设置MASQUERADE(地址欺骗)。MASQUERADESNAT作用大致一样,MASQUERADE不用指定明确的IP,会动态的将报文的源地址修改为指定网卡上可用的IP地址。

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

注意,这里指定为eth0,让Firefly Board所有的IP包全部转发到eth0,让外设能够进行上网,这里也可以指定为任何能访问外网的网卡,比如4G网卡usb0wwan0,举一反三。

现在保存 IPv4(包括上面的规则)和 IPv6 的当前防火墙规则,以便在启动时由 netfilter-persistent 服务加载:

netfilter-persistent save

2.6. 使用ip和netplan配置IP地址和路由

2.6.1. 静态IP地址配置

一个网口接口上可以同时配置多个IP地址,这些IP地址可以属于同一网络,也可以不属于同一网络。第一个配置的IP地址默认为接口的主IP地址,后面配置的IP地址为接口的从IP地址。

2.6.1.1. 常用的IP配置命令:

// 设置接口的 IP 地址
ip address add PREFIX [ broadcast ADDR ] dev IFNAME

// 删除接口的 IP 地址
ip address del PREFIX dev IFNAME

// 查看接口的 IP 地址
ip address show/list [ dev IFNAME ]

// 清空接口的所有 IP 地址
ip address flush [ dev IFNAME ]

2.6.1.2. 配置举例:

为 eth0 接口配置主IP:192.168.2.2,从IP:192.168.2.3

  • 临时配置

    ip address add 192.168.2.2/24 dev eth0
    ip address add 192.168.2.3/24 dev eth0
    
  • 持久化配置:使用Netplan

    network:
      version: 2
      renderer: networkd
      ethernets:
        eth0:
          dhcp4: no
          addresses:
              - 192.168.2.2/24
              - 192.168.2.3/24
    

2.6.2. 动态IP地址配置

操作系统一般都会为网络接口自动分配IP地址。对于 buildroot 系统中,dhcpcd服务会发送dhcp请求到DHCP服务器(这里的DHCP服务器大概率是你的路由)请求接口的IP地址。而在Ubuntu系统中,会由NetworkManager来完成这一过程。

  • 临时配置

    udhcpc -i eth0/eth1
    
    # 或者
    dhclient eth0/eth1
    
  • 持久化配置:使用netplan

    network:
      version: 2
      renderer: networkd
      ethernets:
        eth0:
          dhcp4: yes
    

2.6.3. 静态路由配置

与静态路由相对的是动态路由,动态路由有OSPF和RIP,这两个协议只存在于路由器中。对于非路由器设备,如果某个目的网段无法直接到达,需要配置静态路由,告诉设备目的网段,出接口,下一跳的IP地址。

2.6.3.1. 常用的配置命令:

# 查看路由表
route -n 
# 或者
netstat -rn

# 添加 IP 静态路由
ip route add PREFIX via ADDRESS dev IFNAME [ metric METRIC ]

# 删除 IP 静态路由
ip route del PREFIX via ADDRESS dev IFNAME [ metric METRIC ]

# 清空 IP 路由
ip route flush dev IFNAME

2.6.3.2. 配置举例:

假设存在这样的一个网络拓扑,图中的Router1和Router2是我们的开发板设备,运行的系统是Ubuntu操作系统。在这个网络中,对于Router1,网段192.168.2.0/24和网段192.168.3.0/24,它们对于Router1属于直连网段,意味着对于PC-A来说,访问网段192.168.2.0/24和网段192.168.3.0/24是没有问题的,但是却不能访问网段192.168.4.0/24。这是因为对于网段192.168.4.0/24,对Router1来说是不可见的。需要在Router1配置静态路由,这条静态路由表明到目的网段192.168.4.0/24,需要经过下一条IP地址为192.168.3.2/24,出接口为Router1的eth1。同样的,对于Router2来说,网段192.168.3.0/24和网段192.168.4.0/24属于直连网段,PC-B也同样无法访问192.168.2.0/24网段,需要在Router2配置一条静态路由,表明到目的网络192.168.2.0/24,需要经过下一跳IP地址为192.168.3.1/24,出接口为为Router2的eth1。

_images/router1-20220629170401-d8fx48i.png

  • 临时配置

    • 对于Router1:

      # 开启IP转发功能
      echo 1 > /proc/sys/net/ipv4/ip_forward
      
      # 设置eth0, eth1的IP地址
      ip addr add 192.168.2.1/24 dev eth0
      ip addr add 192.168.3.1/24 dev eth1
      
      # 配置静态路由
      ip route add 192.168.4.0/24 via 192.168.3.2 dev eth1
      
    • 对于Router2:

      # 开启IP转发功能
      echo 1 > /proc/sys/net/ipv4/ip_forward
      
      # 设置eth0, eth1的IP地址
      ip addr add 192.168.4.1/24 dev eth0
      ip addr add 192.168.3.2/24 dev eth1
      
      # 配置静态路由
      ip route add 192.168.2.0/24 via 192.168.3.1 dev eth1
      
  • 持久化配置

    • 对Router1和Router2,执行以下命令永久开启IP转发

      sysctl -w net.ipv4.ip_forward=1
      
    • 对于Router1,配置Netplan

      network:
              version: 2
              renderer: networkd
              ethernets:
                      eth0:
                              addresses:
                                      - 192.168.2.1/24
                      eth1:
                              addresses:
                                      - 192.168.3.1/24
                              routes:
                                      - to: 192.168.4.0/24
                                        via: 192.168.3.2
      
    • 对于Router2,配置Netplan

      network:
              version: 2
              renderer: networkd
              ethernets:
                      eth0:
                              addresses:
                                      - 192.168.4.1/24
                      eth1:
                              addresses:
                                      - 192.168.3.2/24
                              routes:
                                      - to: 192.168.2.0/24
                                        via: 192.168.3.1
      

2.6.4. 默认路由配置

  • 临时配置

    对于通过DCHP服务动态获取IP地址的接口,操作系统会自动为其分配一条默认路由。对于静态IP地址配置,需要手动为其设置默认路由。

    还是以上面的例子来讲解,假设PC-A是一个Linux操作系统,我们需要进行如下配置:

    # 配置网卡 IP,假设其网卡为eth0
    ip addr add 192.168.2.2/24 dev eth0
    
    # 配置默认路由
    ip route add 0.0.0.0/0 via 192.168.2.1 dev eth0
    
  • 持久化配置:使用Netplan

    network:
            version: 2
            renderer: networkd
            ethernets:
                    eth0:
                            addresses:
                                    - 192.168.2.2/24
                            routes:
                                    - to: 0.0.0.0/0
                                      via: 192.168.2.1
    

2.6.5. 调整默认路由顺序

在双网口的开发板中,如果两个网口的IP地址是通过DHCP自动获取的,那么操作系统会生成两条默认路由,每个网口分别有一条默认路由,先插入网线的网口或者先获得IP的网口,会获得更高的路由优先级。如下所示,有两条默认路由,eth0网卡的默认路由优先级高于eth1。这就意味着开发板默认通信的时候,使用的是eth0网卡。

root@firefly:~# ip route list
default via 168.168.0.1 dev eth0 proto dhcp metric 100 
default via 168.168.0.1 dev eth1 proto dhcp metric 101 
168.168.0.0/16 dev eth0 proto kernel scope link src 168.168.110.72 metric 100 
168.168.0.0/16 dev eth1 proto kernel scope link src 168.168.110.111 metric 101

2.6.5.1. 配置举例:

假设存在一种情况,Wireless Router1的网段为192.168.3.0/24,Wireless Router2的网段为192.168.2.0/24,此时对于Firefly Board来说,eth0和eth1都是动态获取IP地址,如果eth0的默认路由的优先级比eth1的默认路由优先级高,通信时将使用eth0的默认路由,由于eth0所在网络无外网连接,Firefly Board就无法访问 Internet,此时可以通过修改默认路由的优先级来解决。

_images/router2-20220630162119-lgcya9l.png

其Netplan配置如下,eth1的metric数值小于eth0,数值越小优先级越高

network:
        version: 2
        ethernets:
                eth0:
                        dhcp4: yes
                        dhcp4-overrides:
                                route-metric: 200
                eth1:
                        dhcp4: yes
                        dhcp4-overrides:
                                route-metric: 100

2.7. iptables NAT配置

网络转换技术也称为NAT(Network Address Translation)技术,它的基本作用就是实现私有IP地址和公有IP地址之间的转换。

在Linux系统中,NAT可以细化为SNAT(Source Network Address Translation)和DNAT(Destinationnetwork address translation)。SNAT也称为源地址转换技术,用于当私网主机向外网主机发起网络通信时,IP数据包在到达外网网络之前,将IP数据包中的源IP修改为路由器或者防火墙的IP地址,这样外网主机就无法获知内网主机的私网IP地址。DNAT也称为目标地址转换技术,用于当外网主机需要访问内网主机提供的网络服务时,比如http,IP数据包到达路由器或者防火墙时,由它们将IP数据包中的目标IP改为提供网络服务的私网主机IP。

2.7.1. 常用命令

我们可以通过配置iptables的nat表,来实现SNAT和DNAT

# 查看nat规则
iptables -t nat -vnL

# 清空nat规则
iptables -t nat -F

# 添加一个SNAT规则,将内网的IP,映射到外网的IP
iptables -t nat -A POSTROUTING -s LocalIP -j SNAT --to-source ExtIP

# 添加一个DNAT规则,将外网的IP和端口,映射到内网的IP和端口
iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination LocalIP[:PORT]

iptables也支持MASQUERADE(地址欺骗),它的作用与SNAT基本相同,也可以起到源地址转换的作用。在一种特殊情况中,如果外网的IP地址不是一个固定且长期有效的IP地址,比如是通过pppoe进行拨号动态获取的IP地址,就可以使用MASQUERADE来实现源地址转换。MASQUERADE则不用指定明确的IP,会动态的将报文的源地址修改为指定网卡上可用的IP地址。

# 添加一个MASQUERADE规则,将内网的IP,映射到外网网卡所在的IP(这里的内网IP可以省略,则默认将所有内网的IP,都映射到外网网卡所在的IP)
iptables -t nat -A POSTROUTING [-s LocalIP] -o IFNAME -j MASQUERADE

2.7.2. 配置举例

假设存在这样的一个网络拓扑,用10.1.0.0/16来模拟一个公网网络,用192.168.1.0/24来模拟私有网络。图中的机器都是用Linux主机进行模拟的机器。

_images/router3-20220705091939-09uw91m.png

对于Router1,是一个连接内外网的路由器,其netplan配置如下:

network:
        version: 2
        renderer: networkd
        ethernets:
                eth0:
                        addresses:
                                - 192.168.1.3/24
                eth1:
                        addresses:
                                - 10.1.0.7/16

同时对于Router1,需要开启IP转发功能:

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

对于Internet PC,是一个外网的个人主机,其netplan配置如下:

network:
        version: 2
        renderer: networkd
        ethernets:
                eth0:
                        addresses:
                                - 10.1.0.6/16

对于Web Server,是一个私网服务器,提供http服务,其netplan配置如下:

network:
        version: 2
        renderer: networkd
        ethernets:
                eth0:
                        addresses:
                                - 192.168.1.100/24
                        routes:
                                - to: 0.0.0.0/0
                                  via: 192.168.1.3/24

2.7.3. SNAT

需求:目前的网络结构中,内网主机是无法访问外网的。

添加一条SNAT规则,修改内网主机发往外网的IP数据包,将源IP地址为192.168.1.0/24网段的IP,修改为10.1.0.7

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 10.1.0.7

验证方法:

  • 在内网的Web Server,ping外网的Internet PC

    ~  ping -c 4 10.1.0.6                                                                                                                                                    ok 
    PING 10.1.0.6 (10.1.0.6) 56(84) bytes of data.
    64 bytes from 10.1.0.6: icmp_seq=1 ttl=63 time=2.15 ms
    64 bytes from 10.1.0.6: icmp_seq=2 ttl=63 time=2.12 ms
    64 bytes from 10.1.0.6: icmp_seq=3 ttl=63 time=1.99 ms
    64 bytes from 10.1.0.6: icmp_seq=4 ttl=63 time=2.14 ms
    
    --- 10.1.0.6 ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 7ms
    rtt min/avg/max/mdev = 1.989/2.098/2.147/0.063 ms
    
  • 在内网的Web Server,抓包

    root@firefly:/# tcpdump -i eth1 -nn icmp       
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
    03:33:37.503348 IP 10.1.0.7 > 10.1.0.6: ICMP echo request, id 53287, seq 1, length 64
    03:33:37.503603 IP 10.1.0.6 > 10.1.0.7: ICMP echo reply, id 53287, seq 1, length 64
    03:33:38.503348 IP 10.1.0.7 > 10.1.0.6: ICMP echo request, id 53287, seq 2, length 64
    03:33:38.503560 IP 10.1.0.6 > 10.1.0.7: ICMP echo reply, id 53287, seq 2, length 64
    03:33:39.504601 IP 10.1.0.7 > 10.1.0.6: ICMP echo request, id 53287, seq 3, length 64
    03:33:39.504812 IP 10.1.0.6 > 10.1.0.7: ICMP echo reply, id 53287, seq 3, length 64
    03:33:40.505347 IP 10.1.0.7 > 10.1.0.6: ICMP echo request, id 53287, seq 4, length 64
    03:33:40.505557 IP 10.1.0.6 > 10.1.0.7: ICMP echo reply, id 53287, seq 4, length 64
    

2.7.4. DNAT

需求:内网Web Server提供http服务,外网主机想要访问内网的web网页。

添加一条DNAT规则,修改外网发往内网的IP数据包,将目的IP地址,和端口号,修改为内网Web服务器的IP和端口号。

iptables -t nat -A PREROUTING -d 10.1.0.7 -p tcp --dport 8000 -j DNAT --to-destination 192.168.1.100:8000

验证方法:

  • 在外网Internet PC访问内网Web Server的Web服务

    root@firefly:/# wget http://10.1.0.7:8000/index.html
    --2021-02-19 03:31:12--  http://10.1.0.7:8000/index.html
    Connecting to 10.1.0.7:8000... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 41323 (40K) [text/html]
    Saving to: ‘index.html’
    
    index.html          100%[===================>]  40.35K  --.-KB/s    in 0.001s  
    
    2021-02-19 03:31:12 (29.8 MB/s) - ‘index.html’ saved [41323/41323]
    

2.7.5. MASQUERADE

需求:如果连接内外网的Router1,它的外网网卡只有一个,为eth1,且IP地址动态获取。

解决方法:添加一条MASQUERADE规则,将内网192.168.1.0/24发往外网的IP数据包,修改其源IP地址为eth1网卡的IP地址。

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE

2.8. iptables filter配置

iptables的filter表(过滤规则表),用于控制数据包是否允许进出及转发。filter 表可以控制的链路有 INPUT、FORWARD 和 OUTPUT。常用的动作有ACCEPT,DROP,REJECT。

2.8.1. 通用命令

# 清空filter表
iptables -t filter -F

# 显示filter表
iptables -t filter -nvL

2.8.2. ACCEPT:允许数据包通过

配置举例:默认情况下ssh使用22端口进行tcp通信,如果要开启远程访问,需要开启22端口的tcp连接。

iptables -A INPUT -t filter -p tcp --dport 22 -j ACCEPT

开启ssh访问,允许192.168.0.0/24网段进行访问

iptables -A INPUT -t filter -p tcp -s 192.168.0.0/24 --dport 22 -j ACCEPT

开启ssh访问,允许收到的数据包来源于eth0网卡

iptables -A INPUT -t filter -p tcp -i eth0 --dport 22 -j ACCEPT

开启ssh访问,允许192.168.0.0/24网段中MAC地址为00:50:8D:FD:E6:32的主机进行访问

iptables -A INPUT -t filter -p tcp -s 192.168.0.0/24 --dport 22 -m mac --mac-source 00:50:8D:FD:E6:32 -j ACCEPT

2.8.3. REJECT:拒绝数据包通过

REJECT动作的常用选项为–reject-with(使用–reject-with选项,可以设置提示信息,当对方被拒绝时,会提示对方为什么被拒绝)

对于ICMP协议,可用值如下,如果不提供,默认为icmp-port-unreachable

icmp-net-unreachable
icmp-host-unreachable
icmp-port-unreachable,
icmp-proto-unreachable
icmp-net-prohibited
icmp-host-pro-hibited
icmp-admin-prohibited

配置举例:拒接外部ping,并提示”Destination Host Unreachable”

iptables -A INPUT -t filter -p icmp -j REJECT --reject-with icmp-host-unreachable

2.8.4. DROP:丢弃数据包

配置举例:直接将外部ping包丢弃

iptables -A INPUT -t filter -p icmp -j DROP