菜鸟学Linux 第066篇笔记 简单配置iptables




Linux 网络防火墙

netfilter: frame

iptables: 数据报文过滤,NAT, mangle 等规则生成的工具


网络: IP报文首部, TCP报文首部


ip 协议


tcp protocol

三次握手

四次断开



防火墙 硬件, 软件: 规则(匹配标准,处理办法)

framework

默认规则

开放:堵

关闭:通


规则:匹配标准

IP:源IP,目标IP

TCP: 源port, 目标port

UDP: 源port, 目标port

ICMP:icmp-type


Linux2.0

ipfw/firewall


Linux 2.2

ipchain/firewall


Linux2.4

iptables/netfilter



hock function: 勾子函数

prerouting

input

output

forward

postrouting


规则链

PREROUTING

INPUT

FORWARD

OUTPUT

POSTROUTING



filter(过滤) 表

INPUT

OUTPUT

FORWARD



nat(地址转换) 表

PREROUTING

OUTPUT

POSTROUTING



mangle(拆开、修改、封装) 表

PREROUTING

INPUT

FORWARD

OUTPUT

POSTROUTING



raw() 表

PREROUTING

OUTPUT




iptables

不是服务,但有服务脚本,服务脚本的主要作用在于管理保存规则

装载或移除iptables/netfilter相关的内核模块




能否使用自定义链?

可以使用自定义链,但只在被调用时才能发挥作用,而且如果没有自定义链中的任何规则匹配,还应该有返回机制;


用户可以删除自定义的空链;

默认链无法删除


每个规则都有两个内置的计数器

被匹配的报文个数

被匹配的报文大小之和



规则:匹配标准,处理动作

匹配标准:

通用匹配

-s, --src

-d, --dst

-p,{tcp|udp|icmp}

-i, INTERFACE 数据报文流入接口

可用于定义标准的链:PREROUTING, INPUT, FORWARD

-o, INTERFACE 数据报文流出接口

可用于定义标准的链:OUTPUT, POSTROUTING, FORWARD

扩展匹配

隐含扩展:不用特别指明由哪个模块进行的扩展,因为使用-p {tcp|udp|icmp}

-p tcp

--sport PORT 源端口

--dport PORT 目标端口

--tcp-flags mask comp 只检查指定的标志位,是逗号分隔的标志位

--tcp-flags SYN,FIN,ACK,RST SYN,ACK

mask 0 comp 1

-p icmp

--icmp-type

0: echo-reply

8: echo-request

-p udp

--sport

--dport


显式扩展:必须指明哪个模块进行的扩展,在iptables中使用-m选项完成此功能

-m EXTENSION --spe-opt

state: 状态扩展

结合ip_conntrack追踪会话的状态

NEW 新连接请求

ESTABLISHED 已经建立的连接

INVALID 非常连接

RELATED 相关联的

-m state --state NEW,ESTABLISHED -j ACCEPT


multiport 离散的多端口匹配扩展

--source-ports

--destination-ports

--ports

-m multiport --destination-ports 21,22,80 -j ACCEPT



保存规则:

# service iptables save  (将现配置的规则保存)

/etc/sysconfig/iptables

# iptables-save > /etc/sysconfig/iptables.20161231(明确指定要保存的位置)

# iptables-restore < /etc/sysconfig/iptables.20161231 (读取保存的规则)




添加规则

iptables [-t TABLE] COMMAND CHAIN [num] 匹配标准 -j 处理办法



-j TARGET

ACCEPT

DROP

REJECT



iptables/netfilter:

iptables

filter, nat, mangle, raw


filter

INTPU, FORWARD, OUTPUT

nat

PREROUTING(DNAT), OUTPUT, POSTROUTING(SNAT)

mangle

PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

raw

PREROUTING, OUTPUT


CHAN

PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING




netfilter: Framework, tcp/ip, 内核中




命令COMMAND

管理规则

-A 附加一条 规则,添加在链的尾部append

-I CHAIN [num] 插入一条规则,插入为对应CHAIN上的第num条insert ;

-D CHAIN [num] 删除指定链中的第num条规则delete

-R CHAIN [num] 替换指定的规则replace


管理链

-F [CHAIN] 清空指定规则链flush

-p CHAIN 设定指定链的默认策略

-N 自定义一个新的空链

-X 删除一个自定义的空链

-Z 置零指定链中所有规则的计数器

-E 重命名自定义链

查看类

-L 显示指定表中的规则

-n 以数字格式显示主机地址和端口号

-v 显示链及规则的详细信息

-x 显示精确值

--line-numbers 显示规则号码



动作(target)

ACCEPT

DROP

REJECT

DNAT

SNAT

REDIRECT

MASQUERADE 伪装

LOG

MARK



放行示例:


ssh 放行

# iptables -t filter -A OUTPUT -s 192.168.11.122 -d 192.168.11.0/24 -p tcp --sport 22 -j ACCEPT

# iptables -t filter -A INPUT -s 192.168.11.0/24 -d 192.168.11.122 -p tcp --dport 22 -j ACCEPT



修改默认链的默认策略

# iptables -t filter -P FORWARD DROP

# iptables -t filter -P OUTPUT DROP

# iptables -t filter -P INPUT DROP



放行 http 80

# iptables -t filter -I OUTPUT -s 192.168.11.122 -p tcp --sport 80 -j ACCEPT

# iptables -t filter -I INPUT -d 192.168.11.122 -p tcp --dport 80 -j ACCEPT



放行本地lo 

# iptables -t filter -A OUTPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -o lo -j ACCEPT

# iptables -t filter -A INPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -i lo -j ACCEPT



可以自己ping其它主机,而不允许其它主机ping自己

# iptables -t filter -A OUTPUT -s 192.168.11.122 -p icmp --icmp-type 8 -j ACCEPT

# iptables -t filter -A INPUT -d 192.168.11.122 -p icmp --icmp-type 0 -j ACCEPT



想想DNS如果要放行的话应该建立几条?

8条 

4条tcp

2条input 

1条为本地客户端向本地DNS服务器请求地址解析(递归)

1条为远程DNS服务器向本地的DNS服务器发送解析结果

2条output

1条为本地服务器向远端DNS服务器请求地址解析(迭代)

1条为本地DNS服务器向本地客户端发送解析结果

4条udp

同上,只是此为udp 端口




优化iptables 规则条目


放行所有服务器已经建立会话出去的包

iptables -t filter -I OUTPUT -s 192.168.11.122 -m state --state ESTABLISHED -j ACCEPT


ftp 放行需要单加模块在iptables配置文件

/etc/sysconfig/iptables-config

ip_nat_ftp

然后需要在进入和出口方向加入 RELATED


INPUT

第一条放行所有已经建立的和相关联的规则

iptables -t filter -I INPUT -d 192.168.11.122 -m state --state ESTABLISHED,RELATED -j ACCEPT


多端口一条匹配NEW

iptables -t filter -I INPUT 2 -d 192.168.11.122 -p tcp -m multiport --destination-ports 22,80,21 -m state --state NEW -j ACCEPT