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

2015年10月5日 星期一

Forward PPTP server packet from Pi

這個問題花了我不少時間去處理,原因居然是因為Rasbian使用的3.18 kernel將PPTP packet視為invalid packet。不過還好後來有找到解決方法,分享給各位。

ping: sendmsg: Operation not permitted
出現以上訊息時代表iptables沒設定好,可重設iptables
# Reset/Flush iptables
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
# Flush end
但須注意此時已經policy設為ACCEPT,為debug使用,記得結束後要將iptables -P 設回需要的policy

PPTP forward參考設定如下

#!/bin/sh
### BEGIN INIT INFO
# Provides:         firewall.sh
# Required-Start:   $all
# Required-Stop:
# Default-Start:    2 3 4 5
# Default-Stop:     0 1 6
### END INIT INFO

INTIF="你的對內介面,如brlan"

INTNET="對內介面的網段"

INTIP="PPTP server的IP"

EXTIF="對外介面,如為撥接通常為ppp0"

#Loading required stateful/NAT kernel modules...

/sbin/depmod -a
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_conntrack_irc
/sbin/modprobe iptable_nat
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_nat_irc

#below has to be loaded for pptp
/sbin/modprobe nf_nat_pptp 
/sbin/modprobe nf_conntrack_pptp 
/sbin/modprobe nf_conntrack_proto_gre 
#就是上面這三個kernel需要load,否則再怎麼設都是枉然

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

UNIVERSE="0.0.0.0/0"

iptables -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT

iptables -A FORWARD -i $EXTIF -o $INTIF -d $INTIP -j ACCEPT

# Enable SNAT (MASQUERADE) functionality on $EXTIF
iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE

#DMZ setting
iptables -t nat -A PREROUTING -i $EXTIF -p tcp -m multiport --dport 1:65535 -j DNAT --to $INTIP
iptables -t nat -A PREROUTING -i $EXTIF -p udp -m multiport --dport 1:65535 -j DNAT --to $INTIP

# PPTP PREROUTING GRE packets
iptables -t nat -A PREROUTING -i $EXTIF -p 47 -j DNAT --to $INTIP
iptables -A FORWARD -i $EXTIF -p 47 -j ACCEPT

如果不是使用DMZ的話可將DMZ setting改成--dport 1723只轉port 1723到PPTP server就好
另外如果是使用pfsense之類的firewall,INTIP為pfsense的WAN端




將script註冊為service
sudo update-rc.d <script undre /etc/init.d/> defaults
將service移除
sudo update-rc.d -f foobar remove
設定啟動相依性(如在某service啟動後啟動)
# Required-Start:    $local_fs $network
# Required-Stop:     $local_fs

2015/10/5更新
遇到一個問題是source ip被snat蓋掉。因為以前使用ddwrt時沒有遇到這個問題,因此研究了一下,發現是需要設-m state --state NEW在iptables裡對應PREROUTING的port。才能夠觸發output。否則單純用MASQUERADE是可以但是就變成snat會將source ip蓋掉變成內部ip,不是我要的。
因此上面#DMZ setting要多增加兩行
iptables -t nat -A INPUT -i $EXTIF -p udp -m state --state NEW -m multiport --dport 1:65535 -j ACCEPT
iptables -t nat -A INPUT -i $EXTIF -p tcp -m state --state NEW -m multiport --dport 1:65535 -j ACCEPT

參考資料
register service
https://mkaz.github.io/2013/07/03/run-script-at-start-on-debian/
setting linux firewall
http://www.aboutdebian.com/firewall.htm
http://www.linuxjournal.com/article/3866
PPTP forward
http://ubuntuforums.org/showthread.php?t=801207
http://www.linuxquestions.org/questions/linux-networking-3/port-forward-gre-and-pptp-using-iptables-210334/
http://serverfault.com/questions/466030/pptp-iptables-routing-issue
https://wiki.archlinux.org/index.php/PPTP_server#iptables_firewall_configuration
https://lists.debian.org/debian-firewall/2004/04/msg00103.html
http://wiki.linuxmce.org/index.php/PPTP_server
tcpdump PPTP packet
http://serverfault.com/questions/342604/how-to-sniff-request-packet-on-vpn-server
DMZ, nat preserve source ip
https://www.debian-administration.org/article/73/Port_forwarding_for_iptables_DMZ


2011年11月26日 星期六

vpn

最近幾天自己架了一個openvpn server。然後在筆電上裝了openvpn client,最後在sensation上也裝了openvpn。因為過程實在有些複雜,po上來備忘兼給其他人參考。

首先openvpn server的部份,由於我的目標是讓外部網路可以透過vpn peer到我家內部網路,所以我是走tap而非tun。這部份主要是先安裝openvpn for windows然後bridge虛擬網卡與區域網路。openvpn server config部份要注意的是

proto udp

dev tap
dev-node tap-bridge

server-bridge 192.168.1.52 255.255.255.0 192.168.1.60 192.168.1.254

push "route 10.66.77.0 255.255.255.0"

# If enabled, this directive will configure
# all clients to redirect their default
# network gateway through the VPN, causing
# all IP traffic such as web browsing and
# and DNS lookups to go through the VPN
# (The OpenVPN server machine may need to NAT
# or bridge the TUN/TAP interface to the internet
# in order for this to work properly).
;push "redirect-gateway def1 bypass-dhcp" 這邊好像是設定讓client端連外是server端ip的樣子

client-to-client

duplicate-cn

接著client部份


dev tap

proto udp

ca ca.crt
cert client1.crt
key client1.key

其他部份幾乎都是預設值,但是同樣的設定到阿璇那邊就變成不通,不知道為何。另外因為有開BT的關係中間有出現連不上,後來才查明是因為BT流量開太大所以導致vpn client連不進來。

所以後來使用xp vpn server之方法PPTP讓阿璇可以連進來。但xp vpn server只能允許同時一個使用者連入的樣子。設定方法

新增連線,序列埠,不選擇,允許私人連線及工作連線。最後設定分配的ip區段。但是阿璇說會無法上網,這點還要再測試。

最後是最麻煩的android openvpn設定。

首先sensation自己就有vpn設定,也是走PPTP,但是一開始設定好卻始終連不上,以為是server端問題但又不像。最後查到原來是3g會擋vpn PPTP,也難怪我使用筆電連手機上網要用xp vpn PPTP撥回來始終連不上。有看到有人說明可以走L2TP(xp要另外裝東西才能支援),不過最後決定用openvpn。

先在market上下載openvpn installer跟openvpn setting。要安裝openvpn之前要先安裝busybox。這邊要注意的是如果是用原廠的ROM則market上下載的busybox installer並不會去更改你的/system/bin/route & ifconfig。所以必須要手動去link busybox與route & ifconfig。

可用terminal終端機鍵入

ln -s /system/xbin/busybox /system/xbin/bb/route
ln -s /system/xbin/busybox /system/xbin/bb/ifconfig

前半要換成你busybox安裝的位置。

接下來就是tun.ko的部份,也是我花最久時間處理的部份。由於tun.ko必須配合你的kernel。所以我找了許久,最後甚至自己compile一個但是還是無法使用。最後是刷了PYR_UNITY_V13_OC1512_CIFS_TUN_NOOP_2WCR_VDD.zip這個kernel才解決。

compile的方法是先下載android-ndk-r4-linux-x86.zip,Pyramid_LE_CRC-2.6.35-877c198.tar.gz,另android-sdk因為只是用來取出手機內的/proc/config.gz所以我就沒下載
我是用vitualbox安裝utunbu在linux下操作,先將上面兩個及config.gz解壓縮並令裡面的CONFIG_TUN=m。接著改Pyramid_LE_CRC-2.6.35-877c198.tar.gz裡的MakefileEXTRAVERSION = 為你的kernel最後小數點後面的字串)。最後設定變數

export ARCH=arm
export CROSS_COMPILE=arm-eabi-
export PATH=$PATH:~/android/android-ndk-r4/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/

cdPyramid_LE_CRC-2.6.35-877c198目錄下並下指令make modules,則可在Pyramid_LE_CRC-2.6.35-877c198/driver/net下找到tun.ko

2012/3/23補充
後來有查詢到一些資料即iptable導致wifi與3G衝突可能引起連不上openvpn,此時可下指令ip ru del table gprs可解決。

2019/7/12 update
其實就是android不支援tap(因為需要root權限)


參考資料