iptablse服务管理

iptablse服务管理

1
2
3
4
5
6
7
8
service iptables start|stop|restart|status
service iptables save //定义的所有内容,在重启时都会失效。调用save命令可以把规则保存到文件/etc/sysconfig/iptables中。
iptables-save //保存规则
iptables-restore //加载规则。开机的时候,会自动加载/etc/sysconfig/iptables
iptables-restore < /etc/sysconfig/iptables2 //加载自定义的规则文件
//iptables服务配置文件: /etc/sysconfig/iptables-config
//iptables规则文件: /etc/sysconfig/iptables
echo "1">/proc/sys/net/ipv4/ip_forward //打开iptables转发:

COMMAND 命令选项

1
2
3
4
5
6
7
8
9
10
11
12
-A|--append  CHAIN                                 //链尾添加新规则
-D|--delete CHAIN [RULENUM] //删除链中规则,按需序号或内容确定要删除的规则
-I|--insert CHAIN [RULENUM] //在链中插入一条新的规则,默认插在开头
-R|--replace CHAIN RULENUM //替换、修改一条规则,按序号或内容确定
-L|--list [CHAIN [RULENUM]] //列出指定链或所有链中指定规则或所有规则
-S|--list-urles [CHAIN [RULENUM]] //显示链中规则
-F|--flush [CHAIN] //清空指定链或所有链中规则
-Z|--zero [CHAIN [RULENUM]] //重置指定链或所有链的计数器(匹配的数据包数和流量字节数)
-N|--new-chain CHAIN //新建自定义规则链
-X|--delete-cahin [CHAIN] //删除指定表中用户自定义的规则链
-E|--rename-chain OLDCHAIN NEWCHAIN //重命名链,移动任何引用
-P|-policy CHAIN TARGET //设置链的默认策略,数据包未匹配任意一条规则就按此策略处理

CRETIRIA 条件匹配

分为基本匹配和扩展匹配,扩展匹配又分为隐式匹配和显示匹配

基本匹配

1
2
3
4
5
6
-p|--proto  PROTO                      //按协议匹配,如tcp、udp、icmp,all表示所有协议。 (/etc/protocols中的协议名)
-s|--source ADDRESS[/mask]... //按数据包的源地址匹配,可使用IP地址、网络地址、主机名、域名
-d|--destination ADDRESS[/mask]... //按目标地址匹配,可使用IP地址、网络地址、主机名、域名
-i|--in-interface INPUTNAME[ +] //按入站接口(网卡)名匹配,+用于通配。如 eth0, eth+ 。一般用在INPUT和PREROUTING链
-o|--out-interface OUTPUTNAME[+] //按出站接口(网卡)名匹配,+用于通配。如 eth0, eth+ 。一般用在OUTPUT和POSTROUTING链
可使用 ! 可以否定一个子句,如-p !tcp

扩展匹配

-m|–match MATCHTYPE EXTENSIONMATCH… //扩展匹配,可能加载extension

如: -p tcp -m tcp --dport 80

隐式扩展匹配(对-p PROTO的扩展,或者说是-p PROTO的附加匹配条件)

-m PROTO 可以省略,所以叫隐式

1
2
3
4
5
6
7
8
9
10
11
-m tcp   //-p tcp的扩展
    --sport [!]N[:M] //源端口, 服务名、端口、端口范围。
    --dport [!]N[:M] //目标端口,服务名、端口、端口范围
    --tcp-flags CHECKFLAGS FLAGSOFTRUE //TCP标志位:SYN(同步),ACK(应答),RST(重置),FIN(结束),URG(紧急),PSH(强迫推送)。多个标志位逗号分隔。
                         //CHECKFLAGS为要检查的标志位,FLAGSOFTRUE为必须为1的标志位(其余的应该为0)
    --syn //第一次握手。 等效于 --tcpflags syn,ack,fin,rst syn 四个标志中只有syn为1
-m udp //-p udp的扩展
    --sport N[-M]
    --dport N[-M]
-m icmp //隐含条件为-p icmp
    --icmp-type N //8:echo-request 0:echo-reply

显示扩展匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
-m state
    --state //连接状态检测,NEW,ESTABLISHED,RELATED,INVALID
-m multiport
    --source-ports PORT[,PORT]...|N:M //多个源端口,多个端口用逗号分隔,
    --destination-ports PORT[,PORT]...|N:M //多个目的端口
    --ports                      //多个端口,每个包的源端口和目的端口相同才会匹配
-m limit
    --limit N/UNIT //速率,如3/minute, 1/s, n/second , n/day
    --limit-burst N //峰值速率,如100,表示最大不能超过100个数据包
-m connlimit
    --connlimit-above N //多于n个,前面加!取反
-m iprange
    --src-range IP-IP
    --dst-range IP-IP
-m mac
    --mac-source //mac地址限制,不能用在OUTPUT和POSTROUTING规则链上,因为封包要送到网卡后,才能由网卡驱动程序透过ARP 通讯协议查出目的地的MAC 地址
-m string
    --algo [bm|kmp] //匹配算法
    --string "PATTERN" //匹配字符模式
-m recent
    --name //设定列表名称,默认为DEFAULT
    --rsource //源地址
    --rdest //目的地址
    --set //添加源地址的包到列表中
    --update //每次建立连接都更新列表
    --rcheck //检查地址是否在列表
    --seconds //指定时间。必须与--rcheck或--update配合使用
    --hitcount //命中次数。必须和--rcheck或--update配合使用
    --remove //在列表中删除地址
-m time
    --timestart h:mm
    --timestop hh:mm
    --days DAYS //Mon,Tue,Wed,Thu,Fri,Sat,Sun; 逗号分隔
-m mark
    --mark N //是否包含标记号N
-m owner
    --uid-owner 500 //用来匹配来自本机的封包,是否为某特定使用者所产生的,可以避免服务器使用root或其它身分将敏感数据传送出
    --gid-owner O //用来匹配来自本机的封包,是否为某特定使用者群组所产生的
    --pid-owner 78 //用来匹配来自本机的封包,是否为某特定进程所产生的
    --sid-owner 100 //用来匹配来自本机的封包,是否为某特定连接(Session ID)的响应封包

ACTION 目标策略(TARGET)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
-j|--jump TARGET                //跳转到目标规则,可能加载target extension
-g|--goto CHAIN //跳转到指定链,不再返回
ACCEPT 规则验证通过,不再检查当前链的后续规则,直接跳到下一个规则链。
DROP 直接丢弃数据包,不给任何回应。中断过滤。
REJECT 拒绝数据包通过,会返回响应信息。中断过滤。
--reject-with tcp-reset|port-unreachable|echo-reply
LOG 在/var/log/messages文件中记录日志,然后将数据包传递给下一条规则。详细位置可查看/etc/syslog.conf配置文件
--log-prefix "INPUT packets"
ULOG 更广范围的日志记录信息
QUEUE 防火墙将数据包移交到用户空间,通过一个内核模块把包交给本地用户程序。中断过滤。
RETURN 防火墙停止执行当前链中的后续规则,并返回到调用链。主要用在自定义链中。
custom_chain 转向自定义规则链
DNAT 目标地址转换,改变数据包的目标地址。外网访问内网资源,主要用在PREROUTING。完成后跳到下一个规则链
--to-destination ADDRESS[-ADDRESS][:PORT[-PORT]]
SNAT 源地址转换,改变数据包的源地址。内网访问外网资源。主机的IP地址必须是静态的,主要用在POSTROUTING。完成后跳到下一个规则链。
--to-source ADDRESS[-ADDRESS][:PORT[-PORT]]
MASQUERADE 源地址伪装,用于主机IP是ISP动态分配的情况,会从网卡读取主机IP。直接跳到下一个规则链。
--to-ports 1024-31000
REDIRECT 数据包重定向,主要是端口重定向,把包分流。处理完成后继续匹配其他规则。能会用这个功能来迫使站点上的所有Web流量都通过一个Web高速缓存,比如Squid。
--to-ports 8080
MARK 打防火墙标记。继续匹配规则。
--set-mark 2
MIRROR 发送包之前交换IP源和目的地址,将数据包返回。中断过滤。

辅助选项

1
2
3
4
5
6
7
8
9
10
11
-t|--table TABLE     //指定操作的表,默认的表为filter
-n|--numeric //用数字形式显示地址和端口,显示主机IP地址而不是主机名
-x|--exact //计数器显示精确值,不做单位换算
-v|--verbose (x3) //查看规则列表时,显示更详细的信息
-line-numbers //查看规则表时,显示在链中的序号
-V|--version
-h|--help
[option] --help //查看特定选项的帮助,如iptables -p icmp --help
--fragment -f //match second or further fragments only
--modprobe=<command> //try to insert modules using this command
--set-counters PKTS BYTES //set the counter during insert/append

state TCP链接状态

1
2
3
4
5
NEW                 第一次握手,要起始一个连接(重设连接或将连接重导向) 
ESTABLISHED 数据包属于某个已经建立的连接。第二次和第三次握手 (ack=1)
INVALID 数据包的连接编号(Session ID)无法辨识或编号不正确。如SYN=1 ACK=1 RST=1
RELATED 表示该封包是属于某个已经建立的连接,所建立的新连接。如有些服务使用两个相关的端口,如FTP,21和20端口一去一回,FTP数据传输(上传/下载)还会使用特殊的端口
只允许NEW和ESTABLISHED进,只允许ESTABLISHED出可以阻止反弹式木马。

使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
iptables -F           //删除iptables现有规则
iptables -L [-v[vv] -n] //查看iptables规则
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT //在INPUT链尾添加一条规则
iptables -I INPUT 2 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT //在INPUT链中插入为第2条规则
iptables -D INPUT 2 //删除INPUT链中第2条规则
iptables -R INPUT 3 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT //替换修改第三条规则
iptables -P INPUT DROP //设置INPUT链的默认策略为DROP
//允许远程主机进行SSH连接
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连接
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INTPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
//允许HTTP请求
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
//限制ping 192.168.146.3主机的数据包数,平均2/s个,最多不能超过3个
iptables -A INPUT -i eth0 -d 192.168.146.3 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 3 -j ACCEPT
//限制SSH连接速率(默认策略是DROP)
iptables -I INPUT 1 -p tcp --dport 22 -d 192.168.146.3 -m state --state ESTABLISHED -j ACCEPT
iptables -I INPUT 2 -p tcp --dport 22 -d 192.168.146.3 -m limit --limit 2/minute --limit-burst 2 -m state --state NEW -j ACCEPT

//防止syn攻击(限制syn的请求速度)
iptables -N syn-flood
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
iptables -A syn-flood -j DROP
//防止syn攻击(限制单个ip的最大syn连接数)
iptables –A INPUT –i eth0 –p tcp --syn -m connlimit --connlimit-above 15 -j DROP

iptables -I INPUT -p tcp -dport 22 -m connlimit --connlimit-above 3 -j DROP //利用recent模块抵御DOS攻击
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH //单个IP最多连接3个会话
Iptables -I INPUT -p tcp --dport 22 -m state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP //只要是新的连接请求,就把它加入到SSH列表中。5分钟内你的尝试次数达到3次,就拒绝提供SSH列表中的这个IP服务。被限制5分钟后即可恢复访问。

iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j DROP //防止单个IP访问量过大
iptables –A OUTPUT –m state --state NEW –j DROP //阻止反弹木马
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/m -j ACCEPT //防止ping攻击

//只允许自己ping别人,不允许别人ping自己
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
//对于127.0.0.1比较特殊,我们需要明确定义它
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

//SNAT 基于原地址转换。许多内网用户通过一个外网 口上网的情况。将我们内网的地址转换为一个外网的IP,共用外网IP访问外网资源。
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1
//当外网地址不是固定的时候。将外网地址换成 MASQUERADE(动态伪装):它可以实现自动读取外网网卡获取的IP地址。
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
//DNAT 目标地址转换。目标地址转换要做在到达网卡之前进行转换,所以要做在PREROUTING这个位置上
iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --to-destination 172.16.100.2

linux 开启独立iptables日志

  • 在rsyslog.conf 添加配置,添加不同的日志级别(默认warn(=4))
1
2
3
4
5
vi /etc/rsyslog.conf
kern.warning /var/log/iptables.log
kern.debug /var/log/iptables.log
kern.info /var/log/iptables.log
不过推荐全部日志都记录: kern.* /var/log/iptables.log
  • 重启日志配置:
1
/etc/init.d/rsyslogd restart
  • 让日志滚动,这一步是可选的
1
2
vim /etc/logrotate.d/syslog
加入/var/log/iptables
  • 在iptables添加日志选项
1
2
3
4
记录所有的记录了,只要通过了防火墙都会记录到日志里
iptables -A INPUT -j LOG --log-prefix "iptables"
只记录tcp日志
iptables -A INPUT -p tcp -j LOG --log-prefix "iptables icmp warn"
  • 然后保存并重启防火墙配置
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2018-2024 Outsrkem
  • 访问人数: | 浏览次数:

      请我喝杯咖啡吧~

      支付宝
      微信