iptables(1)
iptables配置文件:/etc/sysconfig/iptables
确认开启路由转发功能
方法1:/sbin/sysctl -w net.ipv4.ip_forward=1
方法2:echo 1 > /proc/sys/net/ipv4/ip_forward
方法3:修改/etc/sysctl.conf,设置 net.ipv4.ip_forward = 1
设置路由转发
[root@localhost ~]# vim /etc/sysctl.conf 修改:
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -p 注意:此设置为永久生效 或者:
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
又或者:
[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1
注意:此设置为临时生
[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -m limit --limit 3/minute --limit-burst 8 -j LOG
[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j DROP
[root@localhost ~]# iptables -t filter -N MyLAN1
[root@localhost ~]# iptables -A FORWARD -s 192.168.1.0/24 -j MyLAN1
[root@localhost ~]# iptables -A FORWARD -d 192.168.1.0/24 -j MyLAN1
[root@localhost ~]# iptables-A MyLAN1 -p icmp -j DROP
[root@localhost ~]# iptables-A MyLAN1 ……
[root@localhost ~]# iptables -X MyLAN1
[root@localhost ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT
[root@localhost ~]# iptables-I INPUT -p udp -j ACCEPT
[root@localhost ~]# iptables-I INPUT 2 -p icmp -j ACCEPT
[root@localhost ~]# iptables-P INPUT DROP
[root@localhost ~]# iptables-L INPUT --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT udp -- anywhere anywhere
2 ACCEPT icmp -- anywhere anywhere
3 ACCEPT tcp -- anywhere anywhere
[root@localhost ~]# iptables-D INPUT 2
[root@localhost ~]# iptables-F
[root@localhost ~]# iptables -t nat-F
[root@localhost ~]# iptables -t raw -NTCP_PACKETS
[root@localhost ~]# iptables -t raw -L
Chain PREROUTING (policy ACCEPT)
……
Chain OUTPUT (policy ACCEPT)
……
Chain TCP_PACKETS (0 references)
target prot opt source destination
自定义链,最终要应用于默认链上,才能起作用。
自定义链,只允许固定ip访问目标ip的ssh
#iptables -N testssh --自定义链名称
#iptables -A testssh -s 192.168.10.10/32 -j ACCEPT
#iptables -A INPUT -p tcp --dport 22 -j testssh --把自定义链应用于INPUT链
nat表上,自定义链的使用
#iptables -N test -t nat
#iptables -A test -t nat -d 192.168.10.0/24 -j SNAT --to 192.168.100.10
#iptables -A POSTROUTING -t nat -s 192.168.21.0/24 -j test
[root@localhost ~]# iptables -A FORWARD -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -p tcp --sport 20:80 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j REJECT
[root@localhost ~]# iptables -A INPUT -i eth0 -p icmp --icmp-type Echo-Request -j DROP
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT
[root@localhost ~]# iptables -A FORWARD -m mac --mac-source 00:0C:29:27:55:3F -j DROP
[root@localhost ~]# iptables -A INPUT -p tcp-m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT
[root@localhost ~]# iptables -A FORWARD -p tcp-m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP
NEW(与任何连接无关的数据包,一般表示新发起的数据连接请求)
ESTABLISHED(响应请求或者已建立连接的数据包,一般表示服务器的正常响应数据)
RELATED(与已有连接有相关性的数据包,例如使用FTP上传/下载文件时需要建立新的数据连接,这个连接与之前的FTP控制连接存在
相关性)
INVALID (表示来历不明的包,除以上状态以外的其他状态,视为有危险的包,全部被丢弃。)
•当有人冒用其他主机的IP地址发送数据时,受害主机接收到的服务器响应数据包的状态也是“NEW”(因为本机并未发送过请求),这种类
型的数据包一般也要丢弃掉
--syn的用法为兼容旧版本iptables的形式
[root@localhost ~]# iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
[root@localhost ~]# iptables -A INPUT -p tcp-m state --state NEW -j DROP
[root@localhost ~]# iptables -A INPUT -p tcp-m state --state ESTABLISHED,RELATED -j ACCEPT
•导出规则
–iptables-save
–结合重定向输出“>”符号保存规则信息
•导入规则
–iptables-restore
–结合重定向输入“<”符号恢复规则信息
[root@localhost ~]# iptables-save > /etc/sysconfig/iptables
[root@localhost ~]# service iptables restart
[root@localhost ~]# chkconfig --level 35 iptables on
[root@localhost ~]# iptables-restore < /etc/sysconfig/iptables
--------------------------理解ESTABLISHED
vm1
# iptables -P INPUT DROP
ping 192.168.56.201
ssh 192.168.56.201
全部失败
# iptables -A INPUT -p all -m state --state ESTABLISHED -j ACCEPT
ping 192.168.56.201
ssh 192.168.56.201
全部成功
vm2关闭防火墙
成功穿越反向防火墙。
tracerout 192.168.56.201 失败 ,原因看下面
--------------------------理解RELATE
vm1
# iptables -P INPUT DROP
# iptables -F
# iptables -A INPUT -p all -m state --state RELATED -j ACCEPT
tracerout 192.168.56.201 成功。由第一个包产生的其他回包都属于RELATE状态。
--------------------------理解NEW
vm1
OUTPUT默认策略为DROP。其他策略为ACCEPT
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT DROP
# iptables -F
ping 192.168.56.201
ssh 192.168.56.201
全部失败
# iptables -A OUTPUT -p all -m state --state ESTABLISHED,NEW -j ACCEPT
--------------------------理解INVALID
他需要特殊的第一条黑客工具产生,所以这里面紧急下面的用法。
通常应用在INPUT表的第一条。
# iptables -A INPUT -p all -m state --state INVALID -j DROP
mangle表
策略路由
现要求对内网进行策略路由,所有通过TCP协议访问80端口的数据包都从ChinaNet线路出去,而所有访问UDP协议53号端口的数据包都
从Cernet线路出去
打标记:
iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth0 -p udp --dprot 53 -j MARK --set-mark 2
注:创建完路由规则若需立即生效须执行#ip route flush cache;刷新路由缓冲
建表
ip rule add from all fwmark 1 table 10
ip rule add from all fwmark 2 table 20
(fwmark 1 是标记,table 1 是路由表1 。 意思就是凡事标记了 1 的数据使用table10 路由表)
ip rule show 显示路由规则
路由规则的添加
ip rule add from 192.168.1.10/32 table 1 pref 100
如果pref值(优先级)不指定,则将在已有规则最小序号前插入
注:创建完路由规则若需立即生效须执行#ip route flush cache;刷新路由缓冲
策略路由:
ip route add default via 10.10.1.1 dev eth1 table 10
ip route add default via 10.10.2.1 dev eth2 table 20
RAW表
4个表的优先级由高到低的顺序为:raw-->mangle-->nat-->filter
举例来说:如果PRROUTING链上,即有mangle表,也有nat表,那么先由mangle处理,然后由nat表处理
RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用
了RAW表,在 某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.
RAW表可以应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪
处理,以提高用户的访问速度。
执行如何指令即可
iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK
iptables -t raw -A PREROUTING -p tcp --sport 80 -j NOTRACK
iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT
--------------------------------------------
环境:
直播web服务器通过nginx+memcache方式提供显示数据的读取,采用的都是短链接模式,每次请求拿到数据后会断开连接。
故障:
cache服务器,不能创建新连接,message日志报错ip_conntrack: table full, dropping packet.
导致直播web出现故障,同样错误ip_conntrack: table full, dropping packet.
故障原因:链接跟踪表满了,导致不能创建新的连接。
以前出现过类似故障,解决办法是
vi /etc/sysctl.conf
net.ipv4.ip_conntrack_max = 65000 加大链接跟踪表大小(加大最大跟踪连接条目)
但是过一段时间又出现上面的问题,这说明一是访问量确实再加大,导致跟踪表full,另外也说明单纯加大这个参数只能解决眼前的问题,
必须找出一个彻底解决此问题的办法。
这次故障临时调整
vi /etc/sysctl.conf
net.ipv4.ip_conntrack_max = 855360
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 1000 (连接跟踪表超时时间,通过测试这个参数的意义不大,和跟踪表自动清除
的时间没有太大关系,但还是先减小,默认值是7天)
vi /etc/modprobe.conf
options ip_conntrack hashsize=855360
设置桶的数量。提高性能,可以减少内核遍历时间。
简单解释:
上面的参数都是iptables涉及的参数,iptables为了处理封包,会对封包做跟踪。
如果关闭iptables,上面的故障不会出现,但是不太可能。
-允许的最大跟踪连接条目,CONNTRACK_MAX
-存储跟踪连接条目列表的哈西表的数量, HASHSIZE,桶的数量
内核要访问一个特定包的跟踪连接条目,内核必须:
针对一个包中的已经定义的一些字符计算哈西值。这是一个不间断的计算。
这个哈西值就会被当作哈西表的索引来使用,而跟踪连接条目的列表就存储在这里。
反复的查看链接列表中的跟踪连接条目以找到匹配的那一个。
这是一个耗资源的操作,依赖于列表的大小(也依赖于列表中被操作的跟踪连接条目的位置)。
这个列表就是一个桶,HASHSIZE就是这些桶的数量,每个桶内的条目数就是 CONNTRACK_MAX/HASHSIZE
如果 CONNTRACK_MAX=HASHSIZE那么列表大小是一,可以减少遍历的数目,提高性能,前提是内存足够大
iptables这个桶的概念和LVS 内核桶的概念类似。
彻底解决:关闭跟踪。
直播web服务器
vi /etc/sysconfig/iptables
*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -p tcp -m tcp --dport 80 -j NOTRACK
-A PREROUTING -p tcp -m tcp --dport 10240:65000 -j NOTRACK
-A OUTPUT -p tcp -m tcp --sport 80 -j NOTRACK
-A OUTPUT -p tcp -m tcp --sport 10240:65000 -j NOTRACK
COMMIT
注意 filter 里要加这句
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED,UNTRACKED -j ACCEPT
后端cache服务器
vi /etc/sysconfig/iptables
*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -p tcp -m tcp --dport 80 -j NOTRACK
-A OUTPUT -p tcp -m tcp --sport 80 -j NOTRACK
-A PREROUTING -p tcp -m tcp --dport 11211 -j NOTRACK
-A OUTPUT -p tcp -m tcp --sport 11211 -j NOTRACK
COMMIT
把80端口和11211端口去掉跟踪。
用apache ab测试 观察 /proc/net/ip_conntrack 效果很明显
如果web端配置
-A PREROUTING -p tcp -m tcp --dport 11211 -j NOTRACK
-A OUTPUT -p tcp -m tcp --sport 11211 -j NOTRACK
是没有意义的,链接跟踪表还是会记录连接后端cache的条目,如果要加上-s之类的源IP地址,那么连接后端11211的出包都会被封,(测
试结果)所以规则肯定不是这样定,具体的规则还要研究。
对于cache服务器来说,以上配置是非常完善的。
通过观察研究链接跟踪表(/proc/net/ip_conntrack)的内容,发现内有大量直播web连接后端cache 11211端口的连接条目,源端口是一万
以上的端口。而且web服务器也有大量80端口的连接,这些链接不
需要处理,所以不跟需踪这些链接。
由于raw的output优先级高于filter input,所以如果设置成1024:65000 -j NOTRACK,那么这些端口都会被允许访问,所以设置成
10240:65000 ,filter的input还是不可以封住的,但是以后启动的应用
服务的端口要注意,必须选择10240以下的端口自行定义。虽然10240:65000这些端口可以在公网上扫到,但是由于没有服务对应,所以
不会有问题。
还要研究针对于访问后端的端口如何准确的去掉跟踪。
上面思路比较乱,关键的点想反了,以下是纠正
通过观察研究
cat /proc/net/ip_conntrack
tcp 6 431946 ESTABLISHED src=192.168.0.18 dst=192.168.0.17 sport=52292 dport=3306 packets=1 bytes=52 src=192.168.0.17
dst=192.168.0.18 sport=3306 dport=52292 packets=1
bytes=52 use=1
tcp 6 431999 ESTABLISHED src=192.168.0.18 dst=192.168.0.165 sport=22 dport=2676 packets=27 bytes=2128 src=192.168.0.165
dst=192.168.0.18 sport=2676 dport=22 packets=26
bytes=1664 [ASSURED] use=1
经过测试研究,并且看了几遍iptables-tutorial后,搞好了准确的去掉跟踪 结果
web服务器
*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -p tcp -m tcp --dport 80 -j NOTRACK
-A PREROUTING -p tcp -m tcp --sport 11211 -j NOTRACK 从17的11211端口返回给18的规则
-A OUTPUT -p tcp -m tcp --sport 80 -j NOTRACK
-A OUTPUT -p tcp -m tcp --dport 11211 -j NOTRACK 从18出到17的11211端口规则
COMMIT
测试结果表明:如果OUTPUT设置了相关端口,那么PREROUTING 必须针对OUTPUT设置的端口制定规则,否则封包不能出去。 (其实是
回不来)
原因如下
连接跟踪的状态主要在两个地方被触发,一个是PREROUTING,另外一个数OUTPUT,他们分别对应外来报文和本级产生报文。例如我
们从本级 发送一个报文,那么在OUTPUT链里面,它的状态会变成NEW,当我们接收到回应报文的时候,连接状态就PREROUTING处更
改为 ESTABLISHED,以此类推。加入第一个报文不是我们尝试的,那么在PREROUTING出就设置为NEW,然后我们发送回复的时候,
在 OUTPUT设置为ESTABLISHED。
iptables(1)的更多相关文章
- iptables
一.在服务器上打开 22.80.9011端口: iptables -A INPUT -p tcp --dport 9011 -j ACCEPT iptables -A OUTPUT -p tcp -- ...
- 浅谈iptables 入站 出站以及NAT实例
--------------本文是自己工作上的笔记总结,适合的可以直接拿去用,不适合的,适当修改即可!--------------- iptbales默认ACCEPT策略,也称通策略,这种情况下可以做 ...
- Failed to stop iptables.service: Unit iptables.service not loaded.
redhat 7 [root@lk0 ~]# service iptables stop Redirecting to /bin/systemctl stop iptables.service Fai ...
- CentOS7安装iptables防火墙
CentOS7默认的防火墙不是iptables,而是firewalle. 安装iptable iptable-service #先检查是否安装了iptables service iptables st ...
- linux iptables常用命令之配置生产环境iptables及优化
在了解iptables的详细原理之前,我们先来看下如何使用iptables,以终为始,有可能会让你对iptables了解更深 所以接下来我们以配置一个生产环境下的iptables为例来讲讲它的常用命令 ...
- CentOS系统配置 iptables防火墙
阿里云CentOS系统配置iptables防火墙 虽说阿里云推出了云盾服务,但是自己再加一层防火墙总归是更安全些,下面是我在阿里云vps上配置防火墙的过程,目前只配置INPUT.OUTPUT和FO ...
- /etc/sysconfig/下找不到iptables文件解决方法
时间:2014-12-19 01:17来源:csdn 作者:大智 举报 点击:5639次 本想做些防火墙策略.防火墙策略都是写在/etc/sysconfig/iptables文件里面的.可我发现我也没 ...
- docker通过iptables修改或新增镜像映射端口
443 8088 22 端口是初始映射端口 [root@SERVER ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAM ...
- lnmp 预设iptables设置
「LNMP」iptables初始配置 首先使用命令iptables -P INPUT ACCEPT允许所有连接,否则容易把自己关在外边.然后使用iptables -F;iptables -X;ip ...
- 关闭SELinux和iptables防火墙
1.关闭SELinux: 编辑SELinux配置文件: [root@Redis selinux]# vim /etc/selinux/config 修改SELINUX配置项为disable SELIN ...
随机推荐
- jvisualvm远程监控 visualgc插件 不受此jvm支持问题
https://yq.aliyun.com/ziliao/478212 1.修改远程服务器上java设置 vi $JAVA_HOME/jre/lib/security/java.policy 在 ...
- scroll滚动条样式修改
一般我们有两种情况会出现滚动条,一种是overflow,一种是使用scroll. 当我们需要改变这个滚动条样式的时候,我们需要做以下的修改: html: <div id="style- ...
- Mission Impossible 6
题目:Mission Impossible 6 题目链接:http://hihocoder.com/problemset/problem/1228 题目大意: 大概就是让我们写一个代码模拟文本编辑器的 ...
- 【学亮IT手记】jQuery DOM操作-获取内容和属性
jQuery拥有可操作HTML元素和属性的强大方法. 其中非常重要的部分就是操作DOM的能力. DOM--文档对象模型. <!DOCTYPE html> <html> < ...
- vs2012密钥
Microsoft Visual Studio Ultimate 2012 旗舰版 有效注册密钥:YKCW6-BPFPF-BT8C9-7DCTH-QXGWC:KCW6-BPFPF-BT8C9-7DCT ...
- C++中String类的字符串分割实现
最近笔试,经常遇到需要对字符串进行快速分割的情景,主要是在处理输入的时候,而以前练习算法题或笔试,很多时候不用花啥时间考虑测试用例输入的问题.可是C++标准库里面没有像java的String类中提供的 ...
- hive排序
1.升序排序 hive > select id,name,sal from emp order by sal; 2.降序 添加关键字desc hive > select id,nam ...
- Golang的channel使用以及并发同步技巧
在学习<The Go Programming Language>第八章并发单元的时候还是遭遇了不少问题,和值得总结思考和记录的地方. 做一个类似于unix du命令的工具.但是阉割了一些功 ...
- 使用getopts处理输入参数
在编写shell脚本中,需要输入参数,使用过程中,getopts更加方便.可以很好的处理用户输入的参数和参数值. 参加如下一段脚本: #!/bin/bash while getopts ": ...
- Yii2总结
1. Web访问流程(即在浏览器中输入一个网址至浏览器展现页面结果的过程) a. 将输入的网址提取出域名,在本地hosts文件中查找对应的IP地址(windows为C:/windows/system3 ...