2: Linux防火墙(Netfilter)

1 安全技术和防火墙

1.1 安全技术

  • 入侵检测与管理系统(Intrusion Detection Systems): 特点是不阻断任何网络访问,量化,定位来自内外网的威胁情况,主要以提供报告和事后监督为主,提供有针对性的指导措施和安全决策依据.一般采用旁路部署方式
  • 入侵防御系统(Intrusion Prevention System): 以透明模式工作,
  • 防火墙(Firewall):

1.2 防火墙的分类

按保护范围划分:
按实现方式划分:
按网络协议划分:

包过滤防火墙:

包过滤防火墙

网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否允许该数据包通过

2 Linux防火墙的基本认识

2.1 Netfilter

Linux防火墙是由Netfilter组件提供的,Netfilter工作在内核空间,集成在Linux内核中
Netfilter是Linux 2.4.x 之后新一代的Linux防火墙机制,是Linux内核的一个子系统. Netfilter采用模块化设计,具有良好的可扩展性,提供扩展各种网段服务的结构化底层框架. Netfilter与IP协议栈是无缝契合,并允许对数据报进行过滤,地址转换,处理等操作
Netfilter官方文档: https://netfilter.org/documentation/

### 查看不同版本的Linux内核特性 ###
Centos 8: 查看/boot/config-4.18.0-193.el8.x86_64,该文件记录了内核特性

[15:35:19 root@centos8 ~]#grep -m 10 NETFILTER /boot/config-4.18.0-193.el8.x86_64 
CONFIG_NETFILTER=y
CONFIG_NETFILTER_ADVANCED=y
CONFIG_BRIDGE_NETFILTER=m
CONFIG_NETFILTER_INGRESS=y
CONFIG_NETFILTER_NETLINK=m
CONFIG_NETFILTER_FAMILY_BRIDGE=y
CONFIG_NETFILTER_FAMILY_ARP=y
# CONFIG_NETFILTER_NETLINK_ACCT is not set
CONFIG_NETFILTER_NETLINK_QUEUE=m
CONFIG_NETFILTER_NETLINK_LOG=m

Centos 7: 查看/boot/config-3.10.0-123.el7.x86_64,该文件记录了内核特性

[00:16:22 root@centos7 ~]#grep -m 10 NETFILTER /boot/config-3.10.0-123.el7.x86_64 
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
CONFIG_NETFILTER_ADVANCED=y
CONFIG_BRIDGE_NETFILTER=y
CONFIG_NETFILTER_NETLINK=m
CONFIG_NETFILTER_NETLINK_ACCT=m
CONFIG_NETFILTER_NETLINK_QUEUE=m
CONFIG_NETFILTER_NETLINK_LOG=m
CONFIG_NETFILTER_NETLINK_QUEUE_CT=y
CONFIG_NETFILTER_SYNPROXY=m

Centos 6: 查看/boot/config-2.6.32-754.el6.x86_64,该文件记录了内核特性

[root@centos6 ~]# grep -m 10 NETFILTER /boot/config-2.6.32-754.el6.x86_64 
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
CONFIG_NETFILTER_ADVANCED=y
CONFIG_BRIDGE_NETFILTER=y
CONFIG_NETFILTER_NETLINK=m
CONFIG_NETFILTER_NETLINK_QUEUE=m
CONFIG_NETFILTER_NETLINK_LOG=m
CONFIG_NETFILTER_TPROXY=m
CONFIG_NETFILTER_XTABLES=y
CONFIG_NETFILTER_XT_TARGET_AUDIT=m

Ubuntu:  查看/boot/config-4.15.0-76-generic,该文件记录了内核特性

root@ubuntu1804:~# grep -m 10 NETFILTER /boot/config-4.15.0-76-generic 
CONFIG_NETFILTER=y
CONFIG_NETFILTER_ADVANCED=y
CONFIG_BRIDGE_NETFILTER=m
CONFIG_NETFILTER_INGRESS=y
CONFIG_NETFILTER_NETLINK=m
CONFIG_NETFILTER_NETLINK_ACCT=m
CONFIG_NETFILTER_NETLINK_QUEUE=m
CONFIG_NETFILTER_NETLINK_LOG=m
CONFIG_NETFILTER_NETLINK_GLUE_CT=y
CONFIG_NETFILTER_SYNPROXY=m

### y: 参数y表示被集成在内核里 ###
[15:35:24 root@centos8 ~]#ll /boot
total 184576
-rw-r--r--. 1 root root   187648 May  8 21:07 config-4.18.0-193.el8.x86_64
drwxr-xr-x. 3 root root     4096 Jun 21 13:06 efi
drwx------. 4 root root     4096 Jun 21 13:16 grub2
-rw-------. 1 root root 98497217 Jun 21 13:14 initramfs-0-rescue-b988f85ba7c94883a5e03a0cbf150ea4.img
-rw-------. 1 root root 50928938 Jun 21 13:17 initramfs-4.18.0-193.el8.x86_64.img
-rw-------. 1 root root 17610940 Jun 21 13:21 initramfs-4.18.0-193.el8.x86_64kdump.img
drwxr-xr-x. 3 root root     4096 Jun 21 13:11 loader
drwx------. 2 root root    16384 Jun 21 13:04 lost+found
-rw-------. 1 root root  3909996 May  8 21:07 System.map-4.18.0-193.el8.x86_64
-rwxr-xr-x. 1 root root  8913656 Jun 21 13:13 vmlinuz-0-rescue-b988f85ba7c94883a5e03a0cbf150ea4
-rwxr-xr-x. 1 root root  8913656 May  8 21:07 vmlinuz-4.18.0-193.el8.x86_64

### m: 参数m表示功能被放在模块里, 以模块方式提供. 一般表示为各种ko文件 ###
[15:47:59 root@centos8 ~]#ll /lib/modules/4.18.0-193.el8.x86_64/
total 16432
-rw-r--r--.  1 root root     295 May  8 21:07 bls.conf
lrwxrwxrwx.  1 root root      38 May  8 21:07 build -> /usr/src/kernels/4.18.0-193.el8.x86_64
-rw-r--r--.  1 root root  187648 May  8 21:07 config
drwxr-xr-x. 12 root root     128 Jun 21 13:07 kernel
-rw-r--r--.  1 root root  865312 Jun 21 13:16 modules.alias
-rw-r--r--.  1 root root  827199 Jun 21 13:16 modules.alias.bin
-rw-r--r--.  1 root root     488 May  8 21:07 modules.block
-rw-r--r--.  1 root root    7534 May  8 21:07 modules.builtin
-rw-r--r--.  1 root root    9748 Jun 21 13:16 modules.builtin.bin
-rw-r--r--.  1 root root  287699 Jun 21 13:16 modules.dep
-rw-r--r--.  1 root root  397124 Jun 21 13:16 modules.dep.bin
-rw-r--r--.  1 root root     365 Jun 21 13:16 modules.devname
-rw-r--r--.  1 root root     140 May  8 21:07 modules.drm
-rw-r--r--.  1 root root      59 May  8 21:07 modules.modesetting
-rw-r--r--.  1 root root    1602 May  8 21:07 modules.networking
-rw-r--r--.  1 root root  100539 May  8 21:07 modules.order
-rw-r--r--.  1 root root     553 Jun 21 13:16 modules.softdep
-rw-r--r--.  1 root root  414722 Jun 21 13:16 modules.symbols
-rw-r--r--.  1 root root  505717 Jun 21 13:16 modules.symbols.bin
lrwxrwxrwx.  1 root root       5 May  8 21:07 source -> build
-rw-r--r--.  1 root root  347581 May  8 21:07 symvers.gz
-rw-------.  1 root root 3909996 May  8 21:07 System.map
drwxr-xr-x.  2 root root       6 May  8 21:06 updates
drwxr-xr-x.  2 root root      40 Jun 21 13:07 vdso
-rwxr-xr-x.  1 root root 8913656 May  8 21:07 vmlinuz
drwxr-xr-x.  3 root root      23 Jun 21 13:14 weak-updates

find /lib/modules/4.18.0-193.el8.x86_64/ -name "*.ko"

lsmod: 查看加载到内核中的模块

[15:52:56 root@centos8 ~]#lsmod | head -n 5
Module                  Size  Used by
rfcomm                 86016  6
nft_chain_route_ipv4    16384  1
xt_CHECKSUM            16384  1
nft_chain_nat_ipv4     16384  4
  • 以模块方式提供的好处就是想用就可用用不想用不用
  • 如果放在内核文件里那么一开机就会加载,内核文件里放的都是必要的常用的功能,不太常用的都表现为模块,按需加载
  • Netfilter是内核里的功能,对于普通用户来说,如果想使用,并不能直接操控内核,去干预系统内核,而是需要通过系统调用,系统调用是操作系统,内核和用户空间打交道的接口. 让每个用户去调系统调用是不现实的,因此Netfilter厂商研发了用户空间的工具,这些工具可以直接通过系统调用连接到内核里,去访问Netfilter内核模块,来进行各种安全设置
  • iptables 和 Firewalld 只能2选1,因为二者都是命令行工具,通过系统调用干预内核,同时使用会产生冲突

2.2 防火墙工具介绍

2.2.1 iptables

  • 由软件包iptables提供的命令行工具,工作在用户空间,用来编写规则,写好的规则被送往Netfilter,告诉内核如何去处理数据包
  • 不同版本的系统,iptables包的版本不一样
  • iptables自身也是通过模块来实现特定功能,可以根据需要做修改
  • iptables也可以作为一种服务,制定一些规则,让它开机自动加载
  • 工作中firewalld和iptables会被直接禁用,因为默认规则不符合生产要求,可以自己写规则不同系统自带的
  • 7和8上默认安装的是Firewalld服务和工具, 没有安装iptables服务, 只安装了工具. Firewalld工具和服务,都由Firewalld包提供, iptables工具由iptables包提供, 而服务由iptables-services包提供,
  • 6上只有iptables, 由iptables包提供
Centos 8:
[15:53:01 root@centos8 ~]#rpm -qi iptables
Name        : iptables
Version     : 1.8.4
Release     : 10.el8
Architecture: x86_64
Install Date: Sun 21 Jun 2020 13:06:25 AEST
Group       : Unspecified
Size        : 1974473
License     : GPLv2 and Artistic 2.0 and ISC
Signature   : RSA/SHA256, Sun 26 Apr 2020 12:09:33 AEST, Key ID 05b555b38483c65d
Source RPM  : iptables-1.8.4-10.el8.src.rpm
Build Date  : Fri 24 Apr 2020 23:51:59 AEST
Build Host  : x86-01.mbox.centos.org
Relocations : (not relocatable)
Packager    : CentOS Buildsys <bugs@centos.org>
Vendor      : CentOS
URL         : http://www.netfilter.org/projects/iptables
Summary     : Tools for managing Linux kernel packet filtering capabilities
Description :
The iptables utility controls the network packet filtering code in the
Linux kernel. If you need to set up firewalls and/or IP masquerading,
you should either install nftables or this package.

Note: This package contains the nftables-based variants of iptables and
ip6tables, which are drop-in replacements of the legacy tools.

Centos 7:
[01:36:33 root@centos7 ~]#rpm -qi iptables
Name        : iptables
Version     : 1.4.21
Release     : 13.el7
Architecture: x86_64
Install Date: Mon 22 Jun 2020 06:51:08 EST
Group       : System Environment/Base
Size        : 1541839
License     : GPLv2
Signature   : RSA/SHA256, Fri 04 Jul 2014 12:08:31 EST, Key ID 24c6a8a7f4a80eb5
Source RPM  : iptables-1.4.21-13.el7.src.rpm
Build Date  : Tue 10 Jun 2014 15:02:48 EST
Build Host  : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://www.netfilter.org/
Summary     : Tools for managing Linux kernel packet filtering capabilities
Description :
The iptables utility controls the network packet filtering code in the
Linux kernel. If you need to set up firewalls and/or IP masquerading,
you should install this package.

Centos 6:
[root@centos6 ~]# rpm -qi iptables
Name        : iptables                     Relocations: (not relocatable)
Version     : 1.4.7                             Vendor: CentOS
Release     : 19.el6                        Build Date: Wed 20 Jun 2018 02:08:21 AM AEST
Install Date: Thu 02 Jul 2020 12:05:43 PM AEST      Build Host: x86-01.bsys.centos.org
Group       : System Environment/Base       Source RPM: iptables-1.4.7-19.el6.src.rpm
Size        : 861752                           License: GPLv2
Signature   : RSA/SHA1, Wed 20 Jun 2018 09:37:20 PM AEST, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://www.netfilter.org/
Summary     : Tools for managing Linux kernel packet filtering capabilities
Description :
The iptables utility controls the network packet filtering code in the
Linux kernel. If you need to set up firewalls and/or IP masquerading,
you should install this package.
  • 不同版本的iptables调用的实际命令也不一样,但是为了兼容,基本命令都一样,除非使用某些特性
[02:09:14 root@centos7 ~]#iptables --version
iptables v1.4.21

Centos 8:
[16:07:11 root@centos8 ~]#which iptables
/usr/sbin/iptables
[16:13:10 root@centos8 ~]#ll /usr/sbin/iptables
lrwxrwxrwx. 1 root root 17 Apr 24 23:51 /usr/sbin/iptables -> xtables-nft-multi

Centos 7:
[02:12:58 root@centos7 ~]#which iptables
/usr/sbin/iptables
[02:13:35 root@centos7 ~]#ll /usr/sbin/iptables
lrwxrwxrwx. 1 root root 13 Jun 22 06:51 /usr/sbin/iptables -> xtables-multi

Centos 6:
[root@centos6 ~]# which iptables
/sbin/iptables
[root@centos6 ~]# ll /sbin/iptables
lrwxrwxrwx. 1 root root 33 Jul  2 12:05 /sbin/iptables -> /etc/alternatives/iptables.x86_64

Ubuntu:
root@ubuntu1804:~# which iptables
/sbin/iptables
root@ubuntu1804:~# ll /sbin/iptables
lrwxrwxrwx 1 root root 13 Nov 12  2017 /sbin/iptables -> xtables-multi*
  • iptables和Firewalld为什么冲突?
Centos 8:
[16:19:30 root@centos8 ~]#systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

[16:19:34 root@centos8 ~]#cat /usr/lib/systemd/system/firewalld.service
[Unit]
Description=firewalld - dynamic firewall daemon
Before=network-pre.target
Wants=network-pre.target
After=dbus.service
After=polkit.service
Conflicts=iptables.service ip6tables.service ebtables.service ipset.service
Documentation=man:firewalld(1)

[Service]
EnvironmentFile=-/etc/sysconfig/firewalld
ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS
ExecReload=/bin/kill -HUP $MAINPID
# supress to log debug and error output also to /var/log/messages
StandardOutput=null
StandardError=null
Type=dbus
BusName=org.fedoraproject.FirewallD1
KillMode=mixed

[Install]
WantedBy=multi-user.target
Alias=dbus-org.fedoraproject.FirewallD1.service

Conflicts=iptables.service ip6tables.service ebtables.service ipset.service

  • 安装iptables-services
[16:20:20 root@centos8 ~]#yum -y install iptables-services
[16:26:36 root@centos8 ~]#rpm -ql iptables-services
/etc/sysconfig/ip6tables
/etc/sysconfig/iptables
/usr/lib/systemd/system/ip6tables.service
/usr/lib/systemd/system/iptables.service
/usr/libexec/initscripts/legacy-actions/ip6tables
/usr/libexec/initscripts/legacy-actions/ip6tables/panic
/usr/libexec/initscripts/legacy-actions/ip6tables/save
/usr/libexec/initscripts/legacy-actions/iptables
/usr/libexec/initscripts/legacy-actions/iptables/panic
/usr/libexec/initscripts/legacy-actions/iptables/save
/usr/libexec/iptables
/usr/libexec/iptables/ip6tables.init
/usr/libexec/iptables/iptables.init

2.2.2 Firewalld

从Centos 7版开始引入了新的前端管理工具, Centos 7&8有Firewalld, 但是Ubuntu没有

软件包:

  • firewalld
  • firewalld-config

管理工具:

  • firewall-cmd 命令行工具
  • firewall-config 图形工具

2.2.3 nftables

CentOS8添加的新的防火墙工具

2.2.4 关闭防火墙,并禁止开机自启

Centos 6 
service iptables stop
chkconfig iptables off

Centos 7&8 
systemctl stop firewalld.service(iptables-services)
systemctl disable firewalld.service(iptables-services)
或者
systemctl disable --now firewalld.service(iptables-services)

Ubuntu
ufw disable
  • Netfilter是Linux内核的功能,并不是安装应用程序带来的功能,是集成在内核里的(Linux 2.4.x内核之后)
  • 很多硬件防火墙都是基于Linux内核开发,定制版的Linux系统
  • 内核是由不同的组件组成
  • iptables并不是防火墙,而是命令,他引用了Linux内核里的防火墙模块Netfilter来配置防火墙功能,也可以使用Firewalld.不同工具调用的底层都是Netfilter,只不过是换了个命令,换了个格式
  • 企业里大部分都是禁用服务器的防火墙,用专门的硬件防火墙,为了方便访问
  • Centos 6 : iptables
    Centos 7 & 8 : iptables,Firewalld(默认使用Firewalld)
    Ubuntu : iptables,默认没有

2.3 Netfilter中五个钩子函数和报文流向

Netfilter在内核中选取五个位置放了五个hook(勾子)function(INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING), 而这五个hook function向用户开发, 用户可以通过一个命令工具(iptables)向其写入规则

由信息过滤表(table)组成, 包含控制ip包处理的规则集(rules),规则被分组在链(chain)上

三种报文流向

  • 流入本机: PREROUTING - INPUT - 用户空间进程
  • 流出本机: 用户空间进程 - OUTPUT - POSTROUTING
  • 转发: PREROUTING - FORWARD - POSTROUTING

服务器网卡接受到数据包后, 先进入PREROUTING链, 根据数据包的目的IP来判断数据包是发给本机还是需要转发出去
经过路由判断后, 如果是发给本机的, 就会将数据包发给INPUT链
如果是转发的就发给FORWARD链

prerouting并不会控制二层, 数据包一旦进入了prerouting就说明了数据包的目标mac是本机
内核4.2后推出了ingress函数, 来控制二层

2.4 iptables的组成

iptables由五个表table和五个链chain以及一些规则组成

链chain

  • 内置链: 每个内置链对应于一个勾子函数, prerouting, input, forward, output, postrouting
  • 自定义链: 用于对内置链进行扩展和补充, 可实现灵活的规则组织管理机制, 只有hook勾子调用自定义链时才会生效

五个内置链

INPUT OUTPUT FORWARD PREROUTING POSTROUTING

五个表table

filter nat mangle raw security
  • filter表: 过滤规则表, 根据预定义的规则过滤符合条件的数据包, 是默认表
  • nat表: 地址转换规则表
  • mangle: 修改数据标记位规则表
  • raw: 关闭启用的连接跟踪机制, 加快封包穿越防火墙速度
  • security: 用于强制访问控制(MAC)网络规则, 由Linux安全模块(如SElinux)实现

表的优先级

security - raw - mangel - nat - filter
  • 不同的版本链和表的对应关系不一样,可以通过iptables -L -t 表名 来查看某个表可以作用在哪个链上,默认的表名是filter表
  • 无需记住所有的组合, 只要记住常用的组合即可
  • 查看某个表可以放在哪个链上, 默认不加-t显示filter表
[16:19:30 root@centos8 ~]#iptables -L -t filter
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   

3 iptables

3.1 iptables规则说明

3.1.1 规则组成

规则rule: 根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作做出处理,规则在链接上的次序即为其检查时的生效次序
匹配条件: 默认为与条件,同时满足
基本匹配: IP,端口,TCP的Flags(SYN,ACK等)
扩展匹配: 通过复杂高级功能匹配

处理动作: 称为target,跳转目标
-  内建处理动作: ACCEPT,DROP,REJECT,SNAT,DNAT,MASQUERADE,MARK,LOG...
-  自定义处理动作: 自定义chain,利用分类管理复杂情形

规则要添加在链上,才生效;添加在自定义链上不会自动生效, 勾子函数调用时才会生效

3.1.2 iptables规则添加时考量点

  • 要实现哪种功能: 判断添加在哪张表上
  • 报文流经的路径: 判断添加在哪个链上
  • 报文的流向: 判断源和目的
  • 匹配规则: 业务需要

3.1.3 环境准备

  • 关闭防火墙,并禁止开机自启
Centos 6 
service iptables stop
chkconfig iptables off

Centos 7&8 
systemctl stop firewalld.service(iptables-services)
systemctl disable firewalld.service(iptables-services)
或者
systemctl disable --now firewalld.service(iptables-services)

3.2 iptables 用法说明

范例: Filter表中INPUT规则

INPUT链

3.3 iptables 基本匹配条件

  • -t 表名: 指明作用在哪个表上,表名小写, -t filter, filter是默认表
  • INPUT: 指明作用在哪个链上,链名必须大写
  • -A: 表示在原有规则下面追加, Append, -A INPUT
  • -s: 匹配的源地址, -s 192.168.0.1
  • -d: 匹配的目标地址,注意: 如果在INPUT上基于源IP做过滤,一般是不需要指定目标IP地址的,因为既然已经作用在INPUT上了就说明流量已经过了PREROUTING, 报文就是要发给本机的,除非本机有多块网卡
  • -j: 处理动作jump,动作大写, -j DROP, -j REJECT也是拒绝
    DROP:不会返回信息
    REJECT: 会返回信息
  • -I: 插入, -I INPUT 2, 把新增的规则插入到第2条,原来的规则2就变成了规则3,默认是直接加到第一条
  • -R: 替换, -R INPUT 2
  • -D: 删除表中指定链的指定规则, ip tables -D INPUT 2,删除INPUT链中第二条规则
  • -P: 修改默认规则,初始默认都是ACCEPT, iptables -P INPUT DROP,将INPUT链默认规则修改成DROP. 如果收到的包,没有被任何一个规则匹配到,那么就执行DROP. 但要注意,修改默认规则前,一定要确保自己远程连接的主机是能通的,否则就连不上了
  • F: 清空防火墙规则, iptables -t [表] -F [链]

注意: 同一网段有包含关系, 范围小的规则放在前面, 范围大的规则放在后面; 无包含关系,不同网段的规则, 范围大的要放在前面, 加快效率.

#不同网点, 没有包含关系
172.16.0.0/16  #放前面
10.0.0.0/24 #放后面

范例: 在INPUT链拒绝10.0.0.202访问10.0.0.201

### DROP ###
[22:07:10 root@centos8 ~]#iptables [-t filter] -A INPUT -s 10.0.0.202 -j DROP

[07:47:57 root@centos7 ~]#ssh 10.0.0.201

[08:08:22 root@centos7 ~]#ping 10.0.0.201
PING 10.0.0.201 (10.0.0.201) 56(84) bytes of data.

### 清空表中的所有链的规则 ###
[22:10:26 root@centos8 ~]#iptables -F
### 清空表中指定链的规则 ###
[22:11:09 root@centos8 ~]#iptables -F INPUT
### REJECT ###
[22:12:51 root@centos8 ~]#iptables -A INPUT -s 10.0.0.202 -j REJECT
64 bytes from 10.0.0.201: icmp_seq=282 ttl=64 time=1.31 ms
From 10.0.0.201 icmp_seq=283 Destination Port Unreachable

范例: 禁止一个网段,或多个地址访问10.0.0.201

[22:14:33 root@centos8 ~]#iptables -A INPUT -s 10.0.0.0/24 -j REJECT
### 注意: 如果在INPUT链只基于源IP进行过滤,当远程主机和源IP在同一个网段时,拒绝后就无法SSH远程登录了.因此,一定添加规则时一定要注意,否则就会无法远程到服务器了. 因为,基于源IP进行的过滤是过滤所有协议 ###
### 需要把规则清除,或者加一个新规则插入到全部拒绝的前面 ###
[22:23:04 root@centos8 ~]#iptables -I INPUT 1 -s 10.0.0.1 -j ACCEPT
[22:23:21 root@centos8 ~]#iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    8  2005 ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           
  615 51660 REJECT     all  --  *      *       10.0.0.202           0.0.0.0/0            reject-with icmp-port-unreachable
  106 13010 REJECT     all  --  *      *       10.0.0.0/24          0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination   \

### 显示规则编号 ###
[22:23:38 root@centos8 ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1      339 28825 ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           
2      772 64848 REJECT     all  --  *      *       10.0.0.202           0.0.0.0/0            reject-with icmp-port-unreachable
3      245 25418 REJECT     all  --  *      *       10.0.0.0/24          0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination  
  • 总结: 基于源IP在INPUT链过滤时,要注意规则顺序
  1. 基于源IP过滤,如果源IP都是同一个网段的,要把严格的,范围小的匹配条件往前放,范围大的匹配条件往后放
  2. 如果源IP匹配的是不同的网段,要把范围大的网段放在前面,范围小的放在后面.
    比如: 172.16.0.0/16 vs 10.0.0.0/24
    要把172.16.0.0/16放在前面,因为它包含了更多的IP地址. 如果把它放在10.0.0.0/24后面,那么每收到一个来自172.16.0.0/16的数据,都要先在10.0.0.0/24中过滤一遍,会加大系统消耗

范例: 在OUTPUT链拒绝10.0.0.202访问10.0.0.201

[22:56:03 root@centos8 ~]#iptables -R OUTPUT 1 -d 10.0.0.202 -j REJECT
[22:56:15 root@centos8 ~]#iptables -vnL OUTPUT
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    6   504 REJECT     all  --  *      *       0.0.0.0/0            10.0.0.202           reject-with icmp-port-unreachable
  • 在INPUT和OUTPUT链上都可以指定规则,拒绝远程主机访问本地主机,要把规则设定在INPUT链上.因为如果设定在OUTPUT上,数据会进入到本地主机做处理,然后在出去的时候才做拒绝,浪费资源.
  • 在INPUT上利用远程主机的IP作为源IP进行匹配,在OUTPUT上利用远程主机的IP作为目标IP去匹配

企业常用白名单机制: 只有明确允许的流量才放行,其他统统拒绝
默认拒绝所有非允许流量的两种方法:

  1. 修改表中某个链的默认规则: iptables -P INPUT DROP
  2. 追加一条拒绝所有,在表中某个链的规则中: iptables -A INPUT -j REJECT
    注意: 不建议通过-P对整个链设定默认规则,因为链表级别的默认规则是无法用iptables -F去清除的,建议以追加的形式,在规则列表末尾添加一条拒绝所有
  3. 如果添加了默认拒绝,那么要把Loopback口放行,来完成本地测试,否则自己是ping不通自己的
[00:01:15 root@centos8 ~]#iptables -I INPUT -i lo -j ACCEPT

-i 表示, 从某个接口流入的报文都允许或拒绝
-o 表示, 从某个接口流程的报文都允许或拒绝

  1. 如果链的默认规则设成ACCEPT但是规则里最后一条是拒绝所有,那么失效的是链的默认允许所有

黑名单机制: 只有明确拒绝的才不允许,其他默认都放行

3.4 iptables 扩展匹配条件

扩展匹配条件: 需要加载扩展模块(/usr/lib64/xtables/*.so)
扩展模块的查看帮助: man iptables-extensions
扩展匹配条件:

  • 隐式扩展
  • 显式扩展

3.4.1 隐式扩展

iptables在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块

tcp协议的扩展选项

范例:
不允许任何主机向10.0.0.201发起新的ssh连接,但是已经建立起的连接是不会受影响的

### 添加规则前 ###
[01:03:25 root@centos8 ~]#iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    4   336 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
 5729  493K ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination   
### 此时10.0.0.202是可以ssh到10.0.0.201上的 ###
### 添加规则,不允许任何主机向10.0.0.201发起新的ssh连接,但是已建立起来的链接不受影响 ###
[01:06:16 root@centos8 ~]#iptables -A INPUT -p tcp --syn -j REJECT
### 从其他主机新建立ssh到10.0.0.201,访问拒绝 ###
[root@centos6 ~]# ssh 10.0.0.201
ssh: connect to host 10.0.0.201 port 22: Connection refused
### 此时如果退出已建立的连接,那么也无法再ssh 10.0.0.201 ###
[01:04:30 root@centos8 ~]#exit
logout
Connection to 10.0.0.201 closed.
[10:31:00 root@centos7 ~]#ssh 10.0.0.201
ssh: connect to host 10.0.0.201 port 22: Connection refused
  • 系统维护时可以采用此方法,已登录系统的用户不受影响,但是新用户无法连接到系统

udp协议的扩展选项

范例:
允许10.0.0.0/24网段主机访问10.0.0.201的tcp 80端口

### 追加一条规则,拒绝所有用户 ###
[01:12:05 root@centos8 ~]#iptables -A INPUT -j REJECT 
[01:12:27 root@centos8 ~]#iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    4   336 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
 7092  597K ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
### 此时除了lo和10.0.0.1其他任何主机都无法访问10.0.0.201 ###
### 添加规则 ###
[01:17:58 root@centos8 ~]#iptables -I INPUT 3 -s 10.0.0.0/24 -p tcp --dport 80 -j ACCEPT
[01:19:23 root@centos8 ~]#iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    4   336 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
 7831  656K ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           
    0     0 ACCEPT     tcp  --  *      *       10.0.0.0/24          0.0.0.0/0            tcp dpt:80
    6   676 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
### 这里要将允许规则添加到默认拒绝所有的前面,也就是插入到第三条规则 ###
### 此时10.0.0.0/24网段多可以访问10.0.0.201的tcp 80端口,但是其他端口是无法访问的 ###
[root@centos6 ~]# curl http://10.0.0.201:80
welcome to website
[root@centos6 ~]# ssh 10.0.0.201
ssh: connect to host 10.0.0.201 port 22: Connection refused
[root@centos6 ~]# ping 10.0.0.201
PING 10.0.0.201 (10.0.0.201) 56(84) bytes of data.
From 10.0.0.201 icmp_seq=1 Destination Port Unreachable

注意: 此时10.0.0.201是无法ssh或者ping其他主机的,因为在INPUT链上有默认的拒绝所有流量,导致从其他主机的回包会被拒绝,但是从10.0.0.201发出去的包是不会被拒绝的,因为OUTPUT上没有规则. 此时,如果想让10.0.0.201能够ssh到其他主机,比如, 10.0.0.202,则需要再额外添加一条规则,来允许来自10.0.0.0/24网段,tcp源端口是22的流量,因为ssh的回包的源端口号是对方的22端口,而从10.0.0.201发出的ssh请求包的目标端口是对方的22端口. 回包时源目端口号对调. 从10.0.0.0.201 ssh 10.0.0.202时, 请求包, 源端口是201的随机端口, 目标端口是202的22端口, 而从202来的回报, 源端口是202的22端口, 目标端口是201上的随机端口.

[01:26:59 root@centos8 ~]#iptables -I INPUT 4 -s 10.0.0.0/24 -p tcp --sport 22 -j ACCEPT
[01:33:09 root@centos8 ~]#iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   14  1207 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
 9085  763K ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           
   12   877 ACCEPT     tcp  --  *      *       10.0.0.0/24          0.0.0.0/0            tcp dpt:80
    0     0 ACCEPT     tcp  --  *      *       10.0.0.0/24          0.0.0.0/0            tcp spt:22
  121 20933 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[01:33:15 root@centos8 ~]#ssh 10.0.0.202
The authenticity of host '10.0.0.202 (10.0.0.202)' can't be established.
ECDSA key fingerprint is SHA256:kcsygyUEyDlk9lnQ3eVFN0Vf9v6ZUaxLFZICqknnpdw.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.0.0.202' (ECDSA) to the list of known hosts.
root@10.0.0.202's password: 
Last login: Tue Jul 14 10:08:50 2020 from 10.0.0.1
[10:56:29 root@centos7 ~]#

ICMP协议的扩展选项

[!] --icmp-type {type[/code]|typename}
    type/code
    0/0 echo-reply icmp 应答
    8/0 echo-request icmp 请求

通过ICMP协议扩展选项,可以实现A主机能ping通B,但是B主机无法ping通A,实现单项控制

范例:
实现10.0.0.201可以ping通10.0.0.202但是10.0.0.202无法ping通10.0.0.201

### 此时10.0.0.202无任何iptables规则,10.0.0.201 iptables规则如下 ###
[01:42:42 root@centos8 ~]#iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   14  1207 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
 9861  830K ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           
   12   877 ACCEPT     tcp  --  *      *       10.0.0.0/24          0.0.0.0/0            tcp dpt:80
   27  4217 ACCEPT     tcp  --  *      *       10.0.0.0/24          0.0.0.0/0            tcp spt:22
  122 21246 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination   
### 此时10.0.0.202无法ping通10.0.0.201,因为在201的INPUT上有默认拒绝流量,而ping是ICMP协议,不满足任何放行条件,所以202 ping 201的ping包可以从202出去,但是无法进到201的 同时201 ping 202的ping包可以到达202,因为在201的OUTPUT和202的INPUT都没有规则,但是202发给201的回包无法到打201,因为201INPUT链有默认拒绝所有 ###
### 要想实现题目功能,需要允许202给201的回包 ###
[01:53:02 root@centos8 ~]#iptables -I INPUT 5 -s 10.0.0.0/24 -p icmp --icmp-type 0/0 -j ACCEPT

3.4.2 显式扩展及相关模块

3.4.2.1 multiport模块

  • 以离散方式定义多端口匹配,最多指定15个端口

范例:
拒绝10.0.0.0/24网段访问本地 tcp 22和80端口

[15:20:57 root@centos8 ~]#iptables -A INPUT -s 10.0.0.1 -j ACCEPT 
[15:21:26 root@centos8 ~]#iptables -A INPUT -s 10.0.0.0/24 -p tcp -m multiport --dports 22,80 -j REJECT
[15:22:10 root@centos8 ~]#iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  338 23816 ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           
    0     0 REJECT     tcp  --  *      *       10.0.0.0/24          0.0.0.0/0            multiport dports 22,80 reject-with icmp-port-unreachable
### 从 10.0.0.202, ping, ssh, curl 10.0.0.201 ###
[01:19:38 root@centos7 ~]#ping 10.0.0.201
PING 10.0.0.201 (10.0.0.201) 56(84) bytes of data.
64 bytes from 10.0.0.201: icmp_seq=1 ttl=64 time=0.794 ms
^C
--- 10.0.0.201 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.794/0.794/0.794/0.000 ms
[01:23:46 root@centos7 ~]#curl 10.0.0.201
curl: (7) Failed connect to 10.0.0.201:80; Connection refused
[01:23:50 root@centos7 ~]#ssh 10.0.0.201
ssh: connect to host 10.0.0.201 port 22: Connection refused

3.4.2.2 iprange扩展

  • 指明连续的(但一般不是整个网络的)ip地址范围

范例:

### 先添加拒绝所有规则 ###
[15:30:07 root@centos8 ~]#iptables -A INPUT -j REJECT
[15:30:14 root@centos8 ~]#iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 1071 85816 ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
### 插入规则,允许10.0.0.204/24-10.0.0.210/24访问10.0.0.201本地 ###
[15:36:59 root@centos8 ~]#iptables -I INPUT 2 -m iprange --src-range 10.0.0.204-10.0.0.210 -j ACCEPT
[15:37:19 root@centos8 ~]#iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 1739  143K ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           
   10   840 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            source IP range 10.0.0.204-10.0.0.210
  806 68436 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

3.4.2.3 mac扩展

  • 可以用来基于源IP和源MAC绑定指定主机
  • mac扩展只需指定源MAC即可,因为目标MAC必须是本机网卡MAC,否则就丢包了
  • 特殊情况,当网卡设置为混杂模式,那么收到的帧无论目标MAC是不是本机MAC地址都会接收,适用与监控情况
  • 修改MAC地址, 可以在网卡配置文件添加MACADDR=XXXXXXXXXXXX

3.4.2.4 string扩展

  • 对报文中的应用层数据做字符串模式匹配检测,只要访问页面包含关键字就会被拒绝,容易误杀

范例:
拒绝访问带google字符的页面,但是baidu可以, 在output链加, 禁止回包里有不让访问的字符

Centos 6 IP 地址为 10.0.0.204/24
[root@centos6 ~]# curl 10.0.0.201/google.html
google
[root@centos6 ~]# curl 10.0.0.201/baidu.html
baidu
[root@centos6 ~]# 
[16:04:57 root@centos8 /var/www/html]#iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 4078  346K ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           
 3516  297K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            source IP range 10.0.0.204-10.0.0.210
 2567  228K REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
### 添加规则,如果web访问返回页面包含google关键字,则拒绝 ###
### 此时要在OUTPUT链添加,因为是回包包含google关键字会被拒绝 ###
### 客户端发送请求访问带有Google字样的页面, 防火墙收到网站回复,给客户端发回报时, 如果发现有Google字符则拒绝 ###
[16:06:38 root@centos8 /var/www/html]#iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62 --string "google" -j REJECT
[16:10:43 root@centos8 /var/www/html]#iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 4590  387K ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           
 3528  298K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            source IP range 10.0.0.204-10.0.0.210
 2571  229K REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:80 STRING match  "google" ALGO name bm FROM 62 TO 65535 reject-with icmp-port-unreachable
[root@centos6 ~]# curl 10.0.0.201/baidu.html
baidu
[root@centos6 ~]# curl 10.0.0.201/google.html

3.4.2.5 time扩展

  • 根据将报文到达的时间与指定的时间范文进行匹配

3.4.2.6 connlimit扩展

根据每客户端IP做并发连接数数量匹配,每个IP并发最多能发起多少次连接请求
可防止DOS拒绝服务攻击

--connlimit-upto #连接的数量小于等于#时匹配
--connlimit-above #连接的数量大于#时匹配

范例:
设定每IP最多并发10个连接到本地

[17:06:47 root@centos8 ~]#iptables -I INPUT 2 -m connlimit --connlimit-above 10 -j REJECT
[17:07:59 root@centos8 ~]#iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 8866  760K ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            #conn src/32 > 10 reject-with icmp-port-unreachable
  149 12516 ACCEPT     all  --  *      *       10.0.0.0/24          0.0.0.0/0           
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

3.4.2.7 limit扩展

基于收发报文的速率做匹配,令牌桶过滤器

范例:

[17:15:54 root@centos8 ~]#iptables -I INPUT 2 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
[17:19:32 root@centos8 ~]#iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  353 28496 ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           
    6   504 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8 limit: avg 10/min burst 5
   32  2688 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

3.4.2.8 state扩展

可以监控通过的数据报文, 是不是通讯过, 如果通讯过会在内存记录下来, 下次在访问就可以区分是新用户还是老用户, 之后做控制(老用户可以连接, 新用户不可以,和协议无关, 只跟踪状态). --- 状态跟踪.
和TCP状态机不一样
缺点: 消耗内存资源

已经追踪到并且记录下来的信息会放在数据库

/proc/net/nf_conntrack

因为内存有限制:
记录有时间限制, 规定在/proc/sys/net/netfilter/目录
并不是来一条记录就记录一条
最大记录状态值, 放在

[07:13:44 root@c8prac ~]#cat /proc/sys/net/netfilter/nf_conntrack_max 
26624

因此, 前端调度器需要增加最大记录状态值, 真正的后台服务器可以适当的减少该最大值, 直接修改这个文件即可.

[06:55:11 root@c8prac ~]#cat /proc/net/nf_conntrack
ipv4     2 tcp      6 409305 ESTABLISHED src=10.0.0.1 dst=10.0.0.84 sport=57822 dport=22 src=10.0.0.84 dst=10.0.0.1 sport=22 dport=57822 [ASSURED] mark=0 zone=0 use=2
ipv4     2 tcp      6 409304 ESTABLISHED src=10.0.0.1 dst=10.0.0.84 sport=57522 dport=22 src=10.0.0.84 dst=10.0.0.1 sport=22 dport=57522 [ASSURED] mark=0 zone=0 use=2

需要注意状态跟踪的添加顺序, 比如跟踪ESTABLISHED, 如果先添加了默认拒绝所有, 再添加ESTABLISHED,那么ESTABLISHED是不生效的

案例

实现10.0.0.71主机不能访问10.0.0.84, 但是84可以访问71, 包含任何协议.

ICMP可以基于type类型做控制(允许icmp的回应报文), tcp可以基于三次握手的syn位做控制(input上拒绝对方的--syn请求)
但是udp和其他应用层协议没有这些功能, 所以需要基于STATE状态跟踪实现

在8上指定只允许ESTABLISHED的包进入, 从8出去的包不需要控制

ESTABLISHED: 第一次发的请求报文是NEW, 对方给我的回包就是ESTABLISHED了.

10.0.0.84上的配置

[08:31:20 root@c8prac ~]#iptables -vnL
Chain INPUT (policy ACCEPT 35158 packets, 3296K bytes)
 pkts bytes target     prot opt in     out     source               destination         
 1534  122K ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           #Windows本机允许.   
   48  4032 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED #该记录只允许已经建立连接的包回到84, 也就是84访问71时, 从71回来的包
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable #该默认记录会拒绝从其他任何主机发起的请求

如果只想控制71不能主动访问84, 可以在默认规则前加一条规则, 允许非71的主机访问84

iptables -I INPUT 3  ! -s 10.0.0.71 -j ACCEPT
[20:37:18 root@c6node ~]#ping 10.0.0.84  #我的6的地址是10.0.0.61 
PING 10.0.0.84 (10.0.0.84) 56(84) bytes of data.
64 bytes from 10.0.0.84: icmp_seq=1 ttl=64 time=0.348 ms
64 bytes from 10.0.0.84: icmp_seq=2 ttl=64 time=0.266 ms

最终规则:

[08:37:11 root@c8prac ~]#iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -s 10.0.0.1/32 -j ACCEPT
-A INPUT -m state --state ESTABLISHED -j ACCEPT
-A INPUT ! -s 10.0.0.71/32 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable

自定义链

把规则分类, 单独定义一个链 ,就是自定义链, 比如把和web服务相关的规则放在一个链里
定义自定义链后,要关联到正常的链中, 才会有意义. 因为真正有效的,是5个链而不是自定义链.
自定义链相当于自定义函数, 需要被调用才能有效果
自定义链与其他链独立, 互不影响
  • 自定义链案例
  1. 创建自定义链, 用-N选项
[08:53:35 root@c8prac ~]#iptables -N WEB
[08:56:26 root@c8prac ~]#iptables -vnL
Chain INPUT (policy ACCEPT 35158 packets, 3296K bytes)
 pkts bytes target     prot opt in     out     source               destination         
 3565  296K ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           
  954 80136 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 38480 packets, 1976K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain WEB (0 references)
 pkts bytes target     prot opt in     out     source               destination  
  1. 定义自定义链规则, 允许目标端口是90,443和8080的流量
[09:01:39 root@c8prac ~]#iptables -A WEB -p tcp -m multiport --dports 80,443,8080 -j ACCEPT
  1. 将自定义链, 关联到内置链中
如果源地址是10.0.0.0/24网段的流量, 就交给WEB自定义链去控制, 具体能不能访问就看自定义链里的规则了
换句话说, 如果是在内置链中, 调用自定义链, 那么内置链的作用就是规定哪些流量需要自定义链去控制
真正起到控制的是自定义链里的规则, 也就是自定义链只需控制允许还是拒绝, 无需关注匹配的是谁
[09:01:56 root@c8prac ~]#iptables -I INPUT 2 -s 10.0.0.0/24 -j WEB 
[09:04:37 root@c8prac ~]#iptables -vnL
Chain INPUT (policy ACCEPT 35158 packets, 3296K bytes)
 pkts bytes target     prot opt in     out     source               destination         
 5066  425K ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           
    0     0 WEB        all  --  *      *       10.0.0.0/24          0.0.0.0/0           
  954 80136 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 39822 packets, 2052K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain WEB (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport dports 80,443,8080
  1. 这时如果还想允许10.0.0.0/24网段不仅能访问本机的WEB服务, 还能ping通本机, 只需要修改WEB自定义链,添加允许icmp协议规则即可,而无需修改内置链的条目, 达到模块化控制
[09:19:11 root@c8prac ~]#iptables -A WEB -p icmp -j ACCEPT
[09:19:17 root@c8prac ~]#iptables -vnL
Chain INPUT (policy ACCEPT 35158 packets, 3296K bytes)
 pkts bytes target     prot opt in     out     source               destination         
 5794  489K ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           
    0     0 WEB        all  --  *      *       10.0.0.0/24          0.0.0.0/0           
  954 80136 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 40497 packets, 2091K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain WEB (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport dports 80,443,8080
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0   
  1. 删除自定义链用-X选项
  • -F选项只能清除链里的规则, 并不能把自定义链删了
iptables -X WEB
#1 先从内置链中把自定义链删了 iptables -t filter -D INPUT 2
#2 清空自定义链的规则 iptables -F WEB
#3 -X删除自定义链 iptables -X WEB
  1. 直接删除自定义链会报错, 因此在内置链中还被调用着
[09:27:59 root@c8prac ~]#iptables -X WEB
iptables v1.8.4 (nf_tables):  CHAIN_USER_DEL failed (Device or resource busy): chain WEB

3.6 规则优化最佳实践

1. 安全放行所有入站和出站的状态为ESTABLISHED状态连接, 建议放在第一条, 效率更高
2. 谨慎放行入站的新请求
3. 有特殊目的的限制访问功能, 要在放行规则之前加以拒绝
4. 同类规则(访问同一应用, 比如: http), 匹配范围小的放在前面, 用于特殊处理
5. 不同类的规则(访问不同应用, 一个是http, 另一个是mysql), 匹配范围大的放在前面, 效率更高
6. 应该将那些可由一条规则能够描述的多个规则合并为一条
7. 设置默认策略, 建议白名单(只放行特定连接)
# iptables -P, 设置链表级默认规则, 不建议使用, 容易导致管理端无法ssh
# 规则的最后定义规则做为默认策略, 推荐使用, 放在最后一条

3.7 持久保存iptables规则

3.7.1 持久保存规则

3.7.1.1 CentOS 7&8

利用iptables-save命令, 将系统当前的规则存到一个文档里, 文件路径名字可以自己指定

iptables-save > /PATH/TO/RULES_FILE
iptables-save > /data/iptables.rule-`date +%F_%T`

3.7.1.2 CentOS 6

将规则覆盖保存至/etc/sysconfig/iptables文件中
service iptables save

3.7.2 加载规则

3.7.2.1 手动加载

CentOS 7&8

iptables-restore < /PATH/FROM/RULES_FILE
-n, --noflush: 不清楚原有规则
-t, --test: 仅分析生成规则集, 但不提交
iptables-restore < iptables.rule-2020-10-02_09:40:58

CentOS 6

重启iptables会自动从/etc/sysconfig/iptables 重新载入规则
service iptables restart

3.7.2.2 开机自动加载

方法1. 在7和8上安装iptables-services, 但是不建议, 因为和firewalld冲突

方法2. 将iptables-restore命令,放到/etc/rc.d/rc.local中. 这样开机就会自动运行iptables-restore命令

iptables-restore < iptables.rule-2020-10-02_09\:40\:58

给rc.local添加执行权限

chmod +x /etc/rc.d/rc.local

这样就可以实现开机自动加载rc.local里面的iptables-restore命令, 实现开机自动加载定义好的iptables规则

自定义链的内容, 也会开机自动加载, 只要写进了文件里即可

3.8 网络防火墙

iptables/netfilter 利用filter表的FORWARD链, 可以充当网络防火墙

  • 请求和响应报文均会经过FORWARD链, 要注意规则的方向性
  • 如果要启用conntrack机制, 建议将双方向的状态为ESTABLISHED的报文直接放行

3.8.1 FORWARD链实现内外网络的流量控制

图片.png
  1. 环境准备
firewall

[13:10:11 root@firewall ~]#vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[13:10:08 root@firewall ~]#sysctl -p
net.ipv4.ip_forward = 1
internet

root@internet:~# vim /etc/netplan/01-netcfg.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      addresses: [ 192.168.0.6/24 ]
      gateway4: 192.168.0.8

root@internet:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.8     0.0.0.0         UG    0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
lanserver1

[13:10:36 root@lanserver1 ~]#vinet

BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.7
NETMASK=255.255.255.0
GATEWAY=10.0.0.8

[13:12:34 root@lanserver1 ~]#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.0.8        0.0.0.0         UG    100    0        0 eth0
10.0.0.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0
lanserver2

[13:03:27 root@lanserver2 ~]#vinet

BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.17
NETMASK=255.255.255.0
GATEWAY=10.0.0.8 

[13:13:10 root@lanserver2 ~]#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.0.8        0.0.0.0         UG    100    0        0 eth0
10.0.0.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0
  1. 访问测试, 确保内外能互相ping通
root@internet:~# ping 10.0.0.7
PING 10.0.0.7 (10.0.0.7) 56(84) bytes of data.
64 bytes from 10.0.0.7: icmp_seq=1 ttl=63 time=10.3 ms
64 bytes from 10.0.0.7: icmp_seq=2 ttl=63 time=1.45 ms
root@internet:~# ping 10.0.0.17
PING 10.0.0.17 (10.0.0.17) 56(84) bytes of data.
64 bytes from 10.0.0.17: icmp_seq=1 ttl=63 time=1.52 ms
64 bytes from 10.0.0.17: icmp_seq=2 ttl=63 time=0.634 ms
  1. 实现内网主机可以连接外网,而外网无法主动向内网发起连接
[13:10:57 root@firewall ~]#iptables -A FORWARD -j REJECT 
[13:39:43 root@firewall ~]#iptables -I FORWARD -s 10.0.0.0/24 -m state --state NEW -j ACCEPT 
[13:40:10 root@firewall ~]#iptables -I FORWARD 2 -m state --state ESTABLISHED -j ACCEPT
[13:45:05 root@firewall ~]#iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    2   168 ACCEPT     all  --  *      *       10.0.0.0/24          0.0.0.0/0            state NEW
  133 11172 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
   72  6048 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination 
  1. 访问测试
root@internet:~# ping 10.0.0.7
PING 10.0.0.7 (10.0.0.7) 56(84) bytes of data.
From 192.168.0.8 icmp_seq=1 Destination Port Unreachable
From 192.168.0.8 icmp_seq=2 Destination Port Unreachable
[13:46:17 root@lanserver1 ~]#ping 192.168.0.6
PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.
64 bytes from 192.168.0.6: icmp_seq=1 ttl=63 time=1.66 ms
64 bytes from 192.168.0.6: icmp_seq=2 ttl=63 time=1.14 ms

3.8.2 NAT表

NAT: Network Address Translation, 支持PREROUTING, INPUT, OUTPUT, POSTROUTING, 四个链

请求报文: 修改源/目标IP, 定义如何修改
响应报文: 修改源/目录IP, 根据跟踪机制自动实现

NAT的实现分为下面类型:

  • SNAT: Source NAT, 支持POSTROUTING, INPUT, 让本地网络中的主机通过某一些特定地址访问外部网络, 实现地址伪装, 请求报文: 修改源IP

  • DNAT: Destination NAT, 支持PREROUTING, OUTPUT, 把本地网络中的主机上的某服务开放给外部网络方位(发布服务和短裤映射), 但隐藏真实IP, 请求报文: 修改目标IP

  • PNAT: Port NAT, 端口和IP都进行修改

3.8.3 SNAT

SNAT: 基于nat表的target, 适用于固定的公网ip

SNAT选项:

  • --to-source [ipaddr[-ipaddr]][:port[-port]]
  • random
iptables -t nat -A POSTROUTING -S LocalNET ! -d LocalNet -j SNAT --to-source ExtIP

范例:

iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! -d 10.0.1.0/24 -j SNAT --to-source 172.18.1.6-172.18.1.9

MASQUERADE: 基于nat表的target, 适用于动态的公网ip, 如: 拨号网络

MASQUERADE选项:

  • --to-ports port[-port]
  • --random
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE

范例:

iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! -d 10.0.1.0/24 -j MASQUERADE

案例: SNAT, 模拟10.0.0.0/24网络利用SNAT访问192.168.0.0/24网段

图片.png
  1. 环境准备
  • 基于3.8.1环境
internet: 实验环境下, 主机是和防火墙左侧端口直连的, 收到的报文源地址经过SNAT转换就是防火墙左侧的ip地址, 所以也就不需要配网关了

root@internet:~# vim /etc/netplan/01-netcfg.yaml 

# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      addresses: [ 192.168.0.6/24 ]  
lanserver1,lanserver2以及firewall保持不变
  1. 此时, 由于internet主机没有指定网关, 内外网是无法通讯的
[14:39:40 root@lanserver1 ~]#ping 192.168.0.6
PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data # internet主机能收到内网的icmp请求包, 但是无法回应
root@internet:~# tcpdump -i eth0 -nn icmp 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:44:41.432337 IP 10.0.0.7 > 192.168.0.6: ICMP echo request, id 26448, seq 30, length 64  # 没有响应报文
14:44:42.433447 IP 10.0.0.7 > 192.168.0.6: ICMP echo request, id 26448, seq 31, length 64
14:44:43.434869 IP 10.0.0.7 > 192.168.0.6: ICMP echo request, id 26448, seq 32, length 64
root@internet:~# ping 10.0.0.7
connect: Network is unreachable # 不同网络通讯, 找不到网关
  1. firewall的nat表添加SNAT策略
SNAT需要在nat表的POSTROUTING设置, nat起到的是转发作用, 因此, 无论SNAT还是DNAT都不涉及,INPUT和OUTPUT
如果SNAT设置在了PREROUTING上, 那么就会把所有刚进入到防火墙的流量的源ip地址都做转换, 如果某些报文是要访问防火墙自身数据的, 就会收影响
[13:45:08 root@firewall ~]#iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE 
[14:48:21 root@firewall ~]#iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   46  3864 MASQUERADE  all  --  *      *       10.0.0.0/24          0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination 
  1. 访问测试
[14:48:08 root@lanserver1 ~]#ping 192.168.0.6
PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.
64 bytes from 192.168.0.6: icmp_seq=1 ttl=63 time=1.00 ms
64 bytes from 192.168.0.6: icmp_seq=2 ttl=63 time=0.780 ms
添加了SNAT后, 内网访问外网主机, 在防火墙出口, 内网的ip地址,会被替换成防火墙出口的ip, 实验环境中, 防火墙出口和外网主机是在一个网段, 因此外网主机可以收到
同时, 因此SNAT会修改请求报文的源ip, 因为外网主机收到的报文的源ip是防火墙出口的ip, 那么回应也是给这个ip回应
由于外网主机和防火墙出口ip是在同一个网段, 所以即使没有网关也是能通的
root@internet:~# tcpdump -i eth0 -nn icmp 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:49:07.749898 IP 192.168.0.8 > 192.168.0.6: ICMP echo request, id 26452, seq 1, length 64
14:49:07.749980 IP 192.168.0.6 > 192.168.0.8: ICMP echo reply, id 26452, seq 1, length 64
14:49:08.750987 IP 192.168.0.8 > 192.168.0.6: ICMP echo request, id 26452, seq 2, length 64
14:49:08.751014 IP 192.168.0.6 > 192.168.0.8: ICMP echo reply, id 26452, seq 2, length 64
  1. 查看SNAT转换信息
[15:16:49 root@firewall ~]#tail -f /proc/net/nf_conntrack
ipv4     2 icmp     1 26 src=10.0.0.7 dst=192.168.0.6 type=8 code=0 id=26835 src=192.168.0.6 dst=192.168.0.8 type=0 code=0 id=26835 mark=0 zone=0 use=2
ipv4     2 tcp      6 299 ESTABLISHED src=10.0.0.8 dst=10.0.0.1 sport=22 dport=50494 src=10.0.0.1 dst=10.0.0.8 sport=50494 dport=22 [ASSURED] mark=0 zone=0 use=2
tail: /proc/net/nf_conntrack: file truncated
ipv4     2 icmp     1 26 src=10.0.0.7 dst=192.168.0.6 type=8 code=0 id=26835 src=192.168.0.6 dst=192.168.0.8 type=0 code=0 id=26835 mark=0 zone=0 use=2
ipv4     2 tcp      6 299 ESTABLISHED src=10.0.0.8 dst=10.0.0.1 sport=22 dport=50494 src=10.0.0.1 dst=10.0.0.8 sport=50494 dport=22 [ASSURED] mark=0 zone=0 use=2

3.8.4 DNAT

DNAT: nat表的target, 适用于端口映射, 既可重定向到本机, 也可以支持重定向到不同主机的不同端口, 但不支持多目标, 既不支持负载均衡功能

DNAT选项:

  • --to-destination [ipaddr[-ipaddr]][:port[-port]]
iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterServerIP[;PORT]

范例:

iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 22 -j DNAT --to-destination 10.0.1.22
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22:8080

案例: 实现DNAT, 公网客户端可以访问到内网的服务器

图片.png
  1. 环境准备
lanserver1: 安装httpd服务, 模拟公司内的web服务器. 由于之前的实验把lanserver1的网关指向了防火墙内网接口, DNS也删除了, 因此, 安装httpd前, 需要修改网关,并且添加DNS. 安装完httpd后再改回来

[15:10:45 root@lanserver1 ~]#vinet

BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.7
NETMASK=255.255.255.0
GATEWAY=10.0.0.2
DNS1=223.5.5.5 
[15:06:03 root@lanserver1 ~]#yum -y install httpd; systemctl enable --now httpd; echo 'lanserver1-10.0.0.7' > /var/www/html/index.html
  1. firewall的nat表添加策略
DNAT需要在防火墙的PREROUTING链设置, 因为, 外网访问内网服务器, 请求报文的目标ip是防火墙的公网接口地址
如果不在PREROUTING做目标地址转换, 那么报文进入了路由决策, 发现目标ip是本机, 就会把报文发到INPUT
[15:20:12 root@firewall ~]#iptables -t nat -A PREROUTING -d 192.168.0.8 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.7:80
  1. 访问测试
这里如果还保留了之前3.8.1的FORWARD策略, 那么访问会失败, 因为之前的FORWARD定义了只允许内网通过firewall访问外网. 因此, 测试之前需要把filter表FORWARD链清空
root@internet:~# curl 192.168.0.8
lanserver1-10.0.0.7

3.8.5 REDIRECT转发

REDIRECT, 是NAT表的target, 通过改变目标IP和端口, 将接受的包转发至同一个主机的不同端口, 可用于PREROUTING, OUTPUT链

REDIRECT选项:

  • --to-ports port[-port]

范例:

iptables -t nat -A PREROUTING -d 172.16.100.10 -p tcp --dport 80 -j REDIRECT --to-ports 8080

实现REDIRECT转发

web服务器监听在8080端口, 防火墙还是基于DNAT实现192.168.0.8:80 > 10.0.0.7:80, 通过REDIRECT,把访问web服务器80端口的服务, 重定向到web服务器的8080
  1. 修改web服务器的监听地址
[15:47:26 root@lanserver1 ~]#vim /etc/httpd/conf/httpd.conf
Listen 8080 
[16:09:50 root@lanserver1 ~]#systemctl restart httpd
[16:09:54 root@lanserver1 ~]#ss -ntl
State      Recv-Q Send-Q                                                               Local Address:Port                                                                              Peer Address:Port              
LISTEN     0      128                                                                              *:8080                                                                                         *:*   
  1. 在web服务器上添加防火墙REDIRECT转发
[16:10:05 root@lanserver1 ~]#iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
[16:11:10 root@lanserver1 ~]#iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080
  1. 测试访问
root@internet:~# curl 192.168.0.8
lanserver1-10.0.0.7
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容