jnetpcap 라이브러리로 직접 ip주소에 연결방법 문의..(자바)

dnjswns2942의 이미지

안녕하세요 자바로 jnetpcap 라이브러리를 써서 패킷받아 pcap파일 형태로 저장하는 프로그램을 짜보고 있습니다.
몇일전 특정 router(주소:192.168.0.1)에 ap탐지 할 수 있는 kismet을 실행시킨후

Socket server = new Socket("192.168.0.1", 2502);
소켓 명령어로 패킷을 받는 것 까지 하였습니다.
그후에 pcap파일 형태로 저장하는데 막히는 부분이 많아 질문을 올렸구 jnetpcap 으로 가능 하다구 해서 다시 시도 하였습니다.

jnetpcap으로 파일덤프 하여 pcap파일로 저장까지 성공 하였습니다.
http://jnetpcap.com/examples/dumper <-이 예제 프로그램을 약간 수정하여 성공.

jnetpcap 라이브러리는 보통 어느 패킷을 받을때 랜카드장치를 탐지하여 패킷을 받더라구요.
int r = Pcap.findAllDevs(alldevs, errbuf);

int snaplen = 64 * 1024; // Capture all packets, no trucation
int flags = Pcap.MODE_PROMISCUOUS; // capture all packets
int timeout = 10 * 1000; // 10 seconds in millis
Pcap pcap = Pcap.openLive(device.getName(), snaplen, flags, timeout, errbuf);
if (pcap == null) {
System.err.printf("Error while opening device for capture: %s\n",
errbuf.toString());
return;
}

랜카드 장치 인식으로 패킷을 읽지 않고, 컴퓨터와 연결된 router(192.168.0.1:2502)로 접근하여 router의 패킷 정보를 직접
받아오고 싶습니다.
Socket server = new Socket("192.168.0.1", 2502);

아시는 부분이 있으면 조언 부탁 드립니다^^

gilgil의 이미지

socket programming을 하고 싶다는 건가요, 아니면 pcap programming을 하고 싶다는 건가요?

dnjswns2942의 이미지

소켓 프로그램으로 소켓을 받고 pcap파일 형태로 저장을 하고 싶어서 jnetpcap 라이브러리를 사용하려고 한것 입니다^^

어찌보면 소켓프로그램 + jnetpcap라이브러리로 저장 입니다..

답변 달아주셔서 감사합니다^^

chanik의 이미지

> 랜카드 장치 인식으로 패킷을 읽지 않고, 컴퓨터와 연결된 router(192.168.0.1:2502)로 접근하여
> router의 패킷 정보를 직접 받아오고 싶습니다.
> Socket server = new Socket("192.168.0.1", 2502);

kismet에 대해 좀 살펴보니, 단순히 Wi-Fi 캡처만 해주는 것이 아니고 drone <-> server <-> client 식의 독특한 구조를 가지고 있더군요. 대략 아래와 같은 구조로 동작하는 것 같습니다.

  1. kismet_drone :
    • 캡처기능과 패킷전달기능만 가지고 있음
    • TCP 2502 포트를 리스닝하며, 해당포트로 접속한 kismet-server에게 캡처된 패킷 전달 가능
  2. kismet_server :
    • 캡처/패킷전달/패킷저장/분석 기능 등을 가지고 있음
    • 패킷저장시 .pcap 포맷으로 저장 가능
    • drone으로부터 패킷을 가져올 수 있음 (캡처소스를 지정할때, ncsource=drone:host=192.168.0.1,port=2502 식으로 drone을 가리키면 되는듯)
    • 덤으로, drone의 역할도 수행할 수 있음. 이 때는 패킷전달을 위해 TCP 3501 포트를 리스닝함.
    • TCP 2501 포트를 리스닝하며 kismet_client의 접속을 받아줌.
  3. kismet_client : 아마 server 모니터링 및 제어, server의 분석결과 열람 기능을 하는 듯

캡처와 패킷저장에 직접 관련된 것은 볼드체로 표시한 drone과 server인데, 지금의 상태는 router에 설치된 drone이 캡처를 하는 중이고, 캡처된 패킷을 192.168.0.1:2502 포트를 리스닝하며 전달해주고 있는 것 같네요.

이런 구성이라면, jnetpcap/pcap 라이브러리로는 지금 원하시는 형태의 원거리캡처는 불가능합니다.

가장 간단한 해결방법은 kismet_server의 패킷저장기능을 이용해 drone에 접속해서 패킷을 받아 저장하는 것인데, kismet_server.conf에 ncsource=drone:host=192.168.0.1,port=2502 식으로 캡처소스를 지정하면 되는 것 같습니다.

끝으로, 지금 시도하시는 Socket server = new Socket("192.168.0.1", 2502); 식의 접근방식은 drone과 server간의 패킷전달 프로토콜을 직접 처리하겠다는 뜻이 되겠습니다. 이전 질문(http://kldp.org/node/140667)에서 패킷길이를 알아낼 방법을 궁금해하신 것은 해당 프로토콜에 대해 아직 파악이 덜 되었기 때문일 겁니다. kismet 사이트에 이 프로토콜에 대한 문서가 있으면 다행이고, 아니면 kismet 소스를 봐가며 파악하는 방법 뿐이겠죠.

당장은 kismet_server를 이용하는 저장방식을 권하고 싶습니다.

dnjswns2942의 이미지

안녕하세요. 키스멧 프로그램 까지 하루만에 파악하시다니.. KLDP에 고수분들이 진짜 만으세요.ㅎ(저는 몇일 걸렸다능..ㅠ)
말씀 하신대로 정확하게 보셨습니다.
kismet은 크게 3가지 형태로

kismet-drone
-특정라우터에 kismet-drone을 설치하고 wlan을 모니터 모드 하면 주변의 ap탐지가 가능.

kismet-server
-ncsource=drone:host=192.168.0.1,port=2502 에서 적용하면 drone으로 부터 패킷(주변ap정보)을 전달 받아 .pcap파일 형태로 저장가능.

kismet-client
-kismet-server 의 전달 받는 패킷을 간단한 GUI형태로 볼 수 있음.

위의 3개의 kismet 프로그램은 local영역에서 패킷을 받고 저장및 제어가 가능 합니다.
kismet_server 실행을 하게되면 drone으로부터 받은 패킷을 .pcap파일로 저장이 가능한데

kismet-drone < - > kismet_server 1:1조건은 상관이 없는데

kismet-drone(192.168.0.1:2502), kismet-drone(192.168.10.1:2503), < - > kismet_server

2개의 drone에서 ap정보를 뿌려주고 한개의 kismet_server 에서 받아 보니 정보는 받고 있지만 2502포트가 어느 패킷을 주는지 2503포트가 어느 패킷을 주는지 kismet_server 에서는 구분이 안되서 통신 프로그램을 짜게 된것 입니다.

제가 생각한것은 포트번호를 보고 각각의 .pcap파일 저장방법 입니다.
2502포트번호에서 받는 패킷의 2502.pcap
2503포트번호에서 받는 패킷의 2503.pcap

--질문--
jnetpcap/pcap 라이브러리로는 지금 원하시는 형태의 원거리캡처는 불가능합니다 <-이 부분에서
원거리캡처라면 무선패킷(802.11abgn)을 말씀하시는 건가요?
http://jnetpcap.com/examples/dumper <-예제로 802.11 프로토콜 탐지를 해보니 탐지가 되네용~

-제가 잘못 말한점-
랜카드 장치 인식으로 패킷을 읽지 않고, 컴퓨터와 연결된 router(192.168.0.1:2502)로 접근하여 router의 패킷 정보를 직접
받아오고 싶습니다. <-- 이부분은 제가 잘못 이해 하고 말하였네요.

라우터와 컴퓨터 연결시 무선이 아닌 랜선으로 연결 되어있습니다.
랜선은 당연히 컴퓨터의 랜카드에 꼽혀 있구용.
그래서 위의 예제에서 랜카드로 디바이스를 잡고 패킷을 캡처 해보았습니다.

PcapIf device = alldevs.get(0);

-----랜카드 덤프결과----
랜카드 인식 으로 덤프를 해보았는데 그냥 tcp/ip 패킷만 덤프하더라구용.

소켓을 고정으로 192.168.0.1:2502 연결 시켜줘야 라우터에서 받는 ap정보를 Jnetpcap예제로 만든 소스에 적용될것 같습니다.

--------궁금한점-------

Socket server = new Socket("192.168.0.1", 2502); 라우터 ap정보 패킷을 직접 받고
저장 할때는 pcap구조에 대해서 잘모르기 때문에 jnetpcap <-의 덤프 예제를 적용하여 저장을 하려고 하였습니다.
제가 생각한것이 잘못 된건지 궁금합니다.
만약 안된다고 한다면 답변자분께서 말씀하신대로 kismet소스를 봐가면서 파악 하고 적용해야 하기 때문 입니다.
저때문에 kismet 프로그램까지 봐주시면서 답변 해주셔서 너무 감사합니다.
저도 쑥쑥커서 위 사이트에 도움이 되도록 열심히 하겠습니다.^^

chanik의 이미지

> --질문--
> jnetpcap/pcap 라이브러리로는 지금 원하시는 형태의 원거리캡처는 불가능합니다 <-이 부분에서
> 원거리캡처라면 무선패킷(802.11abgn)을 말씀하시는 건가요?
> http://jnetpcap.com/examples/dumper <-예제로 802.11 프로토콜 탐지를 해보니 탐지가 되네용~

제가 원거리캡처라고 임의로 부른 것은, kismet_server가 원거리의 drone을 캡처소스로 쓰는 경우입니다. 실험해보신대로 pcap 라이브러리로도 로컬 Wi-Fi 캡처는 가능하지만 drone과의 연계캡처는 안 되니까 원거리캡처는 불가능하다는 식으로 표현한 것입니다.

> --------궁금한점-------
> Socket server = new Socket("192.168.0.1", 2502); 라우터 ap정보 패킷을 직접 받고
> 저장 할때는 pcap구조에 대해서 잘모르기 때문에 jnetpcap <-의 덤프 예제를 적용하여 저장을 하려고 하였습니다.

아래와 같은 구성을 가정해 보겠습니다.

[ (wlan0) 라우터 (eth0: 192.168.0.1:2502) ] <------> [ (eth0: 192.168.0.x) 리눅스PC ]

지금 하시려는 것은 drone에 으해 라우터:wlan0에서 캡처된 패킷('원본패킷'이라 부르겠습니다)들을 라우터:eth0 으로부터 리눅스PC:eth0 으로 TCP 소켓을 통해 중계받는 것이죠. 리눅스PC에서는 kismet_server 대신 직접 코딩하시는 java 클라이언트를 쓰실 것이고요.

그런데 jnetpcap으로 리눅스PC:eth0 을 캡처하면, '원본패킷'들이 리눅스PC:eth0을 통해 하나씩 투명하게 넘어오는 것처럼 보이는 것이 아니고, 그 패킷들을 TCP를 통해 중계하는 스트림의 패킷들이 보이게 됩니다. '원본패킷'을 중계하려면 패킷몸통 뿐아니라 패킷크기, 캡처시각같은 메타정보도 함께 보내야 할 것입니다. 그런 작업을 위해 간단한 프로토콜을 정의해 두었을 것이고요.

정리해보면, jnetpcap으로 얻을 수 있는 것은 '원본패킷'들이 아니고 그것들을 중계하기 위해 kismet에서 설계한 중계프로토콜이 오가는 TCP 스트림 패킷들입니다. 결국 jnetpcap을 쓰면 상황이 복잡해지므로, 원래 하시려던 소켓프로그래밍을 해야 하는 것이고, 중계 프로토콜도 알아내야 한다는 것이죠.

그런데 제 생각에는, 이정도로 역할분담이 되어 있는 캡처시스템이라면, 하나의 server가 복수개의 drone으로부터 패킷을 끌어올때 각 drone 별로 따로 저장할 수 있는 방법도 만들어뒀을것 같습니다. kismet.conf 설정을 잘 궁리하면 되지 않을까 싶은데요. 우선 그 방향을 먼저 검토해보시고 도저히 안 되면 프로토콜 파악에 들어가시는 것이 순서같습니다.

dnjswns2942의 이미지

아래의 사이트는 kismet 간단한 사용법 입니다.
http://www.kismetwireless.net/documentation.shtml

By default Kismet will log the pcap file, gps log, alerts, and network
log in XML and plaintext.

By default, Kismet will try to log to pcapfiles using the PPI per-packet
header. The PPI header is a well-documented header supported by
Wireshark and other tools, which can contain spectrum data, radio data
such as signal and noise levels, and GPS data.

PPI is only available with recent libpcap versions. When it is not
available, Kismet will fall back to standard 802.11 format with no extra
headers.

The pcap logging format is controlled by:
pcapdumpformat=ppi
or
pcapdumpformat=80211

프로토콜의 구조는 기본 ppi 를 잡고 있으며 80211로도 변형이 가능합니다.
아마 중계프로토콜은 기본 구조인 ppi가 될것 같습니다.

저도 답변자님 처럼 drone별로 따로 저장할 수 있는 방법도 만들었을것 이라 생각해서 kismet 운영자분께 메일을 보낸 내용입니다.
https://www.kismetwireless.net/Forum/General/Messages/1382593250.229284

결국은 jnetpcap라이브러리는 사용 못하고,
소켓프로그래밍을 짜는데
http://blog.naver.com/hazycode?Redirect=Log&logNo=50128419256
형식에 맞게 짜야 겠네요.. 패킷을 담는것 까진 가능했는데
위의 블로그 형식에 맞춰 짜려니 잘 안되더라구요..ㅠ_ㅠ

혹시 위의 pcap파일 만드는 예제(자바로구현) 알고 계신부분이 있으면 소개 부탁드립니다.

그리고 지금까지의 질문으로도 많은 도움이 되고 많이 배웠네요^^
답변 감사드립니다^^

chanik의 이미지

샛길 돌고 돌아서 다시 첫 질문하셨을 때로 돌아온 셈이네요.

제가 kismet을 모르다보니 상황에 맞지 않는 방향으로 오도하기도 한 것 같고, 딱히 돕는다기보다는 오히려 질문하신분이 해오신 과정을 따라가며 제가 많이 배운것 같습니다. 어쨌든, 이미 kismet 관련인의 답변까지 확인하셨으니 방향은 정해졌군요.

이제부터는 경험이 실린 답변을 달아야하는 것 같고 저는 pcap 프로그래밍과 java 모두 실전경험이 없어서 댓글 적기가 좀 망설여집니다만, 그냥 과감히 적겠습니다.

[1] jnetpcap의 패킷저장기능만 쓰는 샘플

http://jnetpcap.com/examples/dumper 샘플은 대략 아래와 같은 모양인데,

    Pcap.findAllDevs(...);
    Pcap pcap = Pcap.openLive(...);
    PcapDumper dumper = pcap.dumpOpen(ofile); // output file  
 
    PcapHandler<PcapDumper> dumpHandler = new PcapHandler<PcapDumper>() {  
      public void nextPacket(PcapDumper dumper, long seconds, int useconds,  
        int caplen, int len, ByteBuffer buffer) {  
 
        dumper.dump(seconds, useconds, caplen, len, buffer);  
      }  
    };  
 
    pcap.loop(10, dumpHandler, dumper);  

패킷저장기능만 쓸때는 Pcap.findAllDevs(...);는 필요없겠고, 아래와 같이 Pcap.openLive(...) 대신 Pcap.openDead(...)를 호출하고 바로 dumper.dump()를 반복하는 식으로 단순화하면, jnetpcap에서 캡처기능 제외하고 .pcap 파일 저장기능만 쓰는 셈이 되는 것 같습니다. 찾아보니 PcapDumperExampleUsingOpenDead.java이라는 샘플도 있군요.

    Pcap pcap = Pcap.openDead(...);
    PcapDumper dumper = pcap.dumpOpen(ofile); // output file  
 
    while( ... )
        dumper.dump(seconds, useconds, caplen, len, buffer);



[2] 참고: rpcapd: libpcap/WinPcap 상에서 원격캡처

이하의 내용은 해보시라는 뜻은 아니고, 알아둘만한 내용이기는 한 것 같아 적어두는 것입니다.

jnetpcap의 근간이 되는 libpcap/WinPcap 캡처라이브러리에도 원거리캡처 기능이 있더군요. WinPcap에서 만든 rpcapd라는 데몬 프로그램이 그 일을 해 주는 것 같은데요.

한 예로, Wireshark을 설치하면 pcap 라이브러리도 함께 설치되는데 Windows 버전에는 WinPcap이 따라오고 Linux/Unix 용에는 libpcap이 따라오게 됩니다. 이중 Windows 버전에 따라오는 WinPcap에서는 rpcapd가 번들로 설치되고 "Remote Packet Capture Protocol v.0 (experimental)"라는 이름으로 서비스도 등록됩니다. 이 서비스를 시작시키면 2002 포트를 통해 외부로부터의 접속을 받아주게 됩니다.

이 상태에서 다른 PC에 설치된 Wireshark에서 캡처소스를 고를때 rpcapd가 동작중인 PC의 IP를 주고 Remote interface를 고르면 되는 식입니다. rpcapd는 자신이 동작중인 PC의 모든 NIC 목록을 다른 PC의 클라이언트에게 전송해주고 캡처대상 NIC에 대한 선택권은 그 클라이언트에게 준다는 점이 kismet과의 큰 차이입니다. 클라이언트는 하나 또는 복수개의 NIC를 선택해서 캡처할 수 있습니다.

아래 페이지의 안내대로 해보니 잘 되네요. 구버전의 스크린샷이라서 지금의 Wireshark과는 모양이 조금 다르지만 대략 따라해보기에는 충분합니다.

http://blog.michaelfmcnamara.com/2010/09/remote-packet-capture-with-wireshark-and-winpcap/





주의: 여기서부터는 직접 해보며 확인한 것은 아닙니다.

rpcapd는 libpcap이 아닌 WinPcap에서 만든 것이라서 Linux/Unix에 Wireshark 설치할 때는 기본설치되지 않지만, WinPcap 소스를 가져다 rpcapd를 빌드하면 libpcap위에서도 동작하는 모양입니다. http://www.winpcap.org/docs/docs_40_2/html/group__remote.html 참조하면 될것같습니다.

rpcapd가 동작중인 linux PC가 근처에 있다면 아래와 같이 하면 원거리 캡처가 된다는군요. (dumpcap은 Wireshark 안에 포함된 콘솔프로그램인데 Windows/Linux용 모두에 들어있습니다. rpcapd를 상대하려면 Wireshark 자체도 최근버전을 쓰고 rpcapd 지원옵션을 켜서 빌드해야 하는 것이 아닌가 싶습니다)

$ dumpcap -w mydump.cap -i rpcap://192.168.0.1/eth0

Windows PC에서 동작중인 rpcapd를 상대할 때는 아래과 같은 식인 것 같고요.

$ dumpcap -w mydump.cap -i rpcap://192.168.0.1/\Device\NPF_{21E03ED5-DF15-4BA5-BEC0-22BBC44A8C23} -A username:password

"C:\Program Files\Wireshark\dumpcap" -n -i rpcap://[10.0.0.xxx]/\Device\NPF_{8ED1D2B6-2FB7-41F7-A211-75D29414FFFF} -f "not tcp port 3389" -A username:password -w C:\Sniff\sniff_log

dnjswns2942의 이미지


public class SenderThread extends Thread {
	Socket server = null;
	BufferedReader br = null;
	BufferedWriter bw = null;
	FileWriter fw = null;
	List<List<Byte>> list = new ArrayList<List<Byte>>();
	Connection conn = null;
	File someFile = null;
    FileOutputStream fos = null;
 
 
	public SenderThread(Socket soc, Connection conn) throws SocketException {
 
		Date today = new Date();
		System.out.println("현재시간 :"+today);
 
		server = soc;
		this.conn = conn;
		System.out.println("SenderThread :시작");
		try {
 
			br = new BufferedReader(new InputStreamReader(server.getInputStream(),"ISO-8859-1"));
			bw = new BufferedWriter(new OutputStreamWriter(server.getOutputStream()));
		} catch (IOException e) {
			e.printStackTrace();
		}
 
	}
 
 
	@Override
	public void run() {
 
			try {
 
			byte [] buff = new byte[4];
 
			List<Byte> myBytes = new ArrayList<Byte>();
 
 
 
			while(true) {
 
				byte tmp = (byte)br.read();
 
				myBytes.add(tmp);		
 
				final PcapHeader header = new PcapHeader(myBytes.size(), myBytes.size());
 
				final int dlt = PcapDLT.EN10MB.value;
				final int snaplen = 64 * 1024;
 
 
				if (Pcap.openDead(dlt, snaplen) == null) {
					System.err.printf("Error while dummy capture: " + Pcap.openDead(dlt, snaplen).getErr());
					return;
				}
 
				final String ofile = "c:/pxpxpx.pcap";
 
				final PcapDumper dumper = Pcap.openDead(dlt, snaplen).dumpOpen(ofile);
 
 
 
				final int COUNT = 10; // write 10 packets
 
				for (int i = 0; i < COUNT; i++) {
					dumper.dump(header, (ByteBuffer) myBytes);
				}
 
 
 
				final File file = new File(ofile);
				System.out.printf("%s file has %d bytes in it!\n", ofile, file.length());
 
				dumper.close(); 
				Pcap.openDead(dlt, snaplen).close();
 
				if (file.exists()) {
					 file.delete(); // Cleanup
				}
			}
 
		} catch (Exception e) {
			System.out.println(SenderThread.class.getSimpleName() + ":::"+e.toString());
		}
	}
 
 
	public byte[] getArray(List<Byte> bytesList) {
	    byte[] bytes = new byte[bytesList.size()];
	    for (int i = 0; i < bytesList.size(); i++) {
	      bytes[i] = bytesList.get(i);
	    }
 
	    return bytes;
	  }

안녕하세요 답변이 늦었습니다^^ 많은 도움을 받으며 현재는 자동으로 pcapheader 까지 자동으로 읽는것을 확인 하였습니다.
확인방법은 hxd 프로그램으로 확인 하였습니다.
그이후에 패킷헤더 그리고 데이터가 들어가야 할텐데 이 소스로는 안들어가지더 라구용,

final PcapHeader header = new PcapHeader(myBytes.size(), myBytes.size());

pcapheader를 정의 한것처럼 packet header를 적용해야 할것 같습니다.

도움 많이 받으며 여기 까지 온것두 신기 합니다^_^
내일 눈이 내리는 곳이 있다고 하는데 눈길 조심하세요^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.