欢迎各位兄弟 发布技术文章
这里的技术是共享的
tcp/ip 协议栈属于内核
iptables/netfilter
表:
raw,mangle,nat,filter
链
PRETOUTING ,INPUT,OUTPUT,FORWARD OUTPUT,POSTROUTING
filter
INPUT,OUTPUT,FORWARD
nat
PRETOUTING,OUTPUT,POSTROUTING(SNAT)
mangle
PRETOUTING ,INPUT,OUTPUT,FORWARD OUTPUT,POSTROUTING
raw
PRETOUTING OUTPUT
netfilter: Framework TC/IP协议站,内核中
iptables:写规则,并送到至netfilter的某一条链,但它必须要先属于某张表
iptables [-t TABLE] COMMAND CHAIN [num] 匹配条件(匹配标准) -j 处理动作(处理办法)
num 指的是链中的第几条规则
-t (table)可以省略,默认为 filter
匹配条件:
通用匹配 (普通匹配)
-s,--src 指定源ip地址,源网络
-d,--dst 指定目标ip地址,目标网络
-p {tcp|udp|icmp} 指定协议
-i INTERFACE (input interface)(比如 ethX网卡,pptX网络接口):指定数据报文流入的接口 (进来的)
PREROUTING,INPUT,FORWARD 用在这些链上,可用于定义的标准链
-o INTERFACE (output interface)(比如 ethX网卡,pptX网络接口):指定数据报文流出的接口 (出去的)
POSTROUTING,OUTPUT,FORWARD 用在这些链上,可用于定义的标准链
扩展匹配:使用netfilter的扩展模块才能完成的匹配
隐含扩展(隐式扩展):(当我们使用-p实施某协议之后)不需要明确指定(特别指明)由哪个模块扩展,因为此时使用了 -p {tcp|udp|icmp}
-p tcp
--sport PORT[-PORT]:源端口, (source port) 例如 80-100 只能是连续的端口,不能是隔开的端口
--dport PORT[-PORT]:目标端口,(destination port) 例如 80-100 只能是连续的端口,不能是隔开的端口
--tcp-flags: mask comp (compare) :只检查mask指定的标志位,是逗号分隔的标志位列表. comp (compare):此列表中的位必须为1,而comp中未出现且mask中出现的必须为0
--tcp-flags SYN,FIN,RST,ACK SYN,ACK ( 这里SYN,ACK必须为1,FIN,RST必须为0)
--tcp-flags SYN,FIN,RST,ACK SYN = --syn (这是三次握手的第一次因为它用得比较多,所以用 --syn来简写它)
--syn (--tcp-flags SYN,FIN,RST,ACK SYN 的简写,因为它用得比较多) 这是三次握手的第一次
-p icmp
--icmp-type:(icmp报文的类型) 类型对照表 /node-admin/12464
0:echo-replay 响应报文
8:echo-request 请求报文
-p udp
--sport PORT[-PORT]:源端口, (source port)
--dport PORT[-PORT]:目标端口,(destination port)
隐含扩展也可以使用显式扩展的(比如 -p tcp --dport 可以写成 -p tcp -m tcp --dport)
显式扩展:必须指明由哪个模块进行的扩展,在 iptables中使用-m选项可完成此功能 使用额外的条件匹配机制(比如报文的速度,追踪会话连接的状态,可以根据时间来放行数据报文的) -m 是match的意思 MATCH EXTENSIONS 匹配扩展
-m EXTENSION --spe-opt (--spe-opt 指定选项,指定独有选项)
state: 状态扩展
结合ip_conntrack追踪会话的状态 (与TCP协议状态其实不一样,是根据ip来的)(可以追踪三种协议 tcp udp icmp)
NEW: 新连接请求 (相当于TCP/IP握手的第一次),但是ping别人第一次也是NEW,udp第一次也是NEW
ESTABLISHED: 已建立的连接 (对新请求的响应)
INVALID: 非法连接(非法报文) (比如报文 SYN=1,FIN=1)
RELATED: 相关联的 (比如 ftp 命令连接和数据连接,数据连接由于命令连接中的某个命令激活的,比如get mget,put,mput都可以激活) 由命令连接激活的另一个连接,这种两个关系叫做RELATED (它其实是专为ftp服务器而设定的)
(例子 -m state --state NEW -j ACCEPT ,,,,-m state --state NEW,ESTABLISHED -j ACCEPT)
(NEW,ESTABLISHED 可以用逗号隔开两个状态,表示这两个状态的都一律放行)
要使用 ftp 功能,首先要装载 ip_conntrack_ftp和 ip_nat_ftp模块
multiport:离散的多端口匹配扩展
--source-ports
--destination-ports
--ports (不指定源或目标端口,只要是端口就行,包括源和目标)
(比如 -m multiport --destination-ports 21,22,80 -j ACCEPT)
(这里端口不连续用逗号)(端口连续的话 用冒号) (最多支持15个端口)
条件取反 ! -s ! 192.168.1.15 (感叹号表示取反,除了它之外的都可以作为源地址)
保存规则
# service iptables save 或 (/etc/rc.d/init.d/iptables save)
或(iptables-save > /etc/sysconfig/iptables.2013041801)
# service iptables restart 不会自动读取 /etc/sysconfig/iptables.2013041801 所以重启后不会生效
所以 要使用 # iptables-restore < /etc/sysconfig/iptables.2013041801 (从这个文件读取iptables规则,并让它生效,难道此时不必重启iptables?)
iptables 命令:
管理规则的命令
-A: (append)附加一条规则,添加在链的尾部
-I CHAIN [num]: (insert)插入一条规则,插入为对应CHAIN上的第num条,如果省略了num,则插入为第一条
-D CHAIN [num]: (delete)删除指定链中第num条规则 (-D后面可以跟上匹配条件,也能够删除对应的规则)
-R CHAIN [num]: (replace)替换(修改)指定链中第num条规则 (-D后面可以跟上匹配条件,也能够替换(修改)对应的规则)
管理链的命令:
-F [CHAIN]: (flush) 清空指定规则链 有点类似于批量执行 -D ,如果省略了 CHAIN,只指定表,则清空(删除)对应表中的所有链
(# iptables -F 不指定链,那么会清空功能表filter中的所有的链)
-P CHAIN (ACCEPT或DROP或REJECT): (policy策略) 设指定链的默认规则(策略)
-N: (new)自定义一个新的空链
-X: (--delete-chain)删除一个自定义的空链 (必须要删除空的,非空的必须要先-F把它清空)
-Z: (zero)置零(清空)指定链中所有规则的计数器
-E: ( --rename-chain old-chain new-chain)重命名一条自定义的链
查看链的命令:
-L: (list) 显示指定表中的所有规则 (它是分链进行显示的) (它试图将ip反解为主机名,将端口反解为服务名,比如将25号端口反解为smtp)
(尤其是反解ip地址为主机名的时候,如果没有配置dns服务器的时候,反解过程可能会很慢 ,这跟使用netstat 或route命令一个道理,使用我们再使用-n)
-n:(numberic)以数字格式显示主机地址和端口号
-v: (verbose 冗长的 )显示链及规则的详细信息 (显示的报文的大小之和,它可能是M,G等,是近似值)
-vv: 显示链及规则的更详细信息
-vvv: 显示链及规则的更更详细信息
-x: (exact 精确的)显示计数器的精确值
--line-number:显示规则号码 (对修改或删除第几条规则有很大作用,不用人工数了)
命令 -L, --list
范例: iptables -L INPUT
说明:列出INPUT规则链中的所有规则。
iptables 动作(target) (action): 用 -j 指定 (-j, --jump target)
ACCEPT:放行,允许通过
DROP:丢弃,
REJECT:拒绝,明确告知对方拒绝会返回一条信息,告知客户端的,就不让你过
DNAT (destination NAT) 目标地址转换
SNAT (source NAT) 源地址转换
REDIRECT 端口重定向
MASQUERADE 地址伪装(说白了,也是目标地址转换(是源地址伪装?) DNAT) This target is only valid in the nat table, in the POSTROUTING chain. 主要目的就是为了postrouting实现nat地址转换的
(masquerade 伪装;假扮;乔装;冒充)
LOG:记录日志,配置到哪个报文做log
MARK:做标识,给一个报文打上标记
-t (table)可以省略,默认为 filter
iptables -t filter -A INPUT -s 172.16.2.2.16/16 -j DROP
172.16.100.7, sshd: 22/tcp
放行来自于172.16.0.0对于本机的 ssh 的访问
iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT
service iptables stop service iptables start service iptables restart service iptables status
iptables 不是服务,是内核中的规则,内核中的规则是即时生效的
但有服务脚本,服务脚本的主要目的在于管理(生效,清除,重新载入等等)保存的规则的,
(我们写的规则都是放在内核的内存空间上的,一旦一关机,规则就没有了)
iptables 服务的启动和停止 本身就是装载或移除 iptables/netfilter 相关的内核模块
iptables_filter,iptables_nat,iptables_mangle,iptables_raw,ip_nat(ip报文实现nat功能的补充模块),iptables_conntrack(connection track 转换的报文连接追踪)
一旦启动服务,这些模块就被装载进来了,而且此前所保存的规则也就生效起来了,其实装载它们可以自己手动写脚本进行,没必要非得使用iptables服务,
因为它们根本(本身)就不是服务
Server:192.168.1.15
sshd,httpd
# man iptables
iptables -t tables 是可以省略的 默认的表为 filter ,不指的话为filter
[root@localhost ~]# iptables -L -n
[root@localhost ~]# iptables -t filter -L -n
[root@localhost ~]# iptables -t nat -L -n
[root@localhost ~]# iptables -t mangle -L -n
pkts 数据包的个数
bytes 报文的大小之和
[root@localhost ~]# iptables -L -n -v (-v显示详细信息) (81M是近似值)
[root@localhost ~]# iptables -L -n -vv (-vv显示更详细信息)
[root@localhost ~]# iptables -L -n -vvv (-vvv显示更更详细信息)
[root@localhost ~]# iptables -L -n -v -x (不再做单位换数,明确告知多少字节)
# man iptables
NOTRACK,不做任何追踪,用于raw表,在实现连接追踪的时候,禁止追踪某一个相应的报文
[root@localhost ~]# service iptables status (看看iptables 服务有没有启动,只要看到下面的一大堆链出来,说明iptables 就是启动的)
# lsmod (列出内核装载的模块) (内核启动模块之后.这些模块都会被装载进来,这表示服务已经启动了)
[root@localhost ~]# lsmod | grep ip
[root@localhost ~]# service iptables stop (停止iptables服务 一般来说,就是内核中移除这些模块)
[root@localhost ~]# lsmod | grep ip (此时关于iptables的模块就没有了)
service iptables stop service iptables start service iptables restart service iptables status
iptables 服务的启动和停止 本身就是让内核装载或移除(卸载)iptables 相关的模块
[root@localhost ~]# iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p tcp --dport 22 -j ACCEPT
[root@localhost ~]#
[root@localhost ~]# iptables -t filter -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT
[root@localhost ~]#
[root@localhost ~]# iptables -L -n
[root@localhost ~]# iptables -L -n -v
[root@localhost ~]# iptables -L -n -vv
[root@localhost ~]# iptables -L -n -vvv
[root@localhost yum.repos.d]# yum install httpd vsftpd mysql-server -y
[root@localhost yum.repos.d]# service httpd start
[root@localhost yum.repos.d]# netstat -tnlp
[root@localhost yum.repos.d]# setenforce 0
setenforce: SELinux is disabled
可能由于防火墙的问题 浏览器打不开这个80端口,在 /etc/sysconfig/iptables 要加上这一行
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
然后 浏览器可以打开 httpd 80端口
让 ssh 通过 22 端口
修改默认策略
[root@localhost yum.repos.d]# iptables -P INPUT DROP
[root@localhost yum.repos.d]# iptables -P OUTPUT DROP
[root@localhost yum.repos.d]# iptables -P FORWARD DROP
# iptables -L -n
此时 因为 drop 所以 80端口打不开了
-s 0.0.0.0/0 任意地址的时候 可以不用写
(-I 的插入的意思 如果 -I 后的INPUT 后面 没有跟位置(一个数字),就是插入第一条)
[root@localhost ~]# iptables -I INPUT -s 0.0.0.0/0 -d 192.168.1.15 -p tcp --dport 80 -j ACCEPT
( iptables -I INPUT -d 192.168.1.15 -p tcp --dport 80 -j ACCEPT )
[root@localhost ~]# iptables -t filter -I OUTPUT -s 192.168.1.15 -d 0.0.0.0/0 -p tcp --sport 80 -j ACCEPT
进去的 80 和 出去的 80 都是 accept了 所以现在可以访问了
[root@localhost html]# echo hello > /var/www/html/index.html
此时看到效果了
ping 不能 啥原因? 因为ping 请求用的是icmp协议
# ping 127.0.0.1 (虽然是本地回环地址,但从网强的角度,仍然需要从output链出去,再从input链进来)
放行自己对自己的访问
(-i 表示进来的网卡 input interface )(-o 表示出去的网卡 output interface ) ( lo 表示本地回环网卡 )
[root@localhost html]# iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEPT
[root@localhost html]# iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT
[root@localhost html]#
# ping 127.0.0.1 现在可以了
别人 ping 还是不行
ping 别人也是不行
[root@localhost html]# ping 192.168.1.101
ping 别人 出去的 request --icmp-type 8
[root@localhost html]# iptables -A OUTPUT -s 192.168.1.15 -p icmp --icmp-type 8 -j ACCEPT
ping 别人 进来的 replay --icmp-type 0
[root@localhost html]# iptables -A INPUT -d 192.168.1.15 -p icmp --icmp-type 0 -j ACCEPT
[root@localhost html]# ping 192.168.1.101 (现在可以ping通别人了)
dns 服务既要考虑 udp,也要考虑 tcp
udp 需要4条 tcp 也需要4条,共8条
客户端请求我,然后 我再作为客户端请求另外一个服务器
连接追踪的功能
/proc/ 目录下 ,其实是在内存当中的,
ip_conntrack 是根据ip地址来追踪的
[root@localhost html]# cat /proc/net/ip_conntrack (就是ip的追踪信息)
[root@localhost html]# iptstate (全称就是 iptables state能够查看连接信息,专门用于追踪iptables的状态) (只能查看tcp信息,不能查看udp,icmp)
[root@localhost html]# man iptstate
[root@localhost html]# iptstate -t (能显示当前所有连接的个数)
它( cat /proc/net/ip_conntrack , iptstate )不会追踪icmp和udp的信息
(它只保留tcp相关的连接信息)
ip_conntrack 是根据ip地址来追踪的,应该tcp,udp,icmp都能够追踪吧,这里保留的仅仅是tcp的模板,跟tcp相关的连接信息
能够实现对用户请求进来的报文,放行为new状态,
出去的报文仅允许为已建立的(出去的必须为响应的),
这样就能够避免反弹性木马对我们的攻击
[root@localhost html]# lsmod | grep ip
ip_contrack 追踪报文(追踪地址转换的报文) (地址转换的报文要通过它自动管理)
# man modprobe
modprobe (-r remove 移除)(-f force 强制)
[root@localhost html]# modprobe -r ip_conntrack
FATAL: Module ip_conntrack is in use.
[root@localhost html]#
[root@localhost html]# modprobe -r -f ip_conntrack
FATAL: Module ip_conntrack is in use.
[root@localhost html]# modprobe -r nfnetlink
FATAL: Module nfnetlink is in use.
[root@localhost html]# service iptables stop
清除防火墙规则: [确定]
把 chains 设置为 ACCEPT 策略:filter [确定]
正在卸载 Iiptables 模块: [确定]
[root@localhost html]# lsmod | grep ip
ipt_REJECT 38849 0
ip6t_REJECT 38721 1
ip6table_filter 36033 1
ip6_tables 50177 1 ip6table_filter
x_tables 50505 4 ipt_REJECT,ip6t_REJECT,xt_tcpudp,ip6_tables
ipv6 438625 90 ip6t_REJECT,rdma_cm,ib_addr,cnic
xfrm_nalgo 43333 1 ipv6
acpiphp 58841 0
dm_multipath 58969 0
scsi_dh 42561 1 dm_multipath
dm_mod 103313 11 dm_multipath,dm_raid45,dm_snapshot,dm_zero,dm_mirror,dm_log
[root@localhost html]#
[root@localhost html]# cat /proc/net/ip_contrack (一旦ip_contrack这个模块移除(service iptables stop 肯定会移除iptables相关的模块),这个文件就没有了)
[root@localhost html]# modprobe ip_conntrack (装载 ip_conntrack 模块)
[root@localhost html]# cat /proc/net/ip_conntrack (装载 ip_conntrack 模块后,可以看到追踪的情况了)
tcp 6 431999 ESTABLISHED src=192.168.1.15 dst=192.168.1.101 sport=22 dport=3618 packets=24 bytes=2256 src=192.168.1.101 dst=192.168.1.15 sport=3618 dport=22 packets=35 bytes=2544 [ASSURED] mark=0 secmark=0 use=1
[root@localhost html]#
ip_conntrack 这个文件最多能保存(同时追踪)多少条目
(如果超过的话,那些连接就会因为超时而被丢弃)
# cat /proc/sys/net/ipv4/ip_conntrack_max
[root@localhost html]# lsmod | grep ip_conntrack (只要 ip_conntrack 一装载,马上就会主动追踪所有条目,
假如服务器非常繁忙,如果装载了这个模块,后续的用户请求无法正常建立连接,这是非常致命的,
在非常非常繁忙的服务器下,因此最好的办法就是不要触发启动这个模块;;;;当然有时场景上,我们启动这个模块,尽量调大它的ip_conntrack的值
)
ip_conntrack 92004 0
nfnetlink 40457 1 ip_conntrack
[root@localhost html]# service iptables restart
应用 iptables 防火墙规则: [确定]
载入额外 iptables 模块:ip_conntrack_netbios_ns [确定]
[root@localhost html]# service iptables stop
清除防火墙规则: [确定]
把 chains 设置为 ACCEPT 策略:filter [确定]
正在卸载 Iiptables 模块: [确定]
[root@localhost html]# lsmod | grep ip (此时没有启动ip_conntrack)
[root@localhost html]# iptables -t nat -L (它会激活 iptable_nat 和 ip_nat 因为 iptable_nat 和 ip_nat 与 ip_conntrack有依赖关系,所以 ip_conntrack也会被激活)
# lsmod | grep ip
[root@localhost html]# rpm -ql iptables
[root@localhost ~]# iptables -t filter -A INPUT -d 192.168.1.15 -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -t filter -A OUTPUT -s 192.168.1.15 -p tcp --sport 22 -j ACCEPT
[root@localhost ~]#
[root@localhost ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 192.168.1.15 tcp dpt:22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.1.15 0.0.0.0/0 tcp spt:22
[root@localhost ~]# iptables -L -n -v
Chain INPUT (policy ACCEPT 814 packets, 67157 bytes)
pkts bytes target prot opt in out source destination
197 14276 ACCEPT tcp -- * * 0.0.0.0/0 192.168.1.15 tcp dpt:22
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 278 packets, 28405 bytes)
pkts bytes target prot opt in out source destination
33 3484 ACCEPT tcp -- * * 192.168.1.15 0.0.0.0/0 tcp spt:22
[root@localhost ~]#
[root@localhost ~]# service iptables restart (重启后刚加的条目就没有了) (重启iptables,会使用iptables命令清空整个表中的每一个链,还会重新加载它的配置文件 /etc/sysconfig/iptables) 这个文件保存有此前我们写过的规则
(如果文件没有保存,在启动的时候 就是读取这个配置文件来设定规则的)
[root@localhost ~]# iptables -L -n -v
[root@localhost ~]# iptables -t filter -A INPUT -d 192.168.1.15 -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# service iptables save (所以添加了规则后,即要内存中运行的规则, 要 保存到文件中)
将当前规则保存到 /etc/sysconfig/iptables: [确定]
[root@localhost ~]# cat /etc/sysconfig/iptables (此时可以看到新添加的规则)
[root@localhost ~]# service iptables restart
[root@localhost ~]# iptables -L -n -v (此时可以看到条目有了)
[root@localhost ~]# iptables -F (清空filter功能表中的所有链)
[root@localhost ~]# iptables -t filter -A INPUT -d 192.168.1.15 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
(这个命令一写 ip_conntrack 这个模块应该很可能被加载进来了)
[root@localhost ~]# lsmod | grep ip (放行进来的NEW,ESTABLISHED )
[root@localhost ~]# iptables -t filter -A OUTPUT -s 192.168.1.15 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
(放行出去的ESTABLISHED )
[root@localhost ~]# iptables -P INPUT DROP
[root@localhost ~]# iptables -P OUTPUT DROP
[root@localhost ~]#
[root@localhost ~]# iptables -t filter -A INPUT -d 192.168.1.15 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables -t filter -A OUTPUT -s 192.168.1.15 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables -L -n
可以打开
[root@localhost ~]# iptstate
(设置连接追踪最大连接数)
[root@localhost ~]# sysctl -w net.ipv4.ip_conntrack_max=65536 (不会永久有效)
net.ipv4.ip_conntrack_max = 65536
(vim /etc/sysctl.conf 永久有效)
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_conntrack_max
65536
[root@localhost ~]#
[root@localhost ~]# ls /proc/sys/net/ipv4/netfilter/ (有关于tcp的最多,udp,icmp只有超时)
ip_conntrack_buckets ip_conntrack_tcp_timeout_close_wait
ip_conntrack_checksum ip_conntrack_tcp_timeout_established
ip_conntrack_count ip_conntrack_tcp_timeout_fin_wait
ip_conntrack_generic_timeout ip_conntrack_tcp_timeout_last_ack
ip_conntrack_icmp_timeout ip_conntrack_tcp_timeout_max_retrans
ip_conntrack_log_invalid ip_conntrack_tcp_timeout_syn_recv
ip_conntrack_max ip_conntrack_tcp_timeout_syn_sent
ip_conntrack_tcp_be_liberal ip_conntrack_tcp_timeout_time_wait
ip_conntrack_tcp_loose ip_conntrack_udp_timeout
ip_conntrack_tcp_max_retrans ip_conntrack_udp_timeout_stream
icmp 超时是30秒
[root@localhost ~]# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_icmp_timeout
30
[root@localhost ~]#
[root@localhost ~]# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
432000
[root@localhost ~]#
别人ping 进来的请求
[root@localhost ~]# iptables -t filter -A INPUT -d 192.168.1.15 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
别人ping 出去的响应
[root@localhost ~]# iptables -t filter -A OUTPUT -s 192.168.1.15 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
此时 别人可以ping 通
[root@localhost ~]# iptables -L -n --line-numbers (--line-numbers显示行号)
[root@localhost ~]# iptables -I OUTPUT -s 192.168.1.15 -m state --state ESTABLIS (-I 插入第几条,没有的话就是默认为1)
[root@localhost ~]#
[root@localhost ~]# iptables -L -n --line-numbers
[root@localhost ~]# iptables -L -n --line-numbers -v
(被第一条规则匹配到,它就不会匹配第二条规则了)
匹配到第一条,后面的它就不检查了
[root@localhost ~]# iptables -D OUTPUT 2
[root@localhost ~]# iptables -D OUTPUT 2
[root@localhost ~]# iptables -D OUTPUT 2
[root@localhost ~]# iptables -L -n --line-numbers -v
[root@localhost ~]# iptables -A INPUT -d 192.168.1.15 -p tcp --dport 21 -m state --state NEW,ESTABLISH -j ACCEPT
[root@localhost ~]# iptables -A INPUT -i lo -j ACCEPT (因为登录vsftp时本地要连mysql数据库,所以放行本地)
[root@localhost ~]# iptables -A OUTPUT -o lo -j ACCEPT (因为登录vsftp时本地要连mysql数据库,所以放行本地)
[root@localhost ~]# ping 127.0.0.1
[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# ls
ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
这是关于ftp的内容 ,暂时我还不懂
PORT 是主动模式 PASV 是被动模式
[root@localhost vsftpd]# iptables -A INPUT -d 192.168.1.15 -p tcp -m state --state RELATED -j ACCEPT
[root@localhost vsftpd]# iptables -L -n --line-numbers
vsftp 命令连接和数据连接 (数据连接PASV被动模式下,接受客户端的数据连接端口(这个端口是服务端发出随机端口的))
(但是我们不能开放1023的所有端口,因为不安全)
[root@localhost vsftpd]# iptables -R INPUT 6 -d 192.168.1.15 -m state --state RELATED,ESTABLISHED -j ACCEPT
看 现在可以了 (下面 ftp 的时候是21端口 但是 ls 的时候 是随机的一个端口 大约是1023以上的随机端口吧)
[root@localhost vsftpd]# vim /etc/sysconfig/iptables-config (装载模块 ip_conntrack_ftp和 ip_nat_ftp模块)
多个模块的话,彼此间用空格隔开
然后 service iptables save 再然后 service iptables reload
放行 vsftp( ftp )
1) 使用 vsftp (ftp) 需要装载 ip_conntrack_ftp和 ip_nat_ftp 这两个模块
2) iptables 的input链和output链中 放行 RELATED,ESTABLISHED
[root@localhost vsftpd]# iptables -L -n
[root@localhost vsftpd]# service iptables save
将当前规则保存到 /etc/sysconfig/iptables: [确定]
[root@localhost vsftpd]# iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 192.168.1.15 tcp dpt:22 state NEW,ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 192.168.1.15 tcp dpt:80 state NEW,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 192.168.1.15 icmp type 8 state NEW,ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 192.168.1.15 tcp dpt:21 state NEW,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 192.168.1.15 state RELATED,ESTABLISHED
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 192.168.1.15 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain RH-Firewall-1-INPUT (0 references)
target prot opt source destination
[root@localhost vsftpd]# iptables -I INPUT -d 192.168.1.15 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@localhost vsftpd]# iptables -L -n
[root@localhost vsftpd]# iptables -L -n --line-numbers
[root@localhost vsftpd]# iptables -D INPUT 7
[root@localhost vsftpd]# iptables -L -n
[root@localhost vsftpd]# iptables -L -n -v
[root@localhost vsftpd]# service iptables save
将当前规则保存到 /etc/sysconfig/iptables: [确定]
# vim /etc/sysconfig/iptables
[root@localhost vsftpd]# service iptables reload (重新载入一下)
[root@localhost vsftpd]# iptables -L -n
# man iptables (冒号:是连续端口 逗号,是一个一个的端口)
[root@localhost ~]# iptables -L -n
[root@localhost ~]# iptables -A INPUT -d 192.168.1.15 -p tcp -m multiport --destination-ports 21,22,80 -m state --state NEW -j ACCEPT
[root@localhost ~]# iptables -L -n