Posts Tagged ‘linux’ Feed

一台Linux頂多個SOHO路由器 (iptables, iproute2, netfilter)

Saturday, October 18th, 2008 English

一台Linux代替一個SOHO路由器很容易,大致可以用6句command概括

dhclient3 … $WANIF # Get the IP on WAN side
ip addr add 192.168.0.0/24 broadcast + dev $LANIF # Get the IP on LAN side
dhcpd3 … $LANIF # Enable the DHCPD on LAN side
sys.net.ipv4.ip_forward = 1 # Enable forwarding
iptables -t nat -A POSTROUTING -o $WANIF -j MASQUERADE # Enable SNAT
dnsmasq # Enable DNS proxy

目的:一台Linux代替N個SOHO路由器。即是說一台能夠建立多個獨立NAT,大家都用看似同似同一樣但實際不一樣的私有IP網址地段。

始終1台用5個command不代表2台只需10個command,主要問題有七:

  1. WAN Interface要拿很多個WAN IP,但怎樣才可以有多個dhclient到很多IP?
  2. 怎樣MASQUERADE到不同的WAN IP……?
  3. 我想N個SOHO Router的LAN Interface都是192.168.0.0/24,就真的有如N個SOHO Router一樣,後面都是叫192.168.0.0/24,但實際此上192不同那192。若每個$LANIF[1..n]都是用192.168.0.0/24,傳統按Destination做Routing的Route Table會出問題,也就是說Kernel不知道192.168.0.0/24應從哪個Interface走的問題。
  4. 從LAN訪問Router機……?
  5. DMZ和Port Forwarding…?
  6. N NAT subnet互相通過大家的WAN Side IP做Connection也……?。
  7. Router機訪問Client Side……?

(more…)

架設Linux/Apache Single Sign On (Active Directory, mod_auth_kerb, Kerberos)

Tuesday, October 14th, 2008 English

目的:在Windows Domain(網域)內的Intranet(內聯網)使用者,用IE或Firefox瀏覽到這個架設在Linux/Apache的Website,無需再輸入密碼即可自動登入,達成SSO - Single Sign On。其中Linux需Join Domain並擁有該Domain下的Computer Account(電腦帳號)。

非目的:能用網域帳號登入Linux系統、認証之後的權限處理。

引言

若目標只是想認証網域內的Credential(一組使用者名稱和密碼),方法有很多。其中我先試過KB555092的就是其中一個方法,但這個基本上就是將Credential以Cleartext(純文字)傳過去,Web Server(網站伺服器)再直接拿著純文字版本向Domain Controller質問是否對的,如果用IE瀏覽過去,會清清楚楚看到相關警告,也不肯做SSO。對Client side(客戶端)來說,一來不安全,二來即使有SSL,也就是把密碼一乾二淨的拱手相讓給Web Server,所以KB555092實在沒有什麼用。我相如LDAP等也能做到相似效果。

KB555092當中關鍵是KrbMethodNegotiate是Off的,所以就不容許SSO的發生。但是並不是把它變成On就可以,後台還是有一大堆東西要幹的。

(more…)

萬里防火牆

Tuesday, March 6th, 2007

The Great Firewall可算是馳名中外的網絡一大建設,這就是一個覆蓋全中國大陸的超大型網絡防火牆,而防的,大概就是防止外國思想入侵中國大陸吧?

要攔截天文數字多的網絡流量也實不是一件容易的事,但在大陸政府的大力推動下,不少網絡設備廠商都研發了一系列的對應產品和解決方案,撈了一大筆生意。

結果就是,很多很管用的網站的被封了。蘋果日報那些報紙網站當然免問,連google.com有時候也會被強制導向到另一個無關係的中國大陸的搜尋器,wikipedia無緣登入也是預計之內。即使是沒有被擋的網站,當有時出現一些敏感字眼,也會有可能被檢測到而被用TCP RST臨時封鎖十多分鐘。

幸好香港家中有部server,問題就迎刃而解。

  1. 先用openvpn架起一個udp VPN tunnel,UDP的好處就是overhead低,也沒有多餘的congestion control,更不會被TCP RST掉。若果用TCP的話,那麼最後經VPN走的traffic就會變成TCP over IP over TCP over IP,也就是雙重congestion control。由於萬里防火牆是靠TCP RST來阻截連線,而不是一般防火場安插在連線中間,所以用UDP也應該能繞過萬里防火牆的限制。將香港的一方設定為server,大陸的一方設定為client。
    兩邊用的IP也是從private IP範圍中挑就是。以下假設我在server用的是192.168.100.1/24。
    # apt-get install openvpn
    之後再跟著online的HOWTO做就是,用IP mode而不是bridge mode。最後用ifconfig -a來看看,應該有一張tun0的interface,在client上看是這樣的
    tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
    inet addr:192.168.110.6 P-t-P:192.168.110.5 Mask:255.255.255.255
    UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
    RX packets:258555 errors:0 dropped:0 overruns:0 frame:0
    TX packets:395634 errors:0 dropped:14602 overruns:0 carrier:0
    collisions:0 txqueuelen:100
    RX bytes:93446120 (89.1 MiB) TX bytes:62463470 (59.5 MiB)
    沒有任何firewall的阻擋下,從server應該能夠順利ping到inet addr那個IP address,而client應能ping到192.168.110.1。
  2. 在兩邊都裝上ipmasq,一個簡快便捷的東西,用來幫你設定iptables的。# apt-get install ipmasq
  3. 在server和client上,將/etc/ipmasq/rules/A01precompute.def修改一下,重點是要令ipmasq取得VPN interface的正確的netmask。
  4. 另外在client上,把in-out的interface hardcode到/etc/ipmasq/rules/A01interface.rul。注意檔尾是.rul來蓋過.def的設定。INTERNAL=”eth1″
    EXTERNAL_OUT=”eth0 tun0″
    EXTERNAL_IN=$EXTERNAL_OUT這當然假設eth0是Internet connection的interface,eth1是LAN的interface,而tun0就是openvpn所建立的interface。
    Server的不用這樣做,因為tun0會自動認定成Internal interface。
  5. restart ipmasq,再看看兩面的iptables的nat部份。
    # /etc/init.d/ipmasq restart
    # iptables -vnL -t nat
    在server上

    Chain POSTROUTING (policy ACCEPT 9530 packets, 876K bytes)
    pkts bytes target prot opt in out source destination
    3188 153K MASQUERADE all — * eth0 192.168.100.0/24 0.0.0.0/0

    即代表192.168.100.0/24,我們的VPN,會被改寫成eth0的IP address,正合我意!而在client上

    Chain POSTROUTING (policy ACCEPT 14 packets, 749 bytes)
    pkts bytes target prot opt in out source destination
    32 2032 MASQUERADE all — * eth0 192.168.1.0/24 0.0.0.0/0
    2 96 MASQUERADE all — * tun0 192.168.1.0/24 0.0.0.0/0

    即代表192.168.1.0/24,我的eth1 LAN card的network address,當使用eth0和tun0上網時也會被改寫。很好。
  6. 說到這裏,現在只要將想繞做走的網站用192.168.100.1做gateway就完成了。例如我要看en.wikipedia.org (66.230.200.100) 的話
    route add -host 66.230.200.100 gw 192.168.100.1

這就解決了事情的一半。

還有TCP RST的臨時阻截要處理,否則一旦google的search result出現敏感字眼就可真麻煩。不過這個可以利用iptables和perl去輕鬆定。

  1. 先create一條新的ipmasq rule - P10gfw.rul重點是
    iptables -t mangle -I PREROUTING -i eth0 -p tcp –sport 80 –tcp-flags RST RST -j LOG –log-prefix GREAT_FIREWALL
    將所有port 80的TCP RST packet都log下來。
  2. 改一下/etc/syslog.conf,將部份的log射到一個FIFO的file。最主要是在任何一個地方加上這一句:
    kern.info |/var/log/gfw.fifo再手動製造一個FIFO file
    # mkfifo /var/log/gfw.fifo
    # chmod 600 /var/log/gfw.fifo
    當然就是restart sysklogd
    # /etc/init.d/sysklogd restart
  3. 放好對應接收FIFO訊息的perl script - /etc/ipmasq/gfw.pl,當中有點地方要customize
    在sub add_dst下有兩個blacklist了的IP address,分別改成Internet gateway和VPN server的IP address,免得他們被re-route到VPN channel去,不然你整個Internet connection也會出問題。
    gfw.pl會讀取從iptables到sysklogd到gfw.fifo來的GREAT_FIREWALL訊息,從而將被RST過的網站都re-route到VPN channel上。那麼當上網時遇上TCP RST的情況,gfw.pl就會把那個IP re-route到VPN上,再reload的時候也應該能順利通過。
  4. 另外開一個/etc/ipmasq/gfw.list的檔案,這是一個static re-route list,gfw.pl每5秒會看看 有沒有加減。我的list入面有:
    google.com
    www.google.com
    hk.google.com
    en.google.com
    wikipedia.org
    ja.wikipedia.org
    en.wikipedia.org
    www.wikipedia.org
    一些想指定繞路的網站也可以加進這個list裏。
  5. 最後執行/etc/init.d/gfw.pl,一切順利的話就可以放進init的順序中
    # cd /etc/rcS.d
    # ln -s ../init.d/gfw S80gfw
    最後手動啟動一下
    # /etc/init.d/gfw start
  6. 大功告成

最後就是,部份上述檔案我都tar-gizpped起來了。