防火墙iptables转发规则

规则

推荐阅读Linux防火墙iptables规则设置(转)

一、语法

iptables(选项)(参数)

二、选项

-t<表>:指定要操纵的表; 
-A:向规则链中添加条目; 
-D:从规则链中删除条目; 
-I:向规则链中插入条目; 
-R:替换规则链中的条目; 
-L:显示规则链中已有的条目; 
-F:清楚规则链中已有的条目; 
-Z:清空规则链中的数据包计算器和字节计数器; 
-N:创建新的用户自定义规则链; 
-P:定义规则链中的默认目标; 
-h:显示帮助信息; 
-p:指定要匹配的数据包协议类型; 
-s:指定要匹配的数据包源ip地址; 
-j<目标>:指定要跳转的目标; 
-i<网络接口>:指定数据包进入本机的网络接口; 
-o<网络接口>:指定数据包要离开本机所使用的网络接口。
iptables命令选项输入顺序:

iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作

表名包括:
raw:高级功能,如:网址过滤。
mangle:数据包修改(QOS),用于实现服务质量。
nat:地址转换,用于网关路由器。
filter:包过滤,用于防火墙规则。

规则链名包括:
INPUT链:处理输入数据包。
OUTPUT链:处理输出数据包。
PORWARD链:处理转发数据包。
PREROUTING链:用于目标地址转换(DNAT)。
POSTOUTING链:用于源地址转换(SNAT)。

动作包括:
accept:接收数据包。
DROP:丢弃数据包。
REDIRECT:重定向、映射、透明代理。
SNAT:源地址转换。
DNAT:目标地址转换。
MASQUERADE:IP伪装(NAT),用于ADSL。
LOG:日志记录。
三、常用实例

1、清除已有iptables规则

iptables -F 
iptables -X 
iptables -Z
2、开放指定的端口

iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即运行本机访问本机) 
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行 
iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问 
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问22端口 
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问80端口 
iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允许ftp服务的21端口 
iptables -A INPUT -p tcp --dport 20 -j ACCEPT #允许FTP服务的20端口 
iptables -A INPUT -j reject #禁止其他未允许的规则访问 
iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问
2、屏蔽IP

iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令 
iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令 
iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即从123.45.0.1到123.45.255.254的命令 
iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令
3、查看已添加的iptables规则

iptables -L -n -v
4、删除已添加的iptables规则

4.1、将所有iptables以序号标记显示,执行:

iptables -L -n --line-numbers
4.2、比如要删除INPUT里序号为8的规则,执行:

iptables -D INPUT 8
四、iptables常用命令

service iptables start #启动
service iptables restart #重启
service iptables save #保存
service iptables stop #停止
service iptables status #查询状态

iptables -L -v #建议查看表时,带上-v参数,会显示in out 方向等信息,显示的信息更完整、详细。
iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j ACCEPT  #针对INPUT链增加一条规则,接收从eth0口进入且源地址为192.168.0.0/16网段发往本机的数据
iptables -D #删除规则,命令后可接序号
iptables -F #所有规则都清除掉
iptables-save >/home/pi/iptables.bak #备份规则到指定目录的指定文件
iptables-restore </home/pi/iptables.bak #恢复指定文件的规则
service iptables save #配置保存到/etc/sysconfig/iptables
注意:以上命令在Ubuntu/Debian中无法使用。

1.增加

转载:地址

iptables -t nat -A PREROUTING -p tcp --dport 指定端口 -j REDIRECT --to-ports 53
iptables -t nat -A PREROUTING -p udp --dport 指定端口 -j REDIRECT --to-ports 53

类如:

 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5601

使用 iptables 转发,将到 80 端口的请求全部转发到 5601,而且这样两个端口可以同时工作

2.删除 -1就是num

iptables -t nat -D PREROUTING 1

-----------------------------------------
-- 查找所有规则

iptables -L INPUT --line-numbers
-- 删除一条规则

iptables -D INPUT 11

----------------------------------------
还有第二种方法
第二种办法是 -A 命令的映射,不过用-D替换-A。当你的链中规则很复杂,而你不想计算它们的编号的时候这就十分有用了。
也就是说,你如何一开始时用iptables -A…. 语句定义了一个规则,那么删除此条规则时直接用 -D 来代替- A, 其余的都不变即可,而不需要什么编号了。

3.查看

service iptables status或iptables  -t  nat  -nL

4.保存

sudo service iptables save

6. 25种常用方式   

----转发:地址

1、清空已存在的规则

    在你建立一套新的iptables规则时,你可能需要清空默认规则,或者已有规则,如下所示,使用iptables flush 命令可以满足你的需要:

iptables -F
(or)
iptables --flush
2、设置默认链规则

    iptables命令默认规则是ACCEPT,设置INPUT,OUTPUT,FORWARD这些链的默认规则为DROP,命令如下:

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
    如果你为OUTOUT和INPUT这两条链设置默认规则为DROP,当你设置规则时就需要考虑设置两条,一条控制进入的,一条控制出去的。

    在以下所有的示例中,我们都将设置两条规则,因为我们为OUTPUT和INPUT这两条链设置的默认规则为DROP。

    如果你信任你的内部用户,你可以忽略上述示例中的最后一条。默认不丢弃所有出去的数据。在这种情况下,你只需要针对进入的数据进行设置,当然所有出去的数据都是被允许的。

注意:如果你不了解iptables的各个链,可以通过这个链接学习下基本知识iptables chains

3、阻断一个IP地址

    如果你想在我们进行更深入的学习之前阻断一个IP地址,你可以键入以下命令。把“x.x.x.x“改变成你想要阻断的IP地址。

BLOCK_THIS_IP="x.x.x.x"
iptables -A INPUT -s "$BLOCK_THIS_IP" -j DROP
    如果你发现在日志文件中显示有一个固定的ip地址产生很多奇怪的活动,在你进行更深入的调查时,希望临时性的阻断此IP地址,那么此命令就是非常有用的。

    你也可以通过简单的变化,来阻断此IP地址在eth0端口上所有基于TCP的连接:

iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP
iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP
4、允许接入的SSH连接

    以下的命令允许在eth0接口上接入的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
注意:如果你想理解规则中每个参数的意义,你可以访问此链接How to Add IPTables Firewall Rules

5、允许来自指定网段的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
    在以上的例子中,你也可以用全子网掩码192.168.100.0/255.255.255.0来代替192.168.100.0/24。

6、允许HTTP和HTTPS的入站连接

    以下示例是允许入站的web服务连接(http服务端口为80):

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
    以下示例是允许入站的安全的web服务连接(https服务端口为443):

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
7、使用多端口扩展减少配置条目

    如果你允许对多个端口的入站请求,你可以使用多端口扩展功能,而不必为每个端口都建立一条规则,如下:

    以下的示例是允许外部连接对于本机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
8、允许本地主机SSH服务的出站连接

    如果你想通过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两种状态,而入站时候只有ESTABLISHED一种状态,这是因为传输控制协议(TCP)的特点造成的,SSH的入站连接也是此特点。

9、允许SSH对指定网络的出站连接

    下面的示例是仅允许SSH服务出站连接到192.168.100.0/24网络地址段内的主机:

iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
10、允许对HTTPS服务的出站访问

    下面的规则允许对HTTPS服务的出站访问,如果你允许你的用户可以使用WEB服务,那么这条规则是很有用的。如果你想在服务器上使用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服务是80端口,https是443端口

11、负载均衡WEB入站请求

    你也可以使用防火墙负载均衡对于web服务的入站请求。

    这里演示nth扩展。下面的示例负载均衡https服务至三个不同的ip地址,每第三个数据包开始做目标地址转换。(但是请注意他们的初始值packet不同,下面的例子也就第一条中的ip地址会接入三个请求,下面两条会依次递减一。此处笔者有些疑惑,man了下iptables也不是很清楚,尤其这个 --counter 0 的作用,如果大家比较理解nth,还请留言区留言,原文链接参考文章最底部)

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
12、允许外部主机PING通内部主机

    下面的示例允许外部的用户PING通你内部的服务器:

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
13、允许内部主机PING通外部主机

    下面的示例允许你从内部PING通外部的服务器

iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
14、允许本地环回地址的连接

    你应该允许环回地址的连接,比如127.0.0.1地址的连接(以便TEST使用)

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
15、允许内部网络连接外部网络

    如果你的防火墙服务器有两块网卡,一块eth0连接内网,一块eth1连接外网,使用下面的规则就可以放行内网向外网发起的连接请求(注意方向:内网—>外网):

iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
16、允许对DNS服务的出站请求

    下面的示例允许想外请求DNS服务:

iptables -A INPUT -p udp -d eth0 --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp -s eth0 --dport 53 -j ACCEPT
17、允许NIS连接

    如何你正在使用NIS来管理你的用户账户,你应该方向NIS连接。尽管SSH已经被放行,如果你没有对NIS相关的ypbind服务放行,那么你的用户还是不能登录。

    NIS服务的端口是动态的,当ypbind服务开始时分配端口。

    首先用rpcinfo -p来查询实际使用的端口,下面的例子显示正在使用853和850端口。

rpcinfo -p | grep ypbind
    也放行到111端口的入站请求:

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重启之后将会失效,应该端口将会重新分配。有两个解决办法,第一,为你的NIS服务器静态配置IP地址,第二,写一个完美的shell脚本,从“rpcinfo -p”中动态抓取端口号,并在iptables中使用。

18、允许来自指定网段的RSYNC

    下面的示例允许来自指定网段的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
19、允许来自指定网段的对mysql服务的连接

    如何你正在运行MySQL,一般来说你希望外部网络可以直连到mysql数据库。在多数情况下,在运行mysql服务器上同时还运行着Web服务。

    然而,数据库管理员和程序开发人员可能通过安装在他们个人终端上的mysql客户端直连到数据库。在这种情况下,你就需要允许内部网络直连到数据库了。规则如下:

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
20、放行Sendmail和Postfix Traffic服务

    下面的规则放行Sendmail,Postfix Traffic邮件服务:

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
21、放行IMAP和IMAPS服务

    下面的规则放行IMAP和IMAP2服务:

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服务:

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
22、放行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
23、阻止DoS***

    下面的规则将帮助你的服务器避免DoS(Denial of Service)***:

iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
在上面的例子中:

-m limit:声明使用limit扩展

-limit 25/minute:限制每分钟的服务请求数,可以根据你的实际需要进行调整

-limit-burst 100:这个是使用-limit 25/minute的前提条件,当总请求数达到100时开始执行每分钟25个请求数的限流

24、端口转发

    下面的示例将访问端口442的连接路由至端口22。这个意味着ssh的入站连接可以发送至端口422和22。

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
25、记录下丢弃的数据包

    你可能希望去记录下所有的被拒绝的数据包,下面的规则应该卸载iptables的最下面。

    首先,创建一个名称为LOGGING的心链:

iptables -N LOGGING
    然后,确保其余的所有入站连接跳转到LOGGING链上,如下:

iptables -A INPUT -j LOGGING
    随后,利用“log-prefix“来对所匹配的数据包进行注释,以免混淆:

iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7
    最后,丢弃这些包:

iptables -A LOGGING -j DROP
以上25种iptables规则都遵循shell脚本的格式 iptables-rules。

 

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值