ipsec vpn的防火墙设置

我之前的防火墙规则特别复杂,是从网上抄来的。它主要解决了,server如果没有固定IP该怎么办的问题。

关于iptables的比较新的官方文档可见这里:https://access.redhat.com/knowledge/docs/en-US/Red\_Hat\_Enterprise\_Linux/6/html/Security\_Guide/sect-Security\_Guide-IPTables.html 这是CentOS 6的。

我们的需求:

  1. 做SNAT。众所周知,公网IP很有限,都得花钱买。所以在这样的场景下,分给client的一般都是内网IP。比如192.168.3.4。那么当client想访问google这样的网站时,vpn server就必须充当路由器的作用,做地址翻译,即SNAT。SNAT的意思是指,修改第一个IP包的source地址。与之相反的是DNAT,修改第一个IP包的destination地址。

  2. 允许任何人从外网访问racoon daemon。因为这是建立IPSec连接的第一步啊。

先说第一个。iptables中,SNAT有两种方式,-j SNAT或-j MASQUERADE

假设我的分配给VPN的ip pool是172.17.34.0/24,那么

iptables -t nat -A POSTROUTING -o eth0 ! -d 172.17.34.0/24 -j SNAT --to 173.245.73.182

或 iptables -t nat -A POSTROUTING -o eth0 ! -d 172.17.34.0/24 -j MASQUERADE

第一条适用于server有固定IP。第二条适用于server没有固定IP。

如果server没有固定IP,我们可以在mangle中加一条规则,在路由之前给esp包加一个mark

-A PREROUTING -i eth0 -p esp -j MARK --set-mark 1

然后在filter中,所有被mark的input和forward应当被接收

-A INPUT -i eth0 -m mark --mark 1 -j ACCEPT

-A FORWARD -i eth0 -m mark --mark 1 -j ACCEPT

然后说第二个需求:

IPSec的IKE server的默认端口是500

-A INPUT -p udp -m udp --dport 500 -j ACCEPT

如果添加了对NAT的支持(如果client没有公网IP),那么还有4500

-A INPUT -p udp -m udp --dport 4500 -j ACCEPT

如果还套了一层L2TP,那么还有1701

-A INPUT -p udp -m udp --dport 1701 -j ACCEPT

input来的所有esp包应当被接受

-A INPUT -p esp -j ACCEPT

足够了。

其实FORWARD链怎么配成白名单我还不大会。请指教。(别黑我啊)

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥