iptables

iptables介绍和禁icmp

netfilter  --> iptables  防火墙名字是netfilter   iptables是命令

1.filter(过滤包,用的最多的,)
内建三个链:
    1.INPUT作用于进入本机的包
    2.OUTPUT作用于本机送出的包
    3.FORWARD作用于那些跟本机无关的包
2.nat (主要用处是网络地址转换)
3.mangle (用于给数据包打标记,然后根据标记去操作哪些包。这个表几乎不怎么用。)\
例1: iptables -t filter -A INPUT -s 192.168.1.128 -p icmp -j DROP   #限制192.168.1.128ip ping  (-t filter指定哪个表,默认就是filter表,如例2)
例2: iptables -A INPUT -s 192.168.1.128 -p icmp -j DROP

 iptables命令的管理控制选项

-A 在指定链的末尾添加(append)一条新的规则
-D 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
-I 在指定链中插入(insert)一条新的规则,默认在第一行添加
-R 修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
-L 列出(list)指定链中所有的规则进行查看
-E 重命名用户定义的链,不改变链本身
-F 清空(flush)
-N 新建(new-chain)一条用户自己定义的规则链
-X 删除指定表中用户自定义的规则链(delete-chain)
-P 设置指定链的默认策略(policy)
-Z 将所有表的所有链的字节和数据包计数器清零
-n 使用数字形式(numeric)显示输出结果
-v 查看规则表详细信息(verbose)的信息
-V 查看版本(version)
-h 获取帮助(help)

iptables命令详解

例:iptables -A INPUT -s 10.72.11.12 -p tcp --sport 1234  -d 10.72.137.159 --dport 80 -j DROP
-t  filter   注解:-t 后跟表名  不用这个参数默认是filter
-A 增加一条规则   -I 表未插入一条规则  -D 表示删除一条规则  后面的INPUT是链名称,还可以是OUTPUT,FORWORD
-s 后跟源地址
-p 协议(tcp,udp,icmp)  (指定协议,可以不指定端口)
--sport/--dport 后跟源端口/目标端口   (指定端口必须,指定协议)   目标端口及服务器端口
-d 后跟目的ip(主要针对内网或者外网)
-j 后跟动作 (DROP 把包选择  REJECT 拒绝包  ACCEPT 允许包)

 iptables防火墙规则的清空、保存与恢复、清空流量计数器、更改预设策略

iptables -F  #清空规则
iptables-save > /etc/sysconfig/iptables    #备份规则
iptables-restore < /etc/sysconfig/iptables #恢复规则
iptables -Z      #把包(pkts)以及流量计数器(bytes)置零(这个很有用)
iptables -P INPUT DROP  #更改预设策略  如果在远程连接服务器,千万别随便敲这条命令,敲完就段线。(相当于启用白名单)
    Chain INPUT (policy DROP 3 packets, 349 bytes)

  查看规则

[root@docker1 ~ 17:27:50&&14]#iptables -nvL
Chain INPUT (policy ACCEPT 61 packets, 4080 bytes)   #红色字体是INPUT表的默认规则, iptables -P INPUT DROP(更改默认规则)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 36 packets, 4984 bytes)
 pkts bytes target     prot opt in     out     source               destination
 
[root@docker1 ~ 17:27:26&&13]#iptables -nvL --line-numbers   #显示规则序号,删除规则号根据num
Chain INPUT (policy ACCEPT 23 packets, 1556 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 DROP       icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 14 packets, 2104 bytes)
num   pkts bytes target     prot opt in     out     source               destination

 

 

 添加规则

iptables -I INPUT -s 2.2.2.2 -p tcp --dport 80 - j DROP 把来自2.2.2.2并且是tcp协议到本机的80端口的数据包丢掉。--dport/--sport 必须要和-p选项一起使用,否则会出错。(-I在最前面)
iptables -A INPUT -s 2.2.2.2 -p tcp --dport 22 - j DROP 把来自2.2.2.2并且是tcp协议到本机的80端口的数据包丢掉。--dport/--sport 必须要和-p选项一起使用,否则会出错。(-A追加)
iptables -I INPUT -p icmp --icmp-type 8 -j DROP  #注解:--icmp-type 这个选项跟 -p icmp一起使用的,后面指定类型编号。8指的是在本机ping通其他机器 ,而其他机器不能ping通本机。(这个有必要记一下)
iptables -I INPUT -s 124.115.0.0/16 -j DROP   #封IP段的命令

#本机端口映射(端口映射虚拟端口是没有启动的) iptables
-t nat -A PREROUTING -p tcp --dport 7979 -j REDIRECT --to-ports 8080 #端口映射(需要开启echo '1' > /proc/sys/net/ipv4/ip_forward),注意:7979这个端口是没有启动的

#跨机端口映射 转发服务器需要开启echo '1' > /proc/sys/net/ipv4/ip_forward 目标服务器不需要开启ip_forward (此方法也适用于docker宿主机映射到docker)
#22225是转发端口 192.168.159.3:22为目标ip和端口 第2条的 --dport 22 -d 192.168.159.3为目标ip和端口 192.168.159.30为转发服务器的Ip
iptables -t nat -A PREROUTING -m tcp -p tcp --dport 22225 -j DNAT --to-destination 192.168.159.3:22
iptables -t nat -A POSTROUTING -m tcp -p tcp --dport 22 -d 192.168.159.3 -j SNAT --to-source 192.168.159.30

 

  删除规则

iptables -D INPUT 1 #根据规则号删除规则

 

linux下使用iptables实现内网的ftp端口映射

有两台机器,其中一台A 有内网和外网,B机器只有内网。
想达到的目的: 通过A机器的外网去访问B机器的ftp(21)
环境:
A机器外网IP为  123.234.12.22(eth1)  内网IP为 192.168.10.20 (eth0)
B机器内网为 192.168.10.21

实现方法:
1.  让你的linux支持ftp的端口转发
modprobe ip_nat_ftp ###加载ip_nat_ftp模块(若没有编译进内核),以使ftp能被正确NAT
modprobe ip_conntrack_ftp ###加载ip_conntrack_ftp模块
2.  在A机器上打开端口转发功能
vi  /etc/sysctl.conf
使 net.ipv4.ip_forward = 1
sysctl -p
3.  在A机器上创建iptables规则
iptables -t nat -I PREROUTING -d 123.234.12.22   -p tcp --dport 21 -j DNAT --to 192.168.10.21:21  (把访问外网21端口的包转发到内网ftp服务器)
iptables -t nat -I POSTROUTING -d 192.168.10.21 -p tcp --dport 21 -j SNAT --to 192.168.10.20 (把到内网ftp服务器的包回源到内网网卡上,不然包只能转到ftp服务器,而返回的包不能到达客户端)

 iptables 实现centos内网机器访问外网 

环境:一台带外网和内网的机器,另一台只有内网,默认不能上网。两台机器都是centos系统
带外网机器的外网ip为 123.221.20.11, 内网ip为 192.168.15.100
内网机器的内网ip为 192.168.15.101

设置方法很简单:
1. 在带外网的机器上设置iptables规则:
iptables -t nat -A POSTROUTING -s 192.168.15.101 -j SNAT --to 123.221.20.11
// 如果想让整个内网的机器全部上网,只需要把 -s 192.168.15.101 换成
-s 192.168.15.0/255.255.255.0 即可

2. 在带带外网机器上打开转发
首先查看是否已经打开
sysctl -a |grep 'net.ipv4.ip_forward'
如果值为1,则说明已经打开,否则需要修改配置文件 /etc/sysctl.conf
打开该配置文件,找到该参数,使其变为
net.ipv4.ip_forward = 1
然后运行 sysctl -p

3. 在内网机器上,设置其网关为 192.168.15.100
vim  /etc/sysconfig/network-scripts/ifcfg-eth0
添加
GATEWAY=192.168.15.100
重启网络服务即可。 service network restart

4. 测试内网机器是否可以上网。

 iptables限制syn速度

iptables -A INPUT -s ! 192.168.0.0/255.255.255.0 -d 192.168.0.101 -p tcp -m tcp --dport 80 -m state --state NEW -m recent --set --name httpuser --rsource 
iptables -A INPUT -m recent --update --seconds 5 --hitcount 20 --name httpuser --rsource -j DROP

#其中192.168.0.0/255.255.255.0 为不受限制的网段, 192.168.0.101  为本机IP。
该iptables策略,可有效预防syn攻击,也可以有效防止机器人发垃圾帖。

 firewall.sh

#!/bin/bash
#auth hanxiaohui
#version 2
#date 20180421
#readme ssh_port定义端口 ssh_allow定议白名单ip tcp_arr定义对哪些服务做白名单
http_port=80
any_port="0:65535"

http_allow=(0.0.0.0/0)
any_allow=(127.0.0.1 192.168.159.0/24 192.168.56.0/24)
tcp_arr=(http any)
udp_arr=()
iptables=/sbin/iptables

##清空规则
$iptables -F
$iptables -t nat -F
$iptables -X

#可以ping别人,别人不能ping我
#$iptables -I INPUT -p icmp --icmp-type 8 -j DROP

#以下两条策略会使iptables允许由服务器本身请求的数据通过(最后一条命令打开需要开启以下两条策略,不然访问不了外网)
#$iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#$iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#本机端口映射
#$iptables -t nat -A PREROUTING -p tcp --dport 22225 -j REDIRECT --to-ports 22

#跨机端口映射 转发服务器需要开启echo '1' > /proc/sys/net/ipv4/ip_forward 目标服务器不需要开启ip_forward
#22225是转发端口 192.168.159.3:22为目标ip和端口 第2条的 --dport 22 -d 192.168.159.3为目标ip和端口 192.168.159.30为转发服务器的Ip
#$iptables -t nat -A PREROUTING -m tcp -p tcp --dport 22225 -j DNAT --to-destination 192.168.159.3:22
#$iptables -t nat -A POSTROUTING -m tcp -p tcp --dport 22 -d 192.168.159.3 -j SNAT --to-source 192.168.159.30

 

allow_ip (){
args_allow=${1}_allow
args_port=$(eval echo \$${1}_port)
allow_list=($(eval echo \${$args_allow[@]}))
for allowip in ${allow_list[@]}
do
$iptables -A INPUT -p $2 -s $allowip --dport $args_port -j ACCEPT
done
}
#allow used array role
for tcp in ${tcp_arr[@]}
do
allow_ip $tcp tcp
done
unset tcp
for udp in ${udp_arr[@]}
do
allow_ip $udp udp
done
unset udp

#deny all tcp
for tcp in ${tcp_arr[@]}
do
args_port=$(eval echo \$${tcp}_port)
$iptables -A INPUT -p tcp --dport $args_port -j DROP
#$iptables -A INPUT -p tcp -j DROP
done
#deny all udp
for udp in ${udp_arr[@]}
do
args_port=$(eval echo \$${udp}_port)
$iptables -A INPUT -p udp --dport $args_port -j DROP
#$iptables -A INPUT -p udp -j DROP
done

 


#$iptables -P INPUT DROP

 

posted @ 2018-04-21 17:21  xgmxm  阅读(336)  评论(0编辑  收藏  举报