Chinaunix首页 | 论坛 | 博客
  • 博客访问: 313492
  • 博文数量: 84
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 890
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-13 16:46
文章分类

全部博文(84)

文章存档

2017年(2)

2016年(4)

2015年(78)

我的朋友

分类: LINUX

2015-07-16 14:31:53

封包进入本机时,会通过防火墙、服务器软件程序、SELinux与文件系统等

最小化安装的linux,之后实验安装http、dns等无论如何配置配置文件,就是无法访问服务,后发现是iptables也就是防火墙捣的鬼!还有一个东西就是SELinux,这两个服务默认都是开启的,所以你最好不要不负责任的关闭它,而是配置它,搞了一天iptables收集到就是这些,至于iptables的nat和postrouting部分暂不研究。以下的研究主要针对服务器开放服务端口方面的设置
参数:

-A:新增加一条规则,该规则增加在原本规则的最后面。例如原本已经有四条规则,使用 -A 就可以加上第五条规则!

-I:插入一条规则。如果没有指定此规则的顺序,默认是插入变成第一条规则。例如原本有四条规则,使用 -I 则该规则变成第一条,而原本四条变成 2~5 号

-D:删除一条规则,如删除iptables-save中的第3条规则iptables -D INPUT 3

-F:清除,但清除不了大P参数

-P:(大P) 定义策略( Policy即INPUT/FORWARD/OUTPUT )

-L:列出目前的 table 的规则,默认为filter(iptables -L -t nat直接使用-L表示列出filter表,-t nat表示列出nat表的规则)

-t:后面接 table ,例如 nat 或 filter ,若省略此项目,则使用默认的 filter

-i:封包所进入的那个网络接口,例如 eth0, lo 等接口。需与 INPUT 链配合;

-o:封包所传出的那个网络接口,需与 OUTPUT 链配合;

-p:(小p)后面跟协议(tcp/udp/icmp/all)

-s: 来源 IP/网域:设定此规则之封包的来源项目,可指定单纯的 IP 或包括网域,例如:IP :192.168.0.100网域:192.168.0.0/24, 192.168.0.0/255.255.255.0 均可。若规范为"不许"时,
则加上 ! 即可,例如:-s ! 192.168.100.0/24 表示不许 192.168.100.0/24 之封包来源;
-d:目标 IP/网域:同 -s ,只不过这里指的是目标的 IP 或网域。

--sport:范围:限制来源的端口号码,端口号码可以是连续的

--dport:埠口范围:限制目标的端口号码,端口号码可以是连续的,例如iptables -A INPUT -i eth0 -p udp --dport 137:138 -j ACCEPT
不指定-i/-o/-p/-s/-d/--sport/--dport如下面的实例iptables -A INPUT -i lo -j ACCEPT细看上面并没有列出 -s, -d 等等的规则,这表示:不论封包来自何处或去到哪里,只要是来自 lo 这个界面,就予以接受!这个概念挺重要的,就是"没有指定的项目,则表示该项目完全接受"的意思! 例如这个案例当中,关于 -s, -d...等等的参数没有规定时,就代表不论什么值都会被接受啰。
-j:后面接动作,主要的动作有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)及记录(LOG)


常用的ACTION:

ACCEPT:该封包可接受

DROP:该封包直接丢弃,不会让 client 端知道为何被丢弃。

REJECT:明示拒绝


LOG:记录  外挂模块  iptables -A INPUT [-m state] [--state 状态] 
选项与参数:
-m :一些 iptables 的外挂模块,主要常见的有:
 state :状态模块 
 mac   :网络卡硬件地址 (hardware address)

--state :一些封包的状态,主要有:
 INVALID    :无效的封包,例如数据破损的封包状态
 ESTABLISHED:已经联机成功的联机状态;
 NEW        :想要新建立联机的封包状态(NEW参数通常用在INPUT的服务端,表示第一个数据包到达服务器时,状态字段为NEW); 
 RELATED    :这个最常用!表示这个封包是与我们主机发送出去的封包有关 

范例:如果OUTPUT为ACCEPT只要已建立或与我们主机发送出去的封包有关就予以通过,只要是不合法封包就丢弃
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state INVALID -j DROP 

(1)查看规则
iptables-save [-t table]

查看已经保存的配置

more /etc/sysconfig/iptables

查看内存中的配置

iptables-save #列出完整的防火墙规则

iptables -L -n #与iptables-save类似,两个命令输出的配置是同步的,只是没有iptables-save完整。

(2)清除规则
iptables [-t tables] [-FXZ]

选项与参数:

-F :清除所有的已订定的规则;
-X :杀掉所有使用者 "自定义" 的 chain (应该说的是 tables )啰;
-Z :将所有的 chain 的计数与流量统计都归零

(3)设定预设规则
iptables -p INPUT DROP #拒绝所有数据包进入
iptables -p OUTPUT ACCEPT #拒绝所有数据包出去
iptables -p FORWARD DROP #拒绝所有数据包的转发


(4)添加规则.

可以使用iptables -A命令追加新规则,其中-A表示Append。因此,新的规则将追加到链尾
一般而言,最后一条规则用于丢弃(DROP)所有数据包。如果你已经有这样的规则了,并且使用-A参数添加新规则,那么就是无用功,可以参见下的插入规则

首先添加INPUT链,INPUT链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链
iptables -A INPUT 1 -p tcp --dport 22 -j ACCEPT #为了能采用远程SSH登陆,我们要开启22端口.

iptables -A INPUT 1 -p tcp --dport 80 -j ACCEPT #如果做了WEB服务器,开启80端口

iptables -A INPUT 1 -p tcp --dport 110 -j ACCEPT #如果做了邮件服务器,开启25,110端口.

iptables -A INPUT 1 -p tcp --dport 25 -j ACCEPT #如果做了邮件服务器,开启25,110端口.

iptables -A INPUT 1 -p tcp --dport 21 -j ACCEPT #如果做了FTP服务器,开启21端口

iptables -A INPUT 1 -p tcp --dport 20 -j ACCEPT #如果做了FTP服务器,开启20端口

iptables -A INPUT 1 -p tcp --dport 53 -j ACCEPT #如果做了DNS服务器,开启53端口

如果你还做了其他的服务器,需要开启哪个端口,参照/etc/services照写就行了。

iptables -A INPUT -p icmp -j ACCEPT           #允许icmp包通过,也就是允许ping,

iptables –A INPUT –s 192.168.0.2 –j DROP   #在input方向拒绝192.168.0.2的访问
iptables –A INPUT –s 192.168.0.2 –j ACCEPT #在input方向允许192.168.0.2的访问

(5)插入规则

iptables -I INPUT -s 192.168.0.2 -j DROP #默认插到第1个位置
iptables -I INPUT 2 -s 192.168.0.2 -j DROP #插到第2个位置

(6)删除规则

iptables -D INPUT 3
iptables -D INPUT -s 192.168.0.2 -j DROP


(7)记录某个规则的纪录

在INPUT链中默认规则是DROP,所有没有匹配到列表的数据包会被丢弃。

但是有时我们想看一下被iptables丢弃的数据包,比如以前没有开启iptables,开启iptables有可能会丢弃正常的数据包,或后安装的某项服务如http,这时除非你更新iptables配置否则用户

将无法访问你的服务器。

我们可以使用iptables中的LOG动作来对这些数据进行记录。

最简单的使用办法
iptables -I INPUT x -j LOG #x表示行,插入到第多少行之意

这样我们就可以把匹配上iptables规则的数据包写到/var/log/messages中。

因为iptables是按照自上而下的顺序对数据包进行匹配,所以在最底下DROP的上面插入LOG记录,也就是记录了执行默认规则的数据包。


iptables -A INPUT -s 192.168.2.200 -j LOG #那么该封包的相关信息就会被写入到核心讯息,亦即是 /var/log/messages 这个档案当中,也会记录到dmesg日志中即/var/log/dmesg。


我做了一个测试,将iptables种关于80的接受规则删除,然后在INPUT DROP前插入iptables -I INPUT x -j LOG,使用其他客户端访问服务器的80服务,得到的日志是:只有SYN报文

[root@bogon ~]# tail -f /var/log/messages

Jul 16 16:31:48 localhost kernel: IN=eth0 OUT= MAC=00:0c:29:cb:b0:20:00:5a:39:b9:18:75:08:00 SRC=192.168.1.124 DST=192.168.1.130 LEN=48 TOS=0x00 PREC=0x00 TTL=64 ID=9371 DF PROTO=TCP SPT=54714 DPT=80 WINDOW=8192 RES=0x00 SYN URGP=0

Jul 16 16:31:48 localhost kernel: IN=eth0 OUT= MAC=00:0c:29:cb:b0:20:00:5a:39:b9:18:75:08:00 SRC=192.168.1.124 DST=192.168.1.130 LEN=48 TOS=0x00 PREC=0x00 TTL=64 ID=9373 DF PROTO=TCP SPT=54716 DPT=80 WINDOW=8192 RES=0x00 SYN URGP=0

Jul 16 16:32:00 localhost kernel: IN=eth0 OUT= MAC=00:0c:29:cb:b0:20:00:5a:39:b9:18:75:08:00 SRC=192.168.1.124 DST=192.168.1.130 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=9381 DF PROTO=TCP SPT=54717 DPT=80 WINDOW=8192 RES=0x00 SYN URGP=0

Jul 16 16:32:00 localhost kernel: IN=eth0 OUT= MAC=00:0c:29:cb:b0:20:00:5a:39:b9:18:75:08:00 SRC=192.168.1.124 DST=192.168.1.130 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=9383 DF PROTO=TCP SPT=54718 DPT=80 WINDOW=8192 RES=0x00 SYN URGP=0

Jul 16 16:32:03 localhost kernel: IN=eth0 OUT= MAC=00:0c:29:cb:b0:20:00:5a:39:b9:18:75:08:00 SRC=192.168.1.124 DST=192.168.1.130 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=9415 DF PROTO=TCP SPT=54717 DPT=80 WINDOW=8192 RES=0x00 SYN URGP=0

Jul 16 16:32:03 localhost kernel: IN=eth0 OUT= MAC=00:0c:29:cb:b0:20:00:5a:39:b9:18:75:08:00 SRC=192.168.1.124 DST=192.168.1.130 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=9417 DF PROTO=TCP SPT=54718 DPT=80 WINDOW=8192 RES=0x00 SYN URGP=0


(8)保存规则

保存方式有3种

/etc/init.d/iptables save

service iptables save

iptables-save > /etc/sysconfig/iptables #这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.


(9)使规则生效(如果是手工编写的/etc/sysconfig/iptables)

service iptables restart #会读写一次/etc/sysconfig/iptables文件


我机器里的一些默认的iptables防火墙配置

如果/etc/sysconfig/iptables保存过(iptables–save > /etc/sysconfig/iptables)那么结果就与iptables –L –n相同,也与iptables-save相同

[root@localhost ~]# more /etc/sysconfig/iptables

# Firewall configuration written by system-config-firewall

# Manual customization of this file is not recommended.


*filter              #星号开头的指的是表格,这里为 filter 


:INPUT ACCEPT [0:0] #冒号开头的指的是链,三条内建的链三条内建链的政策都是 ACCEPT


:FORWARD ACCEPT [0:0] 


:OUTPUT ACCEPT [456:1322] #方括号内的数字表示the OUTPUT chain matched 456 packets and 1322 bytes

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

-A INPUT -p icmp -j ACCEPT #安装系统时开启防火墙的默认配置允许input方向的ping

-A INPUT -i lo -j ACCEPT #-i表示输入接口lo,input方向的一切都允许,默认的配置

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT #允许远程主机的SSH请求,当SSH客户端第一个数据包到达服务器时,状态字段为NEW;

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT #允许远程主机的SSH请求,当HTTP客户端第一个数据包到达服务器时,状态字段为NEW;

-A INPUT -j REJECT --reject-with icmp-host-prohibited #全部进入的封包信息通通拒绝

-A FORWARD -j REJECT --reject-with icmp-host-prohibited #全部转发的封包信息通通拒绝

COMMIT #提交

[root@localhost ~]# iptables -L -n

Chain INPUT (policy ACCEPT)

target prot opt source destination

ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED #只要是封包状态为 RELATED,ESTABLISHED 就予以接受

ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 #只要封包协议是 icmp 类型的,就予以放行

ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 #无论任何来源 (0.0.0.0/0) 且要去任何目标的封包,不论任何封包格式 (prot 为 all),通通都接受

ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 #只要是传给 port 22 的主动式联机 tcp 封包就接受

ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80 #只要是传给 port 80的主动式联机 tcp 封包就接受

REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited #全部的封包信息通通拒绝


Chain FORWARD (policy ACCEPT)

target prot opt source destination

REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited


Chain OUTPUT (policy ACCEPT)

target prot opt source destination

[root@localhost ~]#

最有趣的应该是第 3 条规则了,怎么会所有的封包信息都予以接受?如果都接受的话,那么后续的规则根本就不会有用! 其实那条规则是仅针对每部主机都有的内部循环测试网络 (lo) 接口!

如果没有列出接口,那么我们就很容易搞错啰~ 所以,近来鸟哥都建议使用 iptables-save 这个指令来观察防火墙规则啦!因为 iptables-save 会列出完整的防火墙规则,只是并没有规格化输出而已。


其他的练习

[root@localhost init.d]# iptables-save #查看iptables规则内容

# Generated by iptables-save v1.4.7 on Thu Jul 16 14:48:12 2015

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [5:700]

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

-A INPUT -p icmp -j ACCEPT

-A INPUT -i lo -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 53 -j ACCEPT

-A INPUT -p udp -m state --state NEW -m udp --dport 53 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -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

COMMIT

# Completed on Thu Jul 16 14:48:12 2015

[root@localhost init.d]# service iptables save #保存iptables的配置

iptables:将防火墙规则保存到 /etc/sysconfig/iptables: [确定]

[root@localhost init.d]# iptables -I INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT #插入一条接受http访问的规则

[root@localhost init.d]# iptables-save

# Generated by iptables-save v1.4.7 on Thu Jul 16 14:50:12 2015

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [5:700]

-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT #新加入的内容在这

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

-A INPUT -p icmp -j ACCEPT

-A INPUT -i lo -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 53 -j ACCEPT

-A INPUT -p udp -m state --state NEW -m udp --dport 53 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -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

COMMIT

# Completed on Thu Jul 16 14:50:12 2015

[root@localhost init.d]#

阅读(6462) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~