Page List

Search on the blog

ラベル ネットワーク の投稿を表示しています。 すべての投稿を表示
ラベル ネットワーク の投稿を表示しています。 すべての投稿を表示

2018年4月7日土曜日

GCP上に無料でプロキシーサーバを立てる

 GCPの無料枠が余っていたので、プロキシーサーバを立てて遊んでみた。

1. VMインスタンスを作る
- VMの名前はsquidとしておく
- ゾーンはus-east1-bにしておく

2. 作成したVMにログイン
- gcloud compute ssh squid --zone=us-east1-b

3. squidをインストール
- sudo yum install -y squid

4. 設定ファイルを変更
- sudo diff -u /etc/squid/squid.conf.default /etc/squid/squid.conf

--- /etc/squid/squid.conf.default
+++ /etc/squid/squid.conf
@@ -10,6 +10,7 @@
 acl localnet src fc00::/7       # RFC 4193 local private network range
 acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines
+acl myhome src xxx.xxx.xxx.xxx  # my home IP

 acl SSL_ports port 443
 acl Safe_ports port 80  # http
@@ -51,6 +52,7 @@
 # from where browsing should be allowed
 http_access allow localnet
 http_access allow localhost
+http_access allow myhome

 # And finally deny all other access to this proxy
 http_access deny all
@@ -71,3 +73,14 @@
 refresh_pattern ^gopher: 1440 0% 1440
 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
 refresh_pattern .  0 20% 4320
+
+# prevent squid from being detected
+forwarded_for off
+request_header_access Referer deny all
+request_header_access X-Forwarded-For deny all
+request_header_access Via deny all
+request_header_access Cache-Control deny all
+
+# hostname
+visible_hostname squid
+

5. squidを起動
- sudo systemctl start squid

6. firewallの設定
- tcp:3128を開けておく

7. ブラウザ(chrome on Mac)の設定
- 設定 >詳細設定 >プロキシ設定を開く >Webプロキシ(HTTP)
- squidサーバのパブリックIP、ポート(3128)を入力

8. アクセス確認
- ブラウザから適当なサイトにアクセス
- squidのログ確認
- sudo tail -f /var/log/squid/access.log


2017年10月31日火曜日

L2接続とL3接続の違い

Ciscoのページがとても分かりやすかった。

違いを表にまとめておく。
レイヤー OSIモデル アドレス 通信単位 接続対象
L2 データリンク層 MACアドレス フレーム LAN内の端末
L3 ネットワーク層 IPアドレス パケット LAN同士

2014年2月24日月曜日

telnetでポート接続を確認する


  telnetって遠隔操作のためのプロトコルだと思ってたけど、TCPポートの接続テストにも使えるみたいです。
 そういえば、昔telnetでHTTPサーバーに接続して「おーこれがステータスコードかー。」って確認して遊んだことがありました。コマンドラインから入力した文字をソケットの入力ストリームにそのまま入力して、ソケットからの出力をコマンドラインにそのまま出力してくれてるような感じだったので、echoサーバーを作って確認してみました。

 まずechoサーバー。今回の用途には特に不要ですが、練習のためマルチスレッド版を書きました。
package com.kenjih.echo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class EchoServer {

    private static class EchoProcessor extends Thread {
        private Socket socket = null;

        private EchoProcessor(Socket socket) {
            super(EchoProcessor.class.toString());
            this.socket = socket;
        }

        @Override
        public void run() {
            try {
                BufferedReader in = new BufferedReader(new InputStreamReader(
                        socket.getInputStream()));
                PrintWriter out = new PrintWriter(socket.getOutputStream(),
                        true);

                String line = null;
                while ((line = in.readLine()) != null) {
                    out.println(line);
                }

                System.out.printf("connection closed %s:%d\n",
                        socket.getInetAddress(), socket.getPort());
                socket.close();

            } catch (IOException e) {
                System.err.printf("error occurred in socket %s:%d\n",
                        socket.getInetAddress(), socket.getPort());
            }
        }
    }

    public static void main(String[] args) {
        if (args.length != 1 || !args[0].matches("^[0-9]+$")) {
            System.err.println("usege: java EchoServer <port number>");
            System.exit(1);
        }

        int port = Integer.valueOf(args[0]);
        boolean listening = true;

        try {
            ServerSocket serverSocket = new ServerSocket(port);
            while (listening) {
                Socket socket = serverSocket.accept();
                System.out.printf("connection opened %s:%d\n",
                        socket.getInetAddress(), socket.getPort());
                new EchoProcessor(socket).start();
            }
        } catch (IOException e) {
            System.err.println("Could not listen on port " + port);
        }
    }
}
でサーバーを起動。
$ java -cp bin com.kenjih.echo.EchoServer 12345

で別のコマンドラインからtelnet接続。ポイントはポート番号を指定しているところです。
$ telnet localhost 12345
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
hogehoge
hogehoge
fugafuga
fugafuga
おー、なるほど。これは便利ですね。telnetはサーバーを書いた時のデバッグツールとして使えそうです。

2014年2月23日日曜日

マルチキャストアドレスとは?

 マルチキャストアドレスが何なのか概念だけは知っていましたが、今日はじめてマルチキャストアドレスを使ってプログラムを書きました。

 UDPを使って、サーバーから230.0.0.1というグループに属するクライアントすべてにデータグラムを送信するというものです。

Broadcasting to Multiple Recipients

 最初見たときこの230.0.0.1というアドレスが何なのか分からなかったので調べてみました。

The multicast addresses are in the range 224.0.0.0 through 239.255.255.255.
ということらしいです[1]。

さらに、
The range of addresses between 224.0.0.0 and 224.0.0.255, inclusive,is reserved for the use of routing protocols and other low-leveltopology discovery or maintenance protocols, such as gateway discoveryand group membership reporting.

とある[1]ので、アプリケーションで自由に使えるマルチキャストアドレスは224.0.1.0 - 239.255.255.255ということだと思います。
と思いましたが、他にも予約されているアドレスがある[2]ようなので230.x.x.xあたりを使っておくと無難かなと思います。

ちなみに二進数で表記するとマルチキャストアドレスは以下のようになります。

1110xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx   (xは任意)

Javaの場合、マルチキャストアドレスではないアドレスにジョインしようとすると以下の例外が出ました。
Exception in thread "main" java.net.SocketException: Not a multicast address
at java.net.MulticastSocket.joinGroup(MulticastSocket.java:306)
at com.kenjih.udp.MulticastClient.main(MulticastClient.java:12)


References
[1] IPv4 Multicast Address Space Registry
[2] Multicast address - Wikipedia, the free encyclopedia