tcpdump和iptables

Tcpdump

网络抓包分析工具

安装
# yum install tcpdump
语法格式
# tcpdump [-AennqX] [-i 接口] [-w 保存的文件名] [-c 次数] [-r 已经保存好的tcpdump文档] [想抓取到的数据包的具体格式或者说是协议]

选项和参数:
-A :数据包的内容以 ASCII 显示,通常用来捉取 WWW 的网页数据包资料。
-e :使用资料连接层 (OSI 第二层) 的 MAC 数据包资料来显示;
-nn:直接以 IP 及 port number 显示,而非主机名与服务名称
     80  http
     22  ssh
-q :仅列出较为简短的数据包资讯,每一行的内容比较精简
-X :可以列出十六进位 (hex) 以及 ASCII 的数据包内容,对于监听数据包内容很有用
-i :后面接要『监听』的网卡接口,例如 eth0, lo, ppp0 等接口;
-w :如果你要将监听所得的数据包资料储存下来,用这个参数就对了!后面接文件名
-r :从后面接的文件中读出来。这个文件必须是已经存在的文件,
     并且这个『文件』是由 -w 所制作出来的。
-c :监听的数据包数,如果没有这个参数, tcpdump 会持续不断的监听,
     直到使用者输入 [ctrl]-c 为止。
所欲抓取的数据包格式:我们可以专门针对某些通讯协议或者是 IP 来源进行数据包的抓取,
     那就可以简化输出的结果,并取得最有用的资讯。
     常见的表示方法有:
     'host foo', 'host 127.0.0.1' :针对单部主机来进行数据包撷取
     'net 192.168' :针对某个网域来进行数据包的撷取;
     'src host 127.0.0.1' 'dst net 192.168':同时加上来源(src)或目标(dst)限制
     'tcp port 21':还可以针对通讯协定侦测,如 tcp, udp, arp, ether 等
     还可以利用 and 与 or 来进行数据包资料的整合显示呢!
使用案例
// 抓取网卡 eth0 上的数据包,并以 ip 与端口号的方式展示
# tcpdump -i eth0 -nn
17:04:27.784377 IP 172.16.153.160.22 > 172.16.153.1.58933: Flags [P.], seq 1700472:1700836, ack 1117, win 313, options [nop,nop,TS val 59343227 ecr 1067292474], length 364
17:04:27.784599 IP 172.16.153.1.58933 > 172.16.153.160.22: Flags [.], ack 1700836, win 4084, options [nop,nop,TS val 1067292474 ecr 59343227], length 0
17:04:27.784611 IP 172.16.153.1.58933 > 172.16.153.160.22: Flags [P.], seq 1117:1153, ack 1700836, win 4096, options [nop,nop,TS val 1067292474 ecr 59343227], length 36
^C   // 按下 Ctrl + c 结束
9472 packets captured              // 捕获到的数据包数量
9472 packets received by filter    // 经过筛选器的数据包
0 packets dropped by kernel        // 被内核丢弃的数据包数量

// 我们来拿其中的一条来简单的说明以一下
17:04:27.784611 IP 172.16.153.1.58933 > 172.16.153.160.22: Flags [P.], seq 1117:1153, ack 1700836, win 4096, options [nop,nop,TS val 1067292474 ecr 59343227], length 36

17:04:27.784611       // 此数据包的抓取时间
IP                    // 通信的协议
172.16.153.1.58933    // 源地址 172.16.153.1 和 源端口 58933
>                     // 数据包的传输方向
172.16.153.160.22     // 目的地址 172.16.153.160 和 目标端口 22
Flags [P.], seq 1117:1153 这个数据包带有 PUSH 的资料传输标志, 且传输的资料为整体资料的 1117~1153 byte
// 指定抓取某个端口的数据包
# tcpdump -i eth0 -nn port 22
// 观察 tcp 三次握手过程
// 先监听本地回环接口
# tcpdump -i lo -nn -c 5

// 在打开另一个终端,以 ssh 的方式连接 127.0.0.1
# ssh 127.0.0.1

// 返回到另一个终端观察返回的结果
// 第一步 客户端主动连接,发送带有 SYN 标识的 数据包 Flags [S], seq 3515943501
17:41:12.156587 IP 127.0.0.1.44056 > 127.0.0.1.10051: Flags [S], seq 3515943501, win 43690, options [mss 65495,sackOK,TS val 61459018 ecr 0,nop,wscale 7], length 0


// 第二步 服务端也向客户端发送含有 SYN 标识的数据包 Flags [S.], seq 6548797
// 同时回应 客户端的相应客户端的请求 ack 3515943502 (可以看出这是 加 1)
11:27:56.201138 IP 127.0.0.1.10051 > 127.0.0.1.44056: Flags [S.], seq 6548797, ack 3515943502, win 43690, options [mss 65495,sackOK,TS val 61459018 ecr 61459018,nop,wscale 7], length 0

// 第三步 客户端回应确认包
17:41:12.156626 IP 127.0.0.1.44056 > 127.0.0.1.10051: Flags [.], ack 1, win 342, options [nop,nop,TS val 61459018 ecr 61459018], length 0

// 开始传输数据
17:41:12.157131 IP 127.0.0.1.44056 > 127.0.0.1.10051: Flags [P.], seq 1:64, ack 1, win 342, options [nop,nop,TS val 61459018 ecr 61459018], length 63

DDoS 攻击法 (Distributed Denial of Service )介绍

这类型的攻击中文翻译成『分布式阻断服务攻击』,从字面上的意义来看,它就是透过分散在各地的僵尸计算机进行攻击, 让你的系统所提供的服务被阻断而无法顺利的提供服务给其他用户的方式。 这种攻击法也很要命,而且方法有很多,最常见的就属 SYN Flood 攻击法了!还记得我们在网络基础里面提到的,当主机接收了一个带有 SYN 的 TCP 数据包之后,就会启用对方要求的 port 来等待联机,并且发送出回应数据包 (带有 SYN/ACK 旗目标 TCP 数据包),并等待 Client 端的再次回应。

好了,在这个步骤当中我们来想一想,如果 cient 端在发送出 SYN 的数据包后,却将来自 Server 端的确认数据包丢弃,那么你的 Server 端就会一直空等,而且 Client 端可以透过软件功能,在短短的时间内持续发送出这样的 SYN 数据包,那么你的 Server 就会持续不断的发送确认数据包,并且开启大量的 port 在空等~呵呵!等到全部主机的 port 都启用完毕,那么…系统就挂了!如果本机是提供网络服务的服务器,就是启动多个连接进程,多了的话也会让系统的资源耗尽,从而无法响应正常的请求。

更可怕的是,通常攻击主机的一方不会只有一部!他会透过 Internet 上面的僵尸网络 (已经成为跳板,但网站主却没有发现的主机) 发动全体攻击,让你的主机在短时间内就立刻挂掉。 这种 DDoS 的攻击手法比较类似『玉石俱焚』的手段, 他不是入侵你的系统,而是要让你的系统无法正常提供服务! 最常被用来作为阻断式服务的网络服务就是 WWW 了,因为 WWW 通常得对整个 Internet 开放服务。

这种攻击方法也是最难处理的,因为要嘛就得要系统核心有支持自动抵挡 DDoS 攻击的机制, 要嘛你就得要自行撰写侦测软件来判断!真是麻烦啊~而除非你的网站非常大, 并且『得罪不少人』,否则应该不会被 DDoS 攻击啦!

防火墙的使用场景

1 单一网络

在这里插入图片描述

2 多个局域网

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hkFNANnC-1658457000487)(assets/image-20210204064103581.png)]

3 非军事区(DMZ)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lZurkEiA-1658457000487)(assets/image-20210204064155261.png)]

防火墙的使用限制

1 防火墙只能过滤 osi 七层模型的 2、3、4 层

2 防火墙不是识别一个正常请求的数据包中是否包含非法的程序代码(病毒、木马)

3 一般情况下,对应内部局域网的攻击没有承受能力。(可以使用入侵检查软件来应对)

Iptables

介绍

iptables 是通过分析数据包的包头信息,根据包头中的信息是否匹配到一定的规则,再对这些数据包进行放行、拒绝或丢弃等动作
包头信息:
- 源地址
- 目标地址
- 源端口
- 目标端口
- 源 mac
- 目标 mac
- TCP 的状态

规则是预先定义好的,写在文件中
匹配到规则是有顺序之分的,假如有多条规则, 当放在文档中的最上方的规则具有被优先匹配权。
比如,当第一条规则匹配后,就会执行第一个规则指定的处理方式。之后的规则就不会去被匹配了

具体可以看下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6ikR4LIO-1658457000488)(assets/image-20210204065919066.png)]

也就是,当一个数据包进入主机的时候,防火墙会分析它,并比对预先设置好的规则,

顺序是从上向下开始比对,只要先被匹配到的规则后,就执行此条规则对应的动作。

而后面的规则将不再进行比对。

iptables 的表和链

Iptables 有多个表格 (table) ,每个表格都定义出自己的预设政策与规则, 且每个表格的用途都不相同。

看图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NCvO3DBX-1658457000488)(assets/image-20210204065949273.png)]

表链详解

4 表: filter、 nat、mangle、 raw

5 链: INPU、OUTPUT、FORWARD、PREROUTING、POSTROUTING

filter (过滤器):

主要跟进入 Linux 本机的数据包有关,这个是默认的表

  • INPUT:主要与想要进入我们 Linux 本机的数据包有关;
  • OUTPUT:主要与 Linux 本机所要送出的数据包有关;
  • FORWARD:这个与 Linux 本机没有关係, 他可以转发数据包到后端的电脑中,与下列 nat table 相关性较高。

nat (位址转换):

是 Network Address Translation 的缩写, 这个表主要在进行来源与目的之 IP 或 port 的转换,与 Linux 本机无关,主要与 Linux 主机后的区域网路内电脑有关。

  • PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT), 通常用于目标地址转换
  • POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE), 通常用于源地址转换
  • OUTPUT:与发送出去的数据包有关

mangle (破坏者):

这个表主要是与特殊的数据包的路由标记有关, 早期仅有 PREROUTING 及 OUTPUT 链,不过从 kernel 2.4.18 之后加入了 INPUT 及 FORWARD 链。 由于这个表与特殊标记具有较高关联性,所以单纯的环境当中,较少使用 mangle 这个表。

raw:

优先级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能

各个表和链的关系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YWWWwxAB-1658457000488)(assets/image-20180801191039705.png)]

基本上 iptables 可以控制三种数据包的流向

1. 数据包进入 Linux 主机使用资源 (路径 A): 
在路由判断后确定是向 Linux 主机要求资料的数据包,主要就会透过 filter 的 INPUT 链来进行控管;

2. 数据包经由 Linux 主机的转递,没有使用主机资源,而是向后端主机流动 (路径 B): 
在路由判断之前进行数据包表头的修订作业后,发现数据包主要是要透过防火墙而去后端,此时数据包就会透过路径 B 来走向。 也就是说,该数据包的目标并非我们的 Linux 本机。主要经过的链是 filter 的 FORWARD 以及 nat 的 POSTROUTING, PREROUTING。

3. 数据包由 Linux 本机发送出去 (路径 C): 
例如回应用户端的要求,或者是 Linux 本机主动送出的数据包,都是透过路径 C 来跑的。先是透过路由判断, 决定了输出的路径后,再透过 filter 的 OUTPUT 链来传送的!当然,最终还是会经过 nat 的 POSTROUTING 链。

提示:

有没有发现有两个『路由判断』呢?因为网路是双向的,所以进与出要分开来看!因此,进入的数据包需要路由判断, 送出的数据包当然也要进行路由判断才能够发送出去!

把 mangle 去掉后的简图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WSPjZfVd-1658457000489)(assets/image-20210204071833901.png)]

事实上与本机最有关的其实是 filter 这个表格内的 INPUT 与 OUTPUT 这两条链,如果你的 iptables 只是用来保护 Linux 主机本身的话,那 nat 的规则根本就不需要理他,直接设定为开放即可。

但是,如果是用于管理内部局域网(LAN)的主机的话,就需要设置如下表和链:
  filter 的 FORWARD 链
  nat 的 PREROUTING、POSTROUTING、OUTPUT 链 

基本使用

安装
// 停止firewalld服务
# systemctl stop firewalld

// 禁止开机自启 firewalld 服务 
# systemctl disable firewalld

// 或者禁用 firewalld 服务
# systemctl mask firewalld
 // 先检查是否安装了iptables
# rpm -q iptables
// 没有安装的话,可以安装iptables
# yum install -y iptables
// 升级iptables
# yum update iptables 

// 查看规则
# iptables -nL


// 先执行如下命令,添加规则:开放22端口
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT

// 保证有如下内容
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

规则

iptables 至少有三个预设的 table (filter, nat, mangle),较常用的是本机的 filter 表, 这也是默认的表。另一个则是和后端主机有关的 nat 表,至于 mangle 较少使用,这些部分会在最后讨论。

本机的 iptables 语法规则

由于不同的 table 他们的链也不一样,导致使用的指令语法或多或少都有点差异。 在这个小节当中,我们主要将针对 filter 这个预设表格的三条链(input, forward, output)来做介绍

查看规则
# iptables [-t tables] [-L] [-nv]
选项与参数:
-t :后面接 table ,例如 nat 或 filter ,若省略此项目,则使用预设的 filter
-L :列出目前的 table 的规则
-n :不进行 IP 与 HOSTNAME 的反查,显示结果的速度会快很多!
-v :列出更多的信息,包括通过该规则的数据包总位元数、相关的网路接口等

Example

# iptables -L -n

# iptables -t nat -nL
  • Chain 就是链
  • policy 就是默认的规则
  • target:代表进行的动作, ACCEPT 是放行,而 REJECT 则是拒绝,此外,还有 DROP (丢弃) 的项目!
  • prot:protocol 的简写,代表使用的数据包协议,主要有 tcp, udp 及 icmp 三种数据包格式;
  • opt:额外的选项说明
  • source :代表此规则是针对哪个『来源 IP』进行限制
  • destination :代表此规则是针对哪个『目标 IP』进行限制

也可以使用 iptables-save 命令来查看规则,这个输出的比较完整,不过没有格式化输出。


[root@jenkins ~]# iptables-save
# Generated by iptables-save v1.4.7 on Fri Jul 22 15:51:52 2011
*filter                      <==星号开头的指的是表格,这里为 filter
:INPUT ACCEPT [0:0]          <==冒号开头的指的是链,三条内置的链
:FORWARD ACCEPT [0:0]        <==三条内置链的政策都是 ACCEPT
:OUTPUT ACCEPT [680:100461]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT <==针对 INPUT 的规则
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT  <==这条很重要!针对本机内部接口开放!
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited <==针对 FORWARD 的规则
COMMIT
# Completed on Fri Jul 22 15:51:52 2011
清除规则
[root@www ~]# iptables [-t tables] [-FXZ]
选项与参数:
-F :清除所有的已设置的规则;
-X :杀掉所有用户 "自定义" 的 chain;
-Z :将所有的 chain 的计数与流量统计都归零

以上选项都不会清除默认的规则

设置规则

设置规则的小技巧是先清除所有的规则,然后一条一条的添加。

当然前提是默认的表中的 INPUT 链默认的规则必须是 ACCEPT 接受, 不然假如是远程操作的话,连自己就会别拒掉。

默认规则: 默认规则就是处理没有符合到任何一个规则的数据包的策略。

设置默认策略语法

[root@www ~]# iptables [-t nat,filter,mangel,raw] \
-P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]

选项与参数:
-P :定义默认规则( Policy )。注意,这个 P 为大写
ACCEPT :该数据包可接受
DROP   :该数据包直接丢弃,不会让 client 端知道为何被丢弃。

以下规则是生产环境下使用的默认规则,不要在实验的时候轻易设置

就是将进入本机的数据包默认是拒绝的,出去的数据包和需要转发的数据包都是放行的。

# 先添加这个规则
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@www ~]# iptables -P INPUT   DROP    
[root@www ~]# iptables -P OUTPUT  ACCEPT
[root@www ~]# iptables -P FORWARD ACCEPT

一般规则

语法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KR8o1Kb5-1658457000489)(assets/image-20210204073616994.png)]

关于 LOG

LOG 这个动作仅仅用于记录,并且不会影响这个数据包的其他规则的比对

就是把符合规则的数据包记录到 /var/log/messages 日志中

iptables -A INPUT -s 192.168.1.100 -j LOG

开放本机回环接口的所有数据包流向(就是开放本地访问自己)

iptables -A INPUT -i lo -j ACCEPT

注意这里没有使用 -s-d ,表示

1 不论数据包来自那里,目的地是 lo 接口的都允许通过。

2 或者只要是从 lo 接口发出去的数据包,不论目的地是哪里,都允许通过。

这也说明了一个默认规则:没有指定的参数,则表示该参数代表的值都完全接受。

// 允许ping
# iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

// 允许接受本机请求之后的返回数据 RELATED,是为FTP设置的
# iptables -A INPUT -m state --state  RELATED,ESTABLISHED -j ACCEPT

// 拒绝其他的所有入站
# iptables -P INPUT DROP

// 开放所有从本机的出站
# iptables -P OUTPUT ACCEPT

// 拒绝所有的转发
# iptables -P FORWARD DROP
关于 TCP 和 UDP 的规则
iptables [-AI 链] [-io 网络接口]  [-p tcp,udp] \
[-s 来源 IP/网段] [--sport 端口范围] \
[-d 目标 IP/网段] [--dport 端口范围] \
-j [ACCEPT,DROP,REJECT]

-s 192.168.1.3

-s 192.168.1.0/24

--sport 1024:65534 # 表示 从 1024 开,到 65534 端口结束

--dport 22

--dport ssh

只允许 192.168.1.0/24 网段的 1024到65534 端口访问本机的 22 端口

iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 \
--sport 1024:65534 --dport ssh -j ACCEPT
关于状态的规则

想想这样的场景,你的某一台服务器,只允许自己直接连接到其他主机,但是其他主机的主动连接是拒绝的。

换句话说,只要是我主动找你后,你在找我,是允许的,但是你主动找我的时候,我是拒绝的。

[root@www ~]# iptables -AI INPUT [-m state] [--state 状态]
选项与参数:
-m :一些 iptables 的外挂模块,主要常见的有:
     state :TCP 状态模块
     mac   :网卡的 mac 地址 (hardware address)
--state :一些数据包的状态,主要有:
     INVALID    :无效的数据包,例如资料破损的数据包状态
     ESTABLISHED:已经连线成功的连线状态;
     NEW        :想要新建立连线的数据包状态;
     RELATED    :这个最常用!表示这个数据包是与我们主机发送出去的数据包有关

范例:只要已建立或相关数据包就予以通过,只要是不合法数据包就丢弃,注意我们 INPUT 的默认策略是拒绝
[root@www ~]# iptables -A INPUT -m state \
--state RELATED,ESTABLISHED -j ACCEPT
[root@www ~]# iptables -A INPUT -m state --state INVALID -j DROP


范例:针对区域网路内的 aa:bb:cc:dd:ee:ff 主机开放其连线
[root@www ~]# iptables -A INPUT \
-m mac --mac-source aa:bb:cc:dd:ee:ff \
-j ACCEPT
选项与参数:
--mac-source :就是来源主机的 MAC 
MAC 地址不能跨路由
最简单的一般主机防火墙规则

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-35SjQQ9m-1658457000489)(assets/image-20210204092648786.png)]

具体命令

1.清除规则


iptables -F
iptables -X
iptables -Z

2.设置默认规则

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
  1. 按照具体需求制定规则
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i etho -m state --state RELATED, ESTABL ISHED -j ACCEPT
#iptables -A INPUT -i eth0 -S 192.168.1.0/24 -j ACCEPT
  1. 保存规则

默认情况下,这些规则只能在当前生效,假如重启的服务器,将会丢失这些规则。

要想保存策略,需要安装 iptables 的服务

yum install -y iptables-services

之后启动服务

systemctl start iptables.service
systemctl enable iptables.service

之后使用 iptables-save > /etc/sysconfig/iptables 命令讲当前的规则保存

这样即使机器重启也不会丢失防火墙的规则了。

常用服务开放规则

# 5. 允许某些服务的进入,请依照你自己的环境开启
## FTP
# iptables -A INPUT -p TCP -i $EXTIF --dport  21 --sport 1024:65534 -j ACCEPT 

## SSH
# iptables -A INPUT -p TCP -i $EXTIF --dport  22 --sport 1024:65534 -j ACCEPT 

## SMTP
# iptables -A INPUT -p TCP -i $EXTIF --dport  25 --sport 1024:65534 -j ACCEPT 

## DNS
# iptables -A INPUT -p UDP -i $EXTIF --dport  53 --sport 1024:65534 -j ACCEPT 
# iptables -A INPUT -p TCP -i $EXTIF --dport  53 --sport 1024:65534 -j ACCEPT 

## WWW
# iptables -A INPUT -p TCP -i $EXTIF --dport  80 --sport 1024:65534 -j ACCEPT 
## HTTPS
# iptables -A INPUT -p TCP -i $EXTIF --dport 443 --sport 1024:65534 -j ACCEPT

## POP3
# iptables -A INPUT -p TCP -i $EXTIF --dport 110 --sport 1024:65534 -j ACCEPT 

 
[root@www ~]# mkdir -p /usr/local/shark/iptables
[root@www ~]# cd /usr/local/shark/iptables
[root@www iptables]# vim iptables.rule
#!/bin/bash

## 请先输入您的相关参数,不要输入错误了!
  EXTIF="eth0"             # 这个是可以连上 Public IP 的网卡名称
  INIF="eth1"              # 内网 LAN 的网卡名称;若无则写成 INIF=""
  INNET="192.168.100.0/24" # 若内网地址,请填写成 INNET=""
  export EXTIF INIF INNET

## 第一部份,针对本机的防火牆设定!##########################################
## 1. 先设定好核心的网路功能:
  echo "1" > /proc/sys/net/ipv4/tcp_syncookies  # 防止 DDOS 攻击
  echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts # 防止非法 ping  包
  for i in /proc/sys/net/ipv4/conf/*/{rp_filter,log_martians}; do
      echo "1" > $i
  done
  for i in /proc/sys/net/ipv4/conf/*/{accept_source_route,accept_redirects,\
send_redirects}; do
        echo "0" > $i
  done

## 2. 清除规则、设定默认策略及开放 lo 与相关的设定值
  PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
  iptables -F
  iptables -X
  iptables -Z
  iptables -A INPUT -t tcp --dport 22 -j ACCEPT
  iptables -P INPUT   DROP
  iptables -P OUTPUT  ACCEPT
  iptables -P FORWARD ACCEPT
  iptables -A INPUT -i lo -j ACCEPT
  iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

## 3. 启动额外的防火牆 script 模组
  if [ -f /usr/local/shark/iptables/iptables.deny ]; then
        sh /usr/local/shark/iptables/iptables.deny
  fi
  if [ -f /usr/local/virus/iptables/iptables.allow ]; then
        sh /usr/local/virus/iptables/iptables.allow
  fi
  if [ -f /usr/local/virus/httpd-err/iptables.http ]; then
        sh /usr/local/virus/httpd-err/iptables.http
  fi

## 4. 允许某些类型的 ICMP 数据包进入
  AICMP="0 3 3/4 4 11 12 14 16 18"
  for tyicmp in $AICMP
  do
    iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT
  done

# 5. 允许某些服务的进入,请依照你自己的环境开启
## FTP
# iptables -A INPUT -p TCP -i $EXTIF --dport  21 --sport 1024:65534 -j ACCEPT 

## SSH
# iptables -A INPUT -p TCP -i $EXTIF --dport  22 --sport 1024:65534 -j ACCEPT 

## SMTP
# iptables -A INPUT -p TCP -i $EXTIF --dport  25 --sport 1024:65534 -j ACCEPT 

## DNS
# iptables -A INPUT -p UDP -i $EXTIF --dport  53 --sport 1024:65534 -j ACCEPT 
# iptables -A INPUT -p TCP -i $EXTIF --dport  53 --sport 1024:65534 -j ACCEPT 

## WWW
# iptables -A INPUT -p TCP -i $EXTIF --dport  80 --sport 1024:65534 -j ACCEPT 

## POP3
# iptables -A INPUT -p TCP -i $EXTIF --dport 110 --sport 1024:65534 -j ACCEPT 

## HTTPS
# iptables -A INPUT -p TCP -i $EXTIF --dport 443 --sport 1024:65534 -j ACCEPT 

## 第二部份,针对后端主机的防火牆设定!###############################
## 1. 先载入一些有用的模组
  modules="ip_tables iptable_nat ip_nat_ftp ip_nat_irc ip_conntrack ip_conntrack_ftp ip_conntrack_irc"
  for mod in $modules
  do
      testmod=`lsmod | grep "^${mod} " | awk '{print $1}'`
      if [ "$testmod" == "" ]; then
            modprobe $mod
      fi
  done

## 2. 清除 NAT table 的规则!
  iptables -F -t nat
  iptables -X -t nat
  iptables -Z -t nat
  iptables -t nat -P PREROUTING  ACCEPT
  iptables -t nat -P POSTROUTING ACCEPT
  iptables -t nat -P OUTPUT      ACCEPT

## 3. 若有内部网络的存在 (双网卡) 开放成为路由器!
  if [ "$INIF" != "" ]; then
    iptables -A INPUT -i $INIF -j ACCEPT
    echo "1" > /proc/sys/net/ipv4/ip_forward
    if [ "$INNET" != "" ]; then
        for innet in $INNET
        do
            iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE
        done
    fi
  fi
  # 如果你的 MSN 一直无法连线,或者是某些网站 OK 某些网站不 OK,
  # 可能是 MTU 的问题,那你可以取消底下这一行,来启动 MTU 限制范围
  # iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu

## 4. 开放 NAT 服务器后端的内网中的服务
# iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 80 -j DNAT --to-destination 192.168.1.210:80 # WWW

## 5. 特殊的功能,包括 Windows 远端桌面所产生的规则,假设桌面主机为 1.2.3.4
# iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4  --dport 6000 \
#          -j DNAT --to-destination 192.168.100.10
# iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4  --sport 3389 \
#          -j DNAT --to-destination 192.168.100.20

# 6. 最终将这些功能储存下来!
 iptables-save > /etc/sysconfig/iptables
ICMP类型值有:

icmp-echoreply, 
icmp-sourcequench, 
icmp-unreach,
icmp-redirect, icmp-echo, icmp-routeradvert, icmp-routersolicit, icmp-timxceed, icmp-paramprob, icmp-tstamp, icmp-tstampreply, icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply

TCP标记值:

tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-push, tcp-ack, tcp-urg

这样上面按照TCP标记位抓包的就可以写直观的表达式了:

只抓SYN包
tcpdump -i eth1 'tcp[tcpflags] = tcp-syn'
抓SYN, ACK
tcpdump -i eth1 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0'

NAT 网络地址转换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xweuk6Lp-1658457000490)(assets/image-20180802160202419.png)]

前提条件

开启防火墙主机的路由功能

[root@iptables_3_to_10 ~]# echo "1" > -[
[root@iptables_3_to_10 ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_use_pmtu = 0
SNAT

路由后修改源地址

设置客户端的默认路由(有的时候也叫做网关)为防火墙的内网网址

// 删除原有的默认路由
# ip route del default via 192.168.122.1

// 添加默认路由为 防火墙的内网 IP
# ip route add default viq 192.168.122.3

// 查看路由表
# ip route

使用伪装实现 SNAT

适用于 NAT 服务器的外网 IP 不固定的情况


iptables -t nat -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -o eth0 -j MASQUERADE

MASQUERADE 会自动识别出 外网网卡 eth0 的 IP,并把数据包包头中的源地址修改为此地址

不使用伪装

适用于 NAT 服务器的外网 IP 地址是可以固定的情况

下面的语句是直接指定修改数据包包头中源地址为自己外网的地址,这里是 10.10.10.1

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.10.10.1

下面的情况是适用于 NAT 服务器的外网 IP 有多个的情况,可以轮流使用它们

其实,当局域网内的主机够多的话,一个外网 IP 的连接数是有限的。

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source \
10.10.10.1-10.10.10.10
DNET 目标地址转换(或端口转发)

路由前修改,目标地址和端口

将访问本机 80 端口的数据包转发到 192.168.100.10 服务器的 80端口

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.10:80 
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.10:8080 

本机端口转发:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 800 -j REDIRECT --to-ports  22
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shark_西瓜甜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值