顯示具有 vpn 標籤的文章。 顯示所有文章
顯示具有 vpn 標籤的文章。 顯示所有文章

2016年8月19日 星期五

AWS 筆記 - 透過 VPN/IPSEC 讓 AWS VPC 與 Microsoft Azure VirtualNetwork 互通

對 Azure 來說,預設建置的 VirtualNetwork 就是 10.0.0.0 開頭的網路環境,大多可以繼續延用下去。在這延續上一篇 AWS 筆記 - 建置自己的 VPC 且透過 VPN/IPSec 讓各個 Region 的 VPC 互通 ,先簡略調整 Azure VirtualNetwork 環境,接著建置 Azure VPC 與 AWS VPC 連線機制。

假設 AWS VPC 為 10.100.0.0/16 網域,而 Azure VirtualNetwork 為 10.50.0.0/16 網域。

設置 Azure VPC:

Azure Portal -> New
-> Resource -> Create -> name=StudyVPN, Location=WestUS
-> Networking -> VirtualNetwork
-> Name=US
-> Address Space=10.50.0.0/16
-> Subnet Name=default
-> Subnet address range=10.50.0.0/24
-> Location = WestUS
-> Virtual Machines -> Ubuntu Server 14.04
-> Name=VPN
-> Location = WestUS
-> DS1_V2 Standard

請先將 AWS EC2 Security Group 跟 Azure Network security group 都設置好、開放對方 VPN IP。此例為 AWS EU-West-1 機器跟 Azure WestUS 機器,設置完防火牆後,先 ping 一下彼此吧。

在 EU-West-1 的 VPN Server 機器,其 public ip = 52.209.16.24:

$ ping 13.88.186.107

在 Azure WestUS 的 VPN Server 機器,其 public ip = 13.88.186.107:

$ ping 52.209.16.24

先設置 Azure VPN server:

$ sudo apt-get update && sudo apt-get -y upgrade && sudo apt-get -y dist-upgrade && sudo apt-get autoremove && sudo apt-get autoclean

$ sudo apt-get install openswan
$ ls /etc/ipsec*
/etc/ipsec.conf  /etc/ipsec.secrets

/etc/ipsec.d:
aacerts  cacerts  certs  crls  examples  ocspcerts  policies  private
$ sudo ipsec setup version
Linux Openswan U2.6.38/K3.19.0-65-generic (netkey)
See `ipsec --copyright' for copyright information.
$ sudo vim /etc/ipsec.d/AWS-EU-WEST-1.conf
conn Connect-to-AWS-EU-WEST-1
 type=tunnel
 authby=secret

 leftid=13.88.186.107
 left=%defaultroute
 leftsubnet=10.50.0.0/16
 leftnexthop=%defaultroute

 right=52.209.16.24
 rightsubnet=10.100.0.0/16

 pfs=yes
 auto=start
$ sudo vim /etc/ipsec.d/AWS-EU-WEST-1.secrets
13.88.186.107 52.209.16.24 : PSK "IPSEC_PASSWORD"

$ sudo vim /etc/ipsec.conf
#protostack=auto
protostack=netkey

#...
include /etc/ipsec.d/AWS-EU-WEST-1.conf

$ sudo vim /etc/ipsec.secrets
include /etc/ipsec.d/AWS-EU-WEST-1.secrets

$ sudo ipsec setup restart
ipsec_setup: Stopping Openswan IPsec...
ipsec_setup: Starting Openswan IPsec U2.6.38/K3.19.0-65-generic...


更新 AWS VPN server:

$ sudo vim /etc/ipsec.d/AZURE-US-WEST.conf
conn Connect-to-AZURE-EU-WEST
 type=tunnel
 authby=secret

 leftid=52.209.16.24

 left=%defaultroute
 leftsubnet=10.100.0.0/16
 leftnexthop=%defaultroute

 right=13.88.186.107
 rightsubnet=10.50.0.0/16

 pfs=yes
 auto=start
$ sudo vim /etc/ipsec.d/AZURE-US-WEST.secrets
$ sudo ipsec setup restart
ipsec_setup: Stopping Openswan IPsec...
ipsec_setup: Starting Openswan IPsec U2.6.37/K4.4.11-23.53.amzn1.x86_64...
ipsec_setup: /usr/libexec/ipsec/addconn Non-fips mode set in /proc/sys/crypto/fips_enabled


當兩邊的設定好後,並且用 ipsec setup restart 後,另一方才可以用指令連上對方:

Azure VPN server:

$ sudo ipsec auto --up Connect-to-AWS-EU-WEST-1
117 "Connect-to-AWS-EU-WEST-1" #4: STATE_QUICK_I1: initiate
004 "Connect-to-AWS-EU-WEST-1" #4: STATE_QUICK_I2: sent QI2, IPsec SA established tunnel mode {ESP=>0x29ba22d7 <0x68b944dd xfrm=AES_128-HMAC_SHA1 NATOA=none NATD=52.209.16.24:4500 DPD=none}


AWS VPN server:

$ sudo ipsec auto --up Connect-to-AZURE-EU-WEST
117 "Connect-to-AZURE-EU-WEST" #6: STATE_QUICK_I1: initiate
004 "Connect-to-AZURE-EU-WEST" #6: STATE_QUICK_I2: sent QI2, IPsec SA established tunnel mode {ESP=>0x74246b5f <0x7156f72b xfrm=AES_128-HMAC_SHA1 NATOA=none NATD=13.88.186.107:4500 DPD=none}


並且兩邊就可以 ping 彼此的 private ip 囉!

接著還需設定 routing table 以及對 AWS VPN Server機器打開 Change Source/Dest. Check 、對 Azure VPN Server 機器的網卡打開 IP forwarding 後,兩邊機器就可以互相 ping  到啦:

對 AWS 而言,在 VPC Dashboard -> Route 中,將相關的子網域都添加一則 10.50.0.0/16 導向至 AWS VPN Server (別忘了,若第一次設置 EC2 上的 VPN Server,還要從 EC2 Dashboard 修改該機器,取消 Change Source/Dest. Check)

對 Azure 而言,Azure portal -> New -> Networking -> Route table ,建立後,再去設定

Resource -> Route table -> Settings
-> Routes -> Add -> Route name=ToAWS, Address prefix=10.100.0.0/16, Next hop type=Virtual appliance -> Next hop address=10.50.0.4 (Azure VPN Server Private IP)
-> Subnet -> Associate subnet -> 挑選 VirtualNetwork、挑選 Subnet

最後,記得 NAT 相關要設定好,像在 Azure 上的 VPN server 是從一台乾淨的 Ubuntu 14.04 裝後,還必須設定以下:

$ echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
$ echo "net.ipv4.conf.all.accept_redirects = 0" | sudo tee -a /etc/sysctl.conf
$ echo "net.ipv4.conf.all.send_redirects = 0" | sudo tee -a /etc/sysctl.conf
$ for vpn in /proc/sys/net/ipv4/conf/*; do echo 0 | sudo tee $vpn/accept_redirects; echo 0 | sudo tee $vpn/send_redirects; done
$ sudo sysctl -p


其他備註:

$ sudo ipsec setup restart
ipsec_setup: Stopping Openswan IPsec...
ipsec_setup: Starting Openswan IPsec 2.6.38...
ipsec_setup: No KLIPS support found while requested, desperately falling back to netkey
ipsec_setup: NETKEY support found. Use protostack=netkey in /etc/ipsec.conf to avoid attempts to use KLIPS. Attempting to continue with NETKEY


解法 => protostack=netkey

$ sudo ipsec auto --up Connect-to-AWS-EU-WEST-1
022 "Connect-to-AWS-EU-WEST-1": We cannot identify ourselves with either end of this connection.


解法 => 先把一些錯誤訊息修掉,如 sudo ipsec setup restart 看到的問題,接著再看 conn 的設定,當設定錯誤也會看到這段訊息。

2014年2月13日 星期四

翻來翻去的筆記: Proxy、VPN 和 SSH Tunnel、iptables port forwarding 混用

???

有想要翻出去,就會有人想要翻進去 XD 在指定國家內架一檯 server ,提供 proxy 、 VPN 服務,提供另一個國家連線,這是一個滿常見的做法,只是,如果國家網路掌控很威,那需要嘗試一些小手段:

前提:

自家機器 IP: localhost , 可用 local_port
指定國家 SERVER IP: x.x.x.x , target service port: xx
第二國家 SERVER IP: y.y.y.y , port forward: yy

SSH Tunnel

假設在指定國家內的 server 服務都是跑 TCP 時,如果直接連它還是不夠順,那就試試 Service over SSH tunnel 吧!

$ ssh -N -L local_port:x.x.x.x:xx x.x.x.x

如此一來,原先的服務就可以改連 localhost:local_port 代替 x.x.x.x:xx 服務。若 ssh tunnel 需要斷掉還能自動重連,在 Ubuntu 就是用 autossh ,把 ssh 指令換成 autossh 即可。若開機就執行,就寫在 /etc/rc.local,另外也用 key-pair 登入來取代密碼輸入:

$ sudo vim /etc/rc.local
su -s /bin/sh account -c 'autossh -N -f -L x.x.x.x:xx x.x.x.x'


有時候單純是 routing table 的問題,需要假藉另一個國家 y.y.y.y 當跳板,這時 TCP/UDP 都可以用 iptables 處理掉(-p tcp 或 -p udp),在 y.y.y.y 機器設定:

$ iptables -A PREROUTING -t nat -i eth0 -p tcp --dport yy -j DNAT --to x.x.x.x:xx
$ iptables -A FORWARD -p tcp -d x.x.x.x --dport xx -j ACCEPT


如此一來,連 y.y.y.y:yy 等同連到 x.x.x.x:xx 。

此外,純 TCP 在 Ubuntu 中還可以透過 redir 套件來處理,若 redir 已安裝好後,好處相較于 iptables 可以不需要 root 權限:

$ redir --lport yy --laddr=y.y.y.y --cport=xx --caddr=x.x.x.x

以 Proxy、VPN 這類服務而言,大概能搞的招數就這些吧,例如 Proxy over SSH tunnel 或甚至 SSH tunnel 是從第二國家建立,以此強制 routing 的改變。

[Linux] 架設 OpenVPN server 與 OpenVPN client 設定 @ Ubuntu 12.04

嘗過過 PPTP、L2TP 後,接著把玩 OpenVPN。此例 OpenVPN server 跟 OpenVPN client 都是 Ubuntu 12.04,其中一個是 server 版,另一個是 desktop 版。

Ubuntu Server: 安裝:

$ sudo apt-get install openvpn

Ubuntu Server: 憑証(順便把 OpenVPN client 做完):

$ cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /tmp/easy-rsa
$ cp /tmp/easy-rsa/openssl-1.0.0.cnf /tmp/easy-rsa/openssl.cnf
$ cd /tmp/easy-rsa/
$ source ./vars
$ ./clean-all
$ ./build-dh
$ ./pkitool --initca
$ ./pkitool --server server
$ ./build-key client
$ sudo su
# chown -R root:root /tmp/easy-rsa/keys/
# cd keys
# cp ca.crt server.crt server.key dh*.pem /etc/openvpn/


Ubuntu Server: 建立 /etc/openvpn/server.conf:

$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn
$ sudo gunzip /etc/openvpn/server.conf.gz


Ubuntu Server: 設定 /etc/openvpn/server.conf (修改要跑的 port, ip, tcp or udp mode):

$ sudo vim /etc/openvpn/server.conf

Ubuntu Server: 讓 OpenVPN client 可以透過 OpenVPN server 連出去外網,其中 eth0 為 OpenVPN server 對外網卡、10.8.0.0/24 是預設的 OpenVPN 區段:

$ sudo vim /etc/openvpn/server.conf
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"

$ iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE


Ubuntu Client: 安裝(從OpenVPN server 取得 ca.crt、client.crt、client.key):

$ sudo apt-get install openvpn
$ sudo cp -r /usr/share/doc/openvpn/examples/sample-config-files/ /etc/openvpn/example
$ sudo cp ca.crt client.crt client.key /etc/openvpn/example


Ubuntu Client: 設定(修改 server ip, port, tcp or udp mode):

$ sudo vim /etc/openvpn/example/client.conf

Ubuntu Client: 執行:

$ sudo openvpn --config /etc/openvpn/example/client.conf

Ubuntu Client: 開機執行:

$ sudo vim /etc/rc.local
openvpn --config /etc/openvpn/example/client.conf > /var/log/openvpn_client.log 2>&1 &


如果 OpenVPN client 還有提供 NAT 服務,那記得 iptables 要加上這段(tun0可以用 ifconfig查看):

VIF="tun0"
iptables -t nat -A POSTROUTING -o $VIF -j MASQUERADE

2014年2月11日 星期二

[Linux] VPN L2TP client + DHCP server + NAT iptables @ Ubuntu 12.04 desktop

VPN client + DHCP server + NAt

試了一個小型的網路架構,原本打定把 AP 刷成 DD-WRT 後,即可將 WAN 設定成 VPN 走法,可惜 AP 實在不穩,就改拉一台 PC 來用。此例用一台 Ubuntu 12.04 Desktop 當作 VPN client,此外,為了讓其他 clients 不需要處理 VPN 的連線,因此,讓這台 Ubuntu desktop 又充當 DHCP server,藉以再接一台 AP 出來,供眾人使用,眾人只需要連上 AP 後,就可以走指定的 VPN 通道。

為此,先介紹 Ubuntu 12.04 這檯機器,需要兩張網卡,分別為 NIC 1 跟 NIC 2 ,以下則用 eth0 跟 eth1 區分,而 VPN 走的網卡是 ppp0 (可以連通 VPN 後,用 ifconfig 查看)。其中 eth0 的網路是自動取得 IP 的。

設定 eth1 網卡:

$ sudo vim /etc/network/interfaces
auto eth1
iface eth1 inet static
address 192.168.168.1
netmask 255.255.255.0
network 192.168.168.0

broadcast 192.168.168.255


架設 DHCP server:

$ sudo apt-get install isc-dhcp-server
$ sudo vim /etc/default/isc-dhcp-server
INTERFACES="eth1"
$ sudo vim /etc/dhcp/dhcpd.conf
option domain-name "example.org";
option domain-name-servers 8.8.8.8;
subnet 192.168.168.0 netmask 255.255.255.0 {
  range dynamic-bootp 192.168.168.50 192.168.168.100;
  option routers 192.168.168.1;
}
$ sudo service isc-dhcp-server restart


設定 NAT 與 iptables:

$ echo "1" > /proc/sys/net/ipv4/ip_forward
$ sudo vim /etc/rc.local

echo "1" | tee /proc/sys/net/ipv4/ip_forward

OIF="eth0"
VIF="ppp0"
IIF="eth1"
INNET="192.168.168.0/24"

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

iptables -t nat -A POSTROUTING -o $OIF -s $INNET -j MASQUERADE
iptables -t nat -A POSTROUTING -o $VIF -j MASQUERADE


如此一來,即可收工。

[Linux] VPN L2TP client mode @ Ubuntu 12.04 Desktop

持續惡搞網路中,這次換把一台 Ubuntu desktop 當成 VPN Client 去連線。

$ sudo apt-add-repository ppa:werner-jaeger/ppa-werner-vpn
$ sudo apt-get update
$ sudo apt-get install l2tp-ipsec-vpn

註:若採用 Ubuntu 12.04 內建的 apt-get source list 安裝 l2tp-ipsec-vpn 後,卻連不上 :P

接著到左上角的 Dash Home 搜尋 VPN 來用:

vpn_client_setting_0

接著,就可以依序填寫資料:

vpn_client_setting_1

vpn_client_setting_2

填寫完記得按 "OK" 與 "Close" 後,再去右上角的 L2TP Ipsec VPN Applet 去點選連線囉!

如果,進行的不順利,可以試著跑去 VPN Server 上,查看 logs ,而 logs 預設沒有啟動,要去修改:

$ sudo vim /etc/ipsec.conf
config setup
  # ...
  # Use this to log to a file, or disable logging on embedded systems (like openwrt)
  plutostderrlog=/var/log/ipsec.log

$ sudo touch /var/log/ipsec.log
$ sudo service ipsec restart
ipsec_setup: Stopping Openswan IPsec...
ipsec_setup: Starting Openswan IPsec 2.6.37...
$ sudo tail -f /var/log/ipsec.log
added connection description "L2TP-PSK-noNAT"
listening for IKE messages
adding interface eth0/eth0 x.x.x.x:500
adding interface eth0/eth0 x.x.x.x:4500
adding interface lo/lo 127.0.0.1:500
adding interface lo/lo 127.0.0.1:4500
loading secrets from "/etc/ipsec.secrets"
loading secrets from "/var/lib/openswan/ipsec.secrets.inc"
...


如此一來,有人連線就會噴訊息囉。

2014年2月7日 星期五

[Linux] VPN (L2TP) 與使用 iptable 設定 Port forward @ Ubuntu 12.04

這樣的標題不是很恰當,但我暫時想不到好的方式。

使用情境:

  • 有 A, B 兩檯在不同國家的機器
  • 對 A 機器而言,無法直接連到 B 機器之國家內的服務
  • 解法透過 B 機器架設 VPN 服務,讓 A 透過 VPN 進入到 B 機器所在的國家網路
  • 這兩個國家的網路直連很慢,恰好 C 機器所在的國家,對這兩國連線都不錯

很繞口,但事實就擺在眼前 XD 這時候在 B 機器已經架好 VPN 服務了,從 A 也能夠連到,但是速度表現不佳,所以想要繞道從 C 機器所在的國家進去。

這時 C 機器就只需做 port forwarding 來處理即可,共有 UDP 500, 1701, 450 port 要處理:

$ iptables -A PREROUTING -t nat -i eth0 -p udp --dport 500 -j DNAT --to B_SERVER_IP:500
$ iptables -A PREROUTING -t nat -i eth0 -p udp --dport 4500 -j DNAT --to B_SERVER_IP:4500
$ iptables -A PREROUTING -t nat -i eth0 -p udp --dport 1701 -j DNAT --to B_SERVER_IP:1701
$ iptables -A FORWARD -p udp -d B_SERVER_IP --dport 500 -j ACCEPT
$ iptables -A FORWARD -p udp -d B_SERVER_IP --dport 4500 -j ACCEPT
$ iptables -A FORWARD -p udp -d B_SERVER_IP --dport 1701 -j ACCEPT

2014年1月28日 星期二

[Linux] 架設 VPN Server (PPTP/IPSEC/L2TP) @ Ubuntu 12.04

研究上需要架設一台 VPN,於是架了 PPTP 後,也順便把 IPSEC、L2TP 補齊。流程:

安裝需要的軟體:

$ sudo apt-get install pptpd openswan xl2tpd ppp

PPTP:

$ sudo vim /etc/pptpd.conf
# (Recommended)
localip 192.168.0.1
remoteip 192.168.0.234-238,192.168.0.245

$ sudo vim /etc/ppp/pptpd-options
# …
ms-dns 8.8.8.8
# …
logfile /var/log/pptpd.log

$ sudo touch /var/log/pptpd.log

$ sudo vim /etc/ppp/chap-secrets
# PPTP
username pptpd password *
# L2TP
username l2tpd password *

其中 username, password 都是明碼


IPSEC/L2TP:

$ sudo su
$ echo "net.ipv4.ip_forward = 1" | tee -a /etc/sysctl.conf
$ echo "net.ipv4.conf.all.accept_redirects = 0" | tee -a /etc/sysctl.conf
$ echo "net.ipv4.conf.all.send_redirects = 0" | tee -a /etc/sysctl.conf
$ for vpn in /proc/sys/net/ipv4/conf/*; do echo 0 > $vpn/accept_redirects; echo 0 > $vpn/send_redirects; done
$ sysctl -p


$ sudo vim /etc/rc.local
for vpn in /proc/sys/net/ipv4/conf/*; do echo 0 > $vpn/accept_redirects; echo 0 > $vpn/send_redirects; done
iptables --table nat --append POSTROUTING --jump MASQUERADE


$ sudo vim /etc/ipsec.conf
conn L2TP-PSK-NAT
    rightsubnet=vhost:%priv
    also=L2TP-PSK-noNAT

conn L2TP-PSK-noNAT
    authby=secret
    pfs=no
    auto=add
    keyingtries=3
    rekey=no
    ikelifetime=8h
    keylife=1h
    type=transport
    left=SERVER_IP
    leftprotoport=17/1701
    right=%any
    rightprotoport=17/%any


$ sudo vim /etc/ipsec.secrets
SERVER_IP  %any:  PSK "L2TP_PRIVATE_KEY"


$ sudo vim /etc/xl2tpd/xl2tpd.conf
[global]
ipsec saref = yes

[lns default]
ip range = 10.1.2.2-10.1.2.255
local ip = 10.1.2.1
;require chap = yes
refuse chap = yes
refuse pap = yes
require authentication = yes
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes


$ sudo vim /etc/ppp/options.xl2tpd
require-mschap-v2
ms-dns 8.8.8.8
asyncmap 0
auth
crtscts
lock
hide-password
modem
debug
name l2tpd
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4


重啟相關服務:

$ sudo service pptpd restart
Restarting PPTP:
Stopping PPTP: pptpd.
Starting PPTP Daemon: pptpd.

$ sudo service ipsec restart
ipsec_setup: Stopping Openswan IPsec...
ipsec_setup: Starting Openswan IPsec 2.6.37...
ipsec_setup: No KLIPS support found while requested, desperately falling back to netkey
ipsec_setup: NETKEY support found. Use protostack=netkey in /etc/ipsec.conf to avoid attempts to use KLIPS. Attempting to continue with NETKEY

$ sudo service xl2tpd restart
Restarting xl2tpd: xl2tpd.


服務驗證:

$ sudo ipsec verify
Checking your system to see if IPsec got installed and started correctly:
Version check and ipsec on-path                                 [OK]
Linux Openswan U2.6.37/K3.2.0-58-generic (netkey)
Checking for IPsec support in kernel                            [OK]
 SAref kernel support                                           [N/A]
 NETKEY:  Testing XFRM related proc values                      [OK]
        [OK]
        [OK]
Checking that pluto is running                                  [OK]
 Pluto listening for IKE on udp 500                             [OK]
 Pluto listening for NAT-T on udp 4500                          [OK]
Two or more interfaces found, checking IP forwarding            [OK]
Checking NAT and MASQUERADEing                                  [OK]
Checking for 'ip' command                                       [OK]
Checking /bin/sh is not /bin/dash                               [WARNING]
Checking for 'iptables' command                                 [OK]
Opportunistic Encryption Support                                [DISABLED]