iptables防火墙

@(Linux基础)[iptables防火墙]
iptables防火墙

iptables简介

iptables工作在用户空间,他是定义规则的工具,本身不是防火墙。他所定义得规则就是让在内核空间当中得netfilter来读取。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter.(网络过滤器)
他在内核中选取了5个位置:

  • 1.内核空间中:从一个网络接口进来,到另一个网络接口去的
  • 2.数据包从内核流入用户空间的
  • 3.数据包从用户空间流出的
  • 4.进入/离开本机的外网接口
  • 5.进入/离开本机的内网接口

这五个位置也被称为五个钩子函数

  • 1.PREROUTING (路由前)
  • 2.INPUT (数据包流入口)
  • 3.FORWARD (转发管卡)
  • 4.OUTPUT(数据包出口)
  • 5.POSTROUTING(路由后)

这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。

防火墙策

防火墙策略一般分为两种,一种叫“通”策略,一种叫“堵”策略。

规则写法

iptables定义规则的方式比较复杂:
格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION

  • -t table :3个filter nat mangle
  • COMMAND:定义如何对规则进行管理
  • chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的
  • CRETIRIA:指定匹配标准
  • -j ACTION :指定如何进行处理

示例:
不允许172.16.0.0/24的进行访问

iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP

当然你如果想拒绝的更彻底

 iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -p udp --dport 53 -j REJECT

iptables -L -n -v #查看定义规则的详细信息

  • -P 设置默认策略:iptables -P INPUT (DROP|ACCEPT)
  • -F 清空规则链
  • -L 查看规则链
  • -A 在规则链的末尾加入新规则
  • -I num 在规则链的头部加入新规则
  • -D num 删除某一条规则
  • -s 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。
  • -d 匹配目标地址
  • -i 网卡名称 匹配从这块网卡流入的数据
  • -o 网卡名称 匹配从这块网卡流出的数据
  • -p 匹配协议,如tcp,udp,icmp
  • --dport num 匹配目标端口号
  • --sport num 匹配来源端口号

iptables的增删查

查看

iptables -nvL –line-number
  • -L 查看当前表的所有规则,默认查看的是filter表,如果要查看NAT表,可以加上-t NAT参数
  • -n 不对ip地址进行反查,加上这个参数显示速度会快很多
  • -v 输出详细信息,包含通过该规则的数据包数量,总字节数及相应的网络接口
  • –line-number 显示规则的序列号,这个参数在删除或修改规则时会用到

添加

添加规则有两个参数:-A和-I。其中-A是添加到规则的末尾;-I可以插入到指定位置。

iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    DROP       all  --  10.20.36.199          0.0.0.0/0
2    DROP       all  --  10.20.36.15         0.0.0.0/0

添加一条规则到尾部:

iptables -A INPUT -s 192.168.1.5 -j DROP

再插入一条规则到第二行,将行数直接写到规则链的后面:

iptables -I INPUT 2 -s 10.25.65.22 -j DROP

查看:

iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    DROP       all  --  10.20.36.199          0.0.0.0/0
2   DROP       all  --  10.25.65.22         0.0.0.0/0 
3	DROP       all  --  10.20.36.15         0.0.0.0/0

删除:

iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    DROP       all  --  10.20.36.199          0.0.0.0/0
2   DROP       all  --  10.25.65.22         0.0.0.0/0 
3	DROP       all  --  10.20.36.15         0.0.0.0/0

查出第二行

iptables -D INPUT 2

修改
使用-R参数

iptables -R INPUT 3 -j ACCEPT
iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    DROP       all  --  10.20.36.199          0.0.0.0/0
2   DROP       all  --  10.25.65.22         0.0.0.0/0 
3	ACCEPT       all  --  10.20.36.15         0.0.0.0/0

开机添加规则
iptables-save > /opt/iptables_all.txt
在/etc/rc.local添加一行

iptables-restore < /etc/sysconfig/iptables

常用例子:

清空规则:

iptables -F
iptables –flush

两条任意一个都可以
设置链的默认策略
链的默认政策设置为”ACCEPT”(接受),若要将INPUT,FORWARD,OUTPUT链设置成”DROP”(拒绝),命令如下:

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

阻止指定ip地址
丢弃来自IP地址x.x.x.x的包

iptables -A INPUT -s x.x.x.x -j DROP

阻止来自IP地址x.x.x.x eth0 tcp的包

iptables -A INPUT -i eth0 x.x.x.x -j DROP
iptables -A INPUT -i eth0 -p tcp -s x.x.x.x -j DROP

允许所有SSH的连接请求
允许所有来自外部的SSH连接请求,即只允许进入eth0接口,并且目标端口为22的数据包

iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

仅允许来自指定网络的SSH连接请求
仅允许来自于192.168.100.0/24域的用户的ssh连接请求

iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

允许http和https的连接请求

iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLEISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

允许所有来自web -https的连接请求

iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

使用multiport将多个规则结合在一起
允许多个端口从外界连入,除了为每个端口都写一条独立的规则外,我们可以用multiport将其组合成一条规则。如下所示: 例:允许所有ssh,http,https的流量访问。

iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT

允许从本地发起的ssh

iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

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

请注意,这与允许ssh连入的规则略有不同。本例在OUTPUT链上,我们允许NEW和ESTABLISHED状态。在INPUT链上,我们只允许ESTABLISHED状态。ssh连入的规则与之相反。
仅允许从本地发起到一个指定的网络域的SSH请求
仅允许从内部连接到网域192.168.100.0/24

iptables -A OUTPUT-o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state NEW,ESTABLEISHED -j ACCEPT

iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLEISHED -j ACCEPT

允许从本地发起的HTTPS连接请求
下面的规则时允许输出安全的网络流量。如果你想允许用户访问互联网。这些规则能让你使用wget从外部瞎子啊一些文件

iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT -I ETH0 -P tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

注:对于HTTP web流量的外联请求,只需要将上述命令中的端口从443改为80即可。
负载均衡传入的网络流量
使iptables可以实现传入web流量的负载均衡,我们可以传入web流量负载均衡是iptables防火墙规则。例如:使用iptables nth将https流量负载均衡到相同的ip地址。

iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443

iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443

iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443

允许外部主机ping内网主机

iptables -A -p icmp --icmp-type echo-request -j ACCEPT

iptables -A -p OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

允许内部主机ping外部主机

iptable -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT

iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

允许回环访问
在127.0.0.0回环访问

iptables -A INPUT -i lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT

允许内部网络与外部网络的通信
防火墙服务器上的其中一个网卡连接到外部,另一个内网卡连接到内部服务器,使用以下规则允许内部网络与外部网络的通信,此外,eth1连接到外部网络(互联网),eth0连接到内部网络(例如:192.168.1.x)。

iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT 

允许出站的DNS连接

iptables -A OUTPUT -p upd -o eth0 --dport 53 -j ACCEPT

iptables -A INPUT -P udp -i eth0 --sport 53 -j ACCEPT 

允许NIS连接
如果使用NIS管理用户账号,你需要允许NIS连接。如果你不允许NIS相关的ypbind连接请求,即使SSH连接请求已被允许,用户仍然无法登录。NIS的端口是动态的,先使用命令rpcinfo -p来知道端口,此例中为853和端口850端口。rpcinfo -p | grep ypbind 例如:允许来自111端口以及ypbind使用端口的连接请求。

iptables -A INPUT -p tcp --dport 111 -j ACCEPT 

iptables -A INPUT -p udp --dport 111 -j ACCEPT 

iptables -A INPUT -p tcp --dport 853 -j ACCEPT 

iptables -A INPUT -p udp --dport 853 -j ACCEPT

iptables -A INPUT -p tcp --dport 850 -j ACCEPT

iptables -A INPUT -p udp --dport 850 -j ACCEPT

注:当你重启ypbind之后端口将不同,上述命令将无效。有两种解决方案:1)使用你NIS的静态IP 2)编写shell脚本通过“rpcinfo - p”命令自动获取动态端口号,并在上述iptables规则中使用。

允许来自指定网络的rsync连接请求

允许来自网络192.168.101.0/24的rsync连接请求

iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT

允许来自指定网络的MySQL连接请求
一些小公司,MySQL数据库与web服务跑在同一台服务器上。有时候我们仅希望DBA和开发人员从内部网络(192.168.100.0/24)直接登录数据库,可尝试以下命令:

iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT

允许Sendmail,Postfix邮件服务

iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT

允许IMAP和IMAPS
允许IMAP/IMAP2流量,端口143


iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT

允许IMAPS流量,端口为993


iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT

允许POP3和POP3S
允许POP3访问

iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT

允许POP3S访问

iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT

防止DoS攻击

iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT


上述例子中:
-m limit: 启用limit扩展
–limit 25/minute: 允许最多每分钟25个连接(根据需求更改)。
–limit-burst 100: 只有当连接达到limit-burst水平(此例为100)时才启用上述limit/minute限制。

端口转发
将来自422端口的流量全部转到22端口。 这意味着我们既能通过422端口又能通过22端口进行ssh连接。启用DNAT转发。

iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22

除此之外,还需要允许连接到422端口的请求


iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT

记录丢弃的数据表
第一步:新建名为LOGGING的链

iptables -N LOGGING

第二步:将所有来自INPUT链中的数据包跳转到LOGGING链中

iptables -A INPUT -j LOGGING

第三步:为这些包自定义个前缀,命名为”IPTables Packet Dropped”

iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7

第四步:丢弃这些数据包

iptables -A LOGGING -j DROP
posted @ 2018-03-21 13:51  zz小公子  阅读(198)  评论(0编辑  收藏  举报