初窥netfilter/iptables

做这个东西太麻烦了,一不小心,就被自己关门外了。

----------------------------------------------

一、前言

二、环境

三、语法解析

四、配置及测试

1.SNAT案例

2.DNAT案例

3.SSH案例

4.SSH深入案例(自定义规则)

5.web和ftp(自定义规则)

6.web和ftp(系统默认规则)

五、保存

----------------------------------------------



一、前言

    iptables即Linux 内核集成的 IP 信息包过滤系统,如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。

    netfilter/iptables即包过滤,仅能应用在网络层 【来源地址、目标地址、协议(ip icmp arp rarp等)】和传输层【协议(tcp/udp)、端口号(来源端口,目标端口)、tcp标志位(syn ack fin rst)、状态(ESTABLISHED,NEW,INVALID,RELATED)】,如果想在应用层过滤可以使用L7项目,现已停止维护。


二、环境

CentOS6.4 32位

三、语法解析

netfilter框架:

1.filter:防火墙策略过滤

     INPUT         针对防火墙自身的访问(比如内网或外网访问web,mysql)

     OUTPUT        源自于防火墙的访问  (比如自身访问内网或外网的资源)

     FORWARD       穿越防火墙的访问

2.nat:NAT转换

     POSTROUTING   SNAT 源地址转换  (内部访问外部)

     PREROUTING    DNAT 目标地址转换(外部访问内部)

     OUTPUT

3.mangle:数据包的QOS(服务质量),不常用

     INPUT

     OUTPUT

     FORWARD

     POSTROUTING

     PREROUTING


基本语法:

iptables -t 表格名称  指令 chain  选项 参数 -j 动作


表格名称:

-t  

   filter  【INPUT OUTPUT FORWARD】

   nat     【POSTROUTING PREROUTING OUTPUT】

   mangle  【INPUT OUTPUT FORWARD POSTROUTING PREROUTING 】


指令:

-L   --list                     查看规则列表

-A   --append                   在规则列表的最后增加1条规则

-D   --delete    chain 编号     从规则列表中删除指定的规则

-I   --insert    chain 编号     在指定的位置插入1条规则

-R   --replace   chain 编号     替换规则列表中的某条规则

-P   --policy    chain          定义默认策略

-N   --new-chain                用户自定义的链名

-X   --delete-chain             删除filter表中所有用户自定义链(系统内置的链无法清除)

-F   --flush     chain          清除filter表中(或某一链中)的所有规则(包括系统内置的链上的所有规则,以及用户自定义的链上的所有规则)

-n   --numeric                  以易读的数字方式显示

-v   --verbose                  详细信息

--line-numbers                  显示规则的编号

选项  参数:

来源   -s  --source      地址/子网/网络

      -i  指定数据包从哪个网络接口进入,如ppp0、eth0和eth1等(注意:该参数只能用于INPUT,  FORWARD  and PREROUTING这三个链)

目标   -d  --destination 地址/子网/网络

      -o  指定数据包从哪块网络接口输出,如ppp0、eth0和eth1等(注意:该参数只能用于OUTPUT,  POSTROUTING这两个链)

协议   -p  tcp/udp       --sport 源端口号  --dport  目标端口号

          icmp          --icmp-type  

模块:

-m   模块名称  参数


动作:

    ACCEPT      接受数据包  

    REJECT/DROP 丢弃数据包,REJECT与DROP基本一样,区别在于它除了阻塞包之外, 还向发送者返回错误信息

    SNAT        源地址转换

    DNAT        目标地址转换

    REDIRECT    重定向


规则的应用顺序:从上到下的,最后才是默认规则


四、配置及测试

1.SNAT案例


# vim /etc/sysctl.conf
 7 net.ipv4.ip_forward = 1    //开启路由转发功能
# sysctl -p
# iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth2 -j SNAT --to 192.168.1.105
# iptables -t nat -L -n -v --line-number
Chain PREROUTING (policy ACCEPT 68 packets, 5606 bytes)
num   pkts bytes target     prot opt in     out     source               destination
Chain POSTROUTING (policy ACCEPT 1 packets, 70 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 SNAT       all  --  *      eth1    192.168.2.0/24       0.0.0.0/0           to:192.168.1.105
Chain OUTPUT (policy ACCEPT 1 packets, 70 bytes)
num   pkts bytes target     prot opt in     out     source               destination


此时,PC1 ping 192.168.1.1(外网网关),可能会不同,显示Destination Host Prohibited

查找原因,是因为filter中的FORWARD链(穿越防火墙的访问)有一条默认规则,关掉即可。

# iptables -t filter -L
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
# iptables -t filter -F FORWARD

此时,PC1就可以连接外网了。

如果外网上有一个ftp服务器,通过浏览器访问是没问题的,但是命令行访问是没有数据的,需要加载一个模块即可。

# modprobe  ip_nat_ftp

如果,eth2的地址是动态的怎么办,需要地址伪装。

# iptables -t nat -R POSTROUTING 1 -s 192.168.2.0/24 -o eth2 -j MASQUERADE   //地址伪装

snat总结

# iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth2 -j SNAT --to 192.168.1.105   (wan口地址,静态)
# iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth2 -j MASQUERADE                 (wan口动态地址)


2.DNAT案例(多用于服务器的发布)

# iptables -t nat -A PREROUTING -d 192.168.1.105 -p tcp --dport 3389 -j DNAT --to 192.168.2.100
# iptables -t nat -L -v
Chain PREROUTING (policy ACCEPT 39 packets, 3231 bytes)
 pkts bytes target     prot opt in     out     source               destination
    4   204 DNAT       tcp  --  any    any     anywhere             192.168.1.105       tcp dpt:ms-wbt-server to:192.168.2.100

在外网就可以远程连接内网中的PC1,连接地址是192.168.1.105。


3.防火墙对SSH服务设置

针对INPUT:

--dport和-d都是指自己的端口和地址

--sport和-s是指发起连接者的端口和地址


针对OUTPUT:

--sport和-s都是指自己的端口和地址

--dport和-d是指发起连接者的端口和地址

(1)作为ssh服务器时的设置

# iptables -A INPUT  -p tcp --dport 22 -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

(2)作为客户机连接ssh服务

# iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT
# iptables -A INPUT  -p tcp --sport 22 -j ACCEPT

注意:ssh连接本机ip是服务器作为客户机连接ssh服务的一特例。

上面对ssh服务设置的规则有漏洞,如果黑客利用网络包欺骗,便可入侵服务;只有当服务器iptables对发出包的进行验证,如果是已经建立的连接的数据包(ESTABLISHED),则允许通过,否则DROP。

4.(1)作为ssh服务器时(drop全部默认规则)

# iptables -t filter -A INPUT -s 192.168.2.0/24 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -t filter -A OUTPUT -d 192.168.2.0/24 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# iptables -L -n
Chain INPUT (policy DROP)
target     prot opt source               destination      
ACCEPT     tcp  --  192.168.2.0/24       0.0.0.0/0           tcp dpt:22 state NEW,ESTABLISHED
Chain FORWARD (policy DROP)
target     prot opt source               destination      
Chain OUTPUT (policy DROP)
target     prot opt source               destination      
ACCEPT     tcp  --  0.0.0.0/0            192.168.2.0/24      tcp spt:22 state ESTABLISHED

(2)作为客户机对ssh,dns设置

# iptables -A INPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

5.web和ftp(自定义规则)

# setup   //把防火墙系统默认规则关掉

# iptables -L      //系统默认规则全部关闭
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

(1)针对web服务器(80端口)

# iptables -t filter -A INPUT  -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -t filter -A OUTPUT  -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

(2)针对ftp服务器

# iptables -t filter -A INPUT  -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -t filter -A OUTPUT  -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
# iptables -t filter -A INPUT  -p tcp --dport 20 -m state --state  ESTABLISHED -j ACCEPT
# iptables -t filter -A OUTPUT  -p tcp --sport 20 -m state --state NEW,ESTABLISHED -j ACCEPT
#modprobe ip_nat_ftp

6.web和ftp(系统默认规则)

# setup   //开启防火墙系统默认规则

# iptables -L    //系统默认的所有规则
Chain INPUT (policy ACCEPT)
target     prot opt source               destination      
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere         
ACCEPT     all  --  anywhere             anywhere         
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination      
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

打开ftp的规则

打开web的规则

# iptables -L -n --line-number   //打开ftp及web的整体默认规则
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination      
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0        
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0        
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80
6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:21
7    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination      
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination


五、保存

# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

所有规则都保存在/etc/sysconfig/iptables中。

本文出自 “一诺千金” 博客,请务必保留此出处http://yinuoqianjin.blog.51cto.com/8360868/1413060

初窥netfilter/iptables,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。