Skip to content

zhouxucs/soft-nat-router

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 

Repository files navigation

打开iptables开关

编辑/etc/sysctl.conf文件:

vim /etc/sysctl.conf

加入如下配置:

net.ipv4.ip_forward=1

或者

sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

iptables一共有3个table,分别是filter,nat和xxx。其中filter表是默认的表,如果不用-t参数指定,默认使用iptables命令时是对filter表进行修改。每个table有若干个chain,每个chain有若干个规则和一个policy。对iptables的配置就是针对某一个table的rru若干个chains,增加或者删除规则。

配置NAT

假设NAT主机有两个网卡,一块连接公网,IP地址为10.0.0.1,另一块连接内网,IP地址为192.168.1.1。NAT主机可以实现两个功能:一是内网(192.168.1.0/24)中的主机可以通过NAT访问外网;二是外网的主机可以通过NAT访问内网主机提供的服务。

1. 内网访问外网

修改内网主机发往公网报文的源地址。我们需要在iptables的nat表的POSTROUTING链上增加规则:

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

同时我们需要在filter表的forword链上增加规则,允许NAT主机转发来自192.168.1.0/24网段的地址

sudo iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT

同时,为了外网返回的报文能够回到内网,我们要允许主机转发发往192.168.1.0/24网段的地址

sudo iptables -A FORWARD -d 192.168.1.0/24 -j ACCEPT

如果公网网卡是动态获得IP地址的,可以使用下面的方法设置:

sudo iptables -t nat -A POSTROUTING -s ${INTERNAL_SUB_NET} -o ${WAN} -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT

2. 外网访问内网主机

这里主要使用目的地址转换和端口映射

公网通过NAT访问内网主机需要在nat表的PREROUTING链上修改目的地址。之所以要在PREROUTING链上做是因为目的地址的修改必须发生在路由之前,这样路由才能把报文发送到修改后的目的地址。

sudo iptables -t nat -A PREROUTING  -d 10.0.0.1 -p tcp -j DNAT --to-destination 192.168.1.2

这样NAT会把所有发给10.0.0.1的报文转发给内网的192.168.1.2主机。

上述规则还可以加上源地址限制,只允许符合条件的公网地址访问内网主机:

sudo iptables -t nat -A PREROUTING -s 10.0.0.0/24 -d 10.0.0.1 -p tcp -j DNAT --to-destination 192.168.1.2

这样一来,就只有10.0.0.0/24这个网段的公网地址可以访问到内网的192.168.1.2主机

如果我们仅开放内网主机的某一个服务,可以做端口映射:

sudo iptables -t nat -A PREROUTING -d 10.0.0.1 -p tcp 80 --dport -j DNAT --to-destination 192.168.1.2

还可以把公网地址的端口映射为内网主机不同的端口:

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

About

setup a NAT server using Linux iptables

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages