用iptables做NAT代理,使内网机器上外网

2022/3/26 7:23:18

本文主要是介绍用iptables做NAT代理,使内网机器上外网,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

用iptables做NAT代理,使内网机器上外网

 

现状:
服务器A只有一个内网IP,不能上外网,内网IP与服务器B内网相通;服务器B有一个内网IP和公网IP。想实现服务器A也能上外网。

1
2
3
4
服务器A:内网网卡:eth0  内网IP:192.168.0.10
 
服务器B:内网网卡:eth0  内网IP:192.168.0.20
         外网网卡:eth1  外网IP:203.195.45.182

实现方法:
1、在可以上外网的服务器B上,开启路由转发功能:
 
方法一:

1
# echo 1 > /proc/sys/net/ipv4/ip_forward

注:上面命令在服务器重启之后会失效,可以编辑/etc/rc.d/rc.local把上面命令添加到最底部,实现开启自动执行。
 
方法二:

1
2
3
4
5
编辑/etc/sysctl.conf
找到net.ipv4.ip_forward = 0 修改为 net.ipv4.ip_forward = 1 最后保存。
 
执行sysctl -p命令使配置生效:
# sysctl -p

2、在可以上外网的服务器B上执行添加SNAT规则

1
# iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.10 -j SNAT --to 203.195.45.182
或者iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -o eth0 -j MASQUERADE

如果想让整个网段都通过服务器B上外网,修改上面规则命令中-s 192.168.0.10为-s 192.168.0.0/24,然后把想上外网的服务器默认网关改成192.168.0.20就可以了。
 
3、保存刚添加的iptables规则

1
# service iptables save

4、在需要上外网的服务器A上,修改内网网卡eth0的默认网关为192.168.0.20

1
# route add default gw 192.168.0.20

修改后,查看路由表,确认已修改成功,测试已经可以上外网了

1
2
3
4
5
6
# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
0.0.0.0         192.168.0.20    0.0.0.0         UG    0      0        0 eth0

 

 

 

iptables配置使用 Snat 实现内网代理上公网【转】 

 

NAT 全名是 Network Address Translation,字面上的意思是网络地址转换,它还可以分为源地址转换(SNAT)和目的地址转换(DNAT)。SNAT 主要是用来给内网的主机提供连接到 Internet 的默认网关,而 DNAT 主要将内网机器的端口映射到外网上面。

如果你在云服务商哪里(比如,阿里云/亚马逊云等)购买了多台机器,来组件一套服务的话(比如,应用和数据分离/数据库读写分离等),我们可以通过最外置的服务器公网来访问部署的服务,但是如果需要后置的内网机器来访问外网的话(比如,需要爬取网页信息/访问外部服务器等)的话,就比较尴尬了。

当然,这个时候,我们可以为需要访问外网的后置机器来配置云服务商的公网地址,达到上述的目的。或者,使用一些代理软件或工具达到同样的目录(支持多种协议类型)。但是,相对于使用防火墙规则来配置的话(比如,iptables/firewalld),会比较麻烦和费劲,此外还会有安装相关的问题(比如,软件工具等的bug或设计缺陷)。相对于使用一两条命令可以完成的事情,何必那么费时呢?

外置公网 IP 机器 - 系统配置
# 开启IP转发功能
$ sudo sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf

# 使修改的配置生效
$ sudo sysctl –p
外置公网 IP 机器 - 防火墙配置
复制代码
# 默认accept的情况下必须要执行,默认是drop的话则需要执行
$ sudo iptables -I FORWARD -s 172.16.3.0/24 -j ACCEPT
$ sudo iptables -P INPUT ACCEPT
$ sudo iptables -P FORWARD ACCEPT
$ sudo iptables -P OUTPUT ACCEPT

# 在iptables上面添加Snat防火墙转换规则
# 内网网段: 172.16.3.0/24
# 外置公网主机: 172.16.3.100
$ sudo iptables -t nat -I POSTROUTING -s 172.16.3.0/24 -j SNAT --to-source 172.16.3.100
或者iptables -t nat -A POSTROUTING -s 172.16.3.0/255.255.255.0 -o eth0 -j MASQUERADE

# 阿里云的话需要在VPC中添加一条VPC路由
# 登录VPC控制台 -> 专用网络 -> 实例管理 -> 路由表 -> 管理中添加路由条目
目标网段    0.0.0.0/0
下一跳类型  ECS实例
ECS实例    i-29304w23

# 后置主机测试是否可以访问外网
$ ping www.bing.com
复制代码

转自

配置使用 Snat 实现内网代理上网
https://mp.weixin.qq.com/s/pJRSLlkJPTwAfBW_xQUT8Q

   

Iptables实现公网IP DNAT/SNAT

发布时间:June 13, 2013 // 分类:Iptables // No Comments

 

Iptables实现NAT是最基本的功能,大部分家用路由都是基于其SNAT方式上网,使用Iptables实现外网DNAT也很简单,不过经常会出现不能正常NAT的现象。
以下命令将客户端访问1.1.1.1的HTTP数据DNAT到2.2.2.2,很多人往往只做这一步,然后测试不能正常连接。

1 iptables -t nat -A PREROUTING -p tcp -d 1.1.1.1 --dport 80 -j DNAT --to 2.2.2.2:80

想像一下此时客户端访问1.1.1.1的数据流程:

1 2 3 4 客户端访问1.1.1.1 1.1.1.1根据Iptables DNA将数据包发往2.2.2.2,此时源IP为客户端IP 2.2.2.2处理后根据源IP直接向客户端返回数据,要知道此时客户端是直接和1.1.1.1连接的 然后呢,客户端不知所云,不能正常连接

最后还要添加一条SNAT规则,将发到2.2.2.2的数据包SNAT,1.1.1.1充当代理服务器的角色。

1 iptables -t nat -A POSTROUTING -d 2.2.2.2 -j SNAT --to-source 1.1.1.1

别忘记开启内核转发功能:

1 echo 1 > /proc/sys/net/ipv4/ip_forward


这篇关于用iptables做NAT代理,使内网机器上外网的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程