您的位置:

详解iptables转发

一、iptables转发命令

iptables是一个用于Linux系统的防火墙工具,可以通过它来进行流量控制。其中,转发是iptables最常用的功能之一。针对转发操作的命令主要有以下:

# 显示当前的iptables转发规则
iptables -L -n -t nat 

# 清空所有规则
iptables -F 

# 开启端口转发功能
sysctl net.ipv4.ip_forward=1 

# 固化开启的端口转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward 

# 关闭端口转发功能
sysctl net.ipv4.ip_forward=0 

# 给指定的IP地址设定端口转发规则
iptables -t nat -A PREROUTING -s 192.168.1.1 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.1:80

# 给所有请求设定端口转发规则
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.1:80

# 删除指定的规则
iptables -t nat -D PREROUTING 1

二、iptables转发请求

iptables转发请求指将到达本机的数据包转发到其他主机。这种请求可以分为两种,一种是转发本地请求,另一种是转发外部请求。

当本机需要转发请求时,需要设置PREROUTING表项。例如,将内网的80端口请求转发到本机的8080端口:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

当需要转发外部请求时,需要设置POSTROUTING表项。例如,在本机设置网关为192.168.1.1后,需要将外网的请求通过本机转发到内网的192.168.1.100:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 192.168.1.1

三、iptables转发所有请求

将所有请求转发到指定的地址,可以使用如下命令:

iptables -t nat -I PREROUTING -j DNAT --to-destination 10.0.0.1

此时,所有请求都会被转发到10.0.0.1。

四、iptables转发规则

iptables转发规则是一些针对请求的匹配规则,可以用于过滤请求或者将请求转发到指定的地址。转发规则可以分为PREROUTING、POSTROUTING和OUTPUT三个表项。常用的规则有:

# 外网请求通过本机转发到内网
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 192.168.1.1

# 将访问本机的80端口请求转为8080端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

# 允许请求通过本机转发转到其他的主机
iptables -t nat -A PREROUTING -s 192.168.1.1 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.1:80

五、iptables转发记录

iptables可以记录所有转发请求的信息,可以使用以下命令打开记录功能:

iptables -I FORWARD -j LOG --log-prefix "iptables_forward: "

记录的信息可以在/var/log/messages或者/var/log/syslog中查看。

六、iptables转发端口

iptables可以将到达本机的请求端口转发到其他主机的指定端口,可以使用以下命令:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.0.0.1:8080

此时,所有80端口请求都会被转发到10.0.0.1的8080端口。

七、iptables转发udp

和TCP请求一样,iptables也可以转发UDP请求。只需要将命令中的tcp替换为udp即可:

iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to-destination 192.168.1.1:53

八、iptables转发流量

可以利用iptables转发流量的特性进行负载均衡的操作。例如,将一个端口的请求分配到多个服务器上:

# 首先,记录IP在当天的连接数,并添加规则
iptables -t nat -N ROUTE
iptables -t nat -I PREROUTING -p tcp --dport 80 -j ROUTE

# 对记录的IP按照HASH算法进行负载均衡
iptables -t nat -A ROUTE -m state --state NEW -m hashlimit --hashlimit-name webserver --hashlimit-mode srcip --hashlimit-upto 4 --hashlimit 3/hour --hashlimit-burst 5 -j DNAT --to-destination 192.168.1.1:80

iptables -t nat -A ROUTE -m state --state NEW -j DNAT --to-destination 192.168.1.2:80
iptables -t nat -A ROUTE -j RETURN

九、iptables端口转发

iptables也可以进行端口映射,将本机的某一个端口映射到另一个主机的指定端口。可以使用以下命令:

iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.0.0.1:80

此时,本机的8080端口就可以访问到10.0.0.1的80端口了。

十、iptables转发无效

有时候,在进行iptables转发时会出现无法转发的情况。可以检查以下几个方面:

1、是否开启了端口转发功能

sysctl net.ipv4.ip_forward

2、是否有防火墙或其他安全软件拦截了请求

3、是否设置了正确的转发规则

4、是否和其他的iptables规则产生冲突

检查以上几个方面,基本上就可以解决iptables转发无效的问题了。